Puls & Periodenmessung

 

Mit Timer_1 oder Timer_3 (nur Mega128) können Pulsweiten oder Signalperioden gemessen werden. Es wird mit Hilfe der Input Capture Funktion (spezielles Register des Controllers), die Zeit zwischen zwei Flanken gemessen. Diese Funktion nutzt den Capture-Interrupt ( INT_TIM1CAPT). Der Puls wird zwischen einer steigenden und der nächsten fallenden Signalflanke gemessen. Die Periode wird zwischen zwei steigenden Signalflanken gemessen. Durch die Input Capture Funktion gehen Programmlaufzeiten nicht als Ungenauigkeit in das Meßergebnis ein. Mit dem programmierbaren Vorteiler kann die Auflösung des Timer_1 festgelegt werden. Vorteiler siehe Tabelle.

 

 

Beispiel: Pulsbreitenmessung (Projekt PMessung) 434 µs (100 x 4,34 µs, siehe Tabelle) einschalten

 

word PM_Wert;

 

void Timer1_ISR(void)

{

    int irqcnt;

    

    PM_Wert=Timer_T1GetPM();   // Pulsweite auslesen

    irqcnt=Irq_GetCount(INT_TIM1CAPT);

}

 

void main(void)

{

    byte n;

    

 // Interrupt Service Routine definieren

    Irq_SetVect(INT_TIM1CAPT,Timer1_ISR);  

 

    Timer_T0PWM(100,PS0_64);        // Pulsgenerator Timer 0 starten

 

 // die Messung beginnt hier

 // Output Timer0 OC0(PortB.3) verbinden mit ICP(input capture pin, PortD.6)

    

    PM_Wert=0;

 // Pulsweite messen einstellen, Vorteiler für Messung festlegen

    Timer_T1PM(0,PS_64);

 

    while(PM_Wert==0);     // Pulsbreite oder Periode messen

 

    Msg_WriteHex(PM_Wert);  // Messwert ausgeben

}

 

Aus Übersichtsgründen ist hier eine vereinfachte Version angegeben. Beim Mega128 wird wegen einer Kollision auf Pin B.4 der Timer_0 zur Pulserzeugung benutzt. Das vollständige Programm ist im Ordner PW_Messung zu finden.