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.