www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCR-Meter - wie genau Werte bestimmen?


Autor: Exodus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo miteinander

Als stillschweigender mikrocontroller.net-Leser habe ich eine Frage und 
hoffe, mir kann jemand helfen.

Und zwar arbeite ich aktuell an einem LCR-Messgerät.
Kurz zum Aufbau:

L wird in der bekannten Schwingkreisbeschaltung mit dem LM311 eingesetzt 
- der Ausgang wird an RA4 des Mikrocontrollers gelegt, um die Impulse zu 
zählen (Frequenz).

C wird mit dem Baustein 74HC4046A bestimmt, auch hier wird RA4 als 
Zähleingang verwendet.

R wird über einen ADC (mit Spannungsteiler inkl. Bereichsumschaltung 
über zuschaltbaren Widerstand) gemessen.

Insgesamt bereitet mir die Messung der Induktivität die meisten 
Schwierigkeiten.

Wie gehe ich da am besten vor, also Timer starten, messen, Timer stoppen 
etc..?
Arbeite mit dem CCS Compiler, aber die Hilfe von euch muss nicht in 
Code-Form sein, ein simpler Ablaufbeschrieb reicht eigentlich.
Habe bereits im Internet gesucht, aber so richtig klar ists mir nicht...
Sofern nötig, könnte ich auch Schemaausschnitte anhängen.

Vielen Dank für eure Hilfe.

Gruss

Autor: Gerhard O. (gerhard_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Exodus schrieb:
> Hallo miteinander
>
> Als stillschweigender mikrocontroller.net-Leser habe ich eine Frage und
> hoffe, mir kann jemand helfen.
>
> Und zwar arbeite ich aktuell an einem LCR-Messgerät.
> Kurz zum Aufbau:
>
> L wird in der bekannten Schwingkreisbeschaltung mit dem LM311 eingesetzt
> - der Ausgang wird an RA4 des Mikrocontrollers gelegt, um die Impulse zu
> zählen (Frequenz).
>
> C wird mit dem Baustein 74HC4046A bestimmt, auch hier wird RA4 als
> Zähleingang verwendet.
>
> R wird über einen ADC (mit Spannungsteiler inkl. Bereichsumschaltung
> über zuschaltbaren Widerstand) gemessen.
>
> Insgesamt bereitet mir die Messung der Induktivität die meisten
> Schwierigkeiten.
>
> Wie gehe ich da am besten vor, also Timer starten, messen, Timer stoppen
> etc..?
> Arbeite mit dem CCS Compiler, aber die Hilfe von euch muss nicht in
> Code-Form sein, ein simpler Ablaufbeschrieb reicht eigentlich.
> Habe bereits im Internet gesucht, aber so richtig klar ists mir nicht...
> Sofern nötig, könnte ich auch Schemaausschnitte anhängen.
>
> Vielen Dank für eure Hilfe.
>
> Gruss

Hallo Exodus,

Fuer Zeitmessungen wird normalerweise am besten die CAPTURE hardware 
verwendet. Dazu musst Du zuerst die Zeitbasis mit einem der TIMER 
festlegen. Mittels Interupt kann man dann den Zaehlerstand ablesen. Sehe 
Dir mal den Beispiel File an: "EX_CCPMP.C". (Findest Du im PICC compiler 
Directory)
           __________________
          |                    |
----------                     --------------------
         R.E.                 F.E.

Damit kannst Du direkt die Zeitdauer eines Signal messen.

mfg,
Gerhard

#if defined(_PCM_)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#elif defined(_PCH_)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#endif


long rise,fall,pulse_width;

#int_ccp2
void isr()
{
   rise = CCP_1;
   fall = CCP_2;

   pulse_width = fall - rise;     // CCP_1 is the time the pulse went 
high
}                                 // CCP_2 is the time the pulse went 
low
                                  // pulse_width/(clock/4) is the time

                                  // In order for this to work the ISR
                                  // overhead must be less than the
                                  // low time.  For this program the
                                  // overhead is 45 instructions.  The
                                  // low time must then be at least
                                  // 9 us.

void main()
{
   printf("\n\rHigh time (sampled every second):\n\r");
   setup_ccp1(CCP_CAPTURE_RE);    // Configure CCP1 to capture rise
   setup_ccp2(CCP_CAPTURE_FE);    // Configure CCP2 to capture fall
   setup_timer_1(T1_INTERNAL);    // Start timer 1

   enable_interrupts(INT_CCP2);   // Setup interrupt on falling edge
   enable_interrupts(GLOBAL);

   while(TRUE) {
      delay_ms(1000);
      printf("\r%lu us ", pulse_width/5 );
   }
}

Damit diese Beispiel funktioniert musst Du das Eingangsignal an PIN-C1 
und C2 anschliessen. Mit einer kleinen Programmaenderung geht das auch 
mit nur einem Eingang.

Autor: Exodus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Danke erstmal für die Antwort.
Das "Problem" ist, dass die Hardware schon fertig ist und auch bestückt 
- kann also die Anschlussbelegung nicht mehr ändern.
Als ich die Schaltung entworfen habe (und auch jetzt noch), war ich der 
Meinung dass das Ganze über RA4 relativ elegant machbar ist.
Hab entsprechende Beispiele auch schon gesehen, aber das Ganze will 
nicht wirklich..
Hier hab ich noch einen Code-Schnippsel von mir:
void c_measure(void)
  {
  int8 prescaler = 0;
  disp_delete ();
  ueberlauf = 0;

  setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_256);
    enable_interrupts(INT_RTCC);
    enable_interrupts(GLOBAL);  

//Grobmessung mit einem Vorteiler von 256 und t=256us
//Ergebnis in MHz
//Anhand dieser Messung wird der Vorteiler bestimmt

    set_timer0 (0);
    delay_us(256);
    timer_0 = get_timer0();
    //timer_0 = timer_0 + (ueberlauf * 256);    
    ueberlauf = 0;
    
//Bestimmung des Vorteilers
    if (timer_0>=2)
      {
      setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_2);  
      prescaler = 2;
      }
    if (timer_0>=4)  
      {
      setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_4);  
      prescaler = 4;
      }
    if (timer_0>=8)
      {
      setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_8);
      prescaler = 8;
      }
    if (timer_0>=16)
      {
      setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_16);  
      prescaler = 16;
      }
    if (timer_0>=32)
      {
      setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_32);  
      prescaler = 32;
      }
    else
      {
      prescaler = 1;
      setup_timer_0(RTCC_EXT_L_TO_H);
      }

//Genaue Messung mit korrektem Vorteiler
    set_timer0 (0);
    delay_ms(500);
    timer_0 = get_timer0();
    timer_0 = (timer_0 * 2) + (ueberlauf * prescaler);    
    ueberlauf = 0;
   }

Ist dieser Ansatz korrekt..?

Gruss

Autor: Exodus (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich bins nochmal, hab gerade noch einmal versucht das ganze in Betrieb 
zu nehmen.
Die Software zur Messung von L sieht im Moment so aus:

ueberlauf = 0;
setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_32);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);  
  
set_timer0 (0);
delay_ms(1000);
disable_interrupts(INT_RTCC);
timer_0 = get_timer0();
timer_0 = timer_0 + (ueberlauf * 32);


In der Interruptroutine von TIMER0 wird jedesmal die Variable 
"ueberlauf" inkrementiert.

Nun sollte das Ergebnis eine Frequenz in Hz sein, oder?
Wie rechne ich jetzt zurück auf die Induktivität?

Wäre echt super, wenn mir hier jemand dabei helfen könnte...

Danke und Gruss

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.