Forum: Mikrocontroller und Digitale Elektronik Frequenzmessung


von andi (Gast)


Lesenswert?

Hi Leute,

ich hab ein Problem, ich soll eine Frequenz mit Timer1 des ATMega16
messen, so nun war mein erster Gedanke ich lasse den Timer1 ohne
Vorteiler laufen. Wenn nun eine Low-High-Flanke am InputCapturePin
erscheint dann lösche ich den Timer und lese ihn bei der nächsten
Low-High-Flanke aus und multipliziere dies mit dem Timer1-Takt, so nun
kann ich damit aber nur vielfache des Timer1-Taktes messen. Gibt es
nicht eine Möglichkeit einer genaueren Messung?

von Rolf Magnus (Gast)


Lesenswert?

> Wenn nun eine Low-High-Flanke am InputCapturePin erscheint dann
> lösche ich den Timer und lese ihn bei der nächsten Low-High-Flanke
> aus und multipliziere dies mit dem Timer1-Takt,

Du müßtest es durch den Takt teilen, um die Frequenz rauszubekommen,
denn du mißt die Periodendauer, also den Kehrwert der Frequenz.
Ich würde den Timer nicht jedesmal löschen. Einfach durchlaufen lassen
und bei jedem Capture den Wert merken. Den letzen vom aktuellen Wert
abziehen, und du hast auch die Zeitdifferenz.
Beim deiner Methode mit dem Löschen wird's auch etwas ungenauer, weil
du die Takte, die zwischen der Flanke und dem Löschen liegen,
verlierst.

> so nun kann ich  damit aber nur vielfache des Timer1-Taktes
> messen. Gibt es nicht eine Möglichkeit einer genaueren Messung?

Timer schneller laufen lassen?

von andi (Gast)


Lesenswert?

Timer schneller laufen lassen geht nicht (läuft schon maximal), das
ganze ist auch nur ein Teil eines Projektes, die ganze Aufgabe lautet
"Wandeln sie ein frequenzvariables (1KHz-256KHz) Eingangssignal
(InputCapturePin) in ein variables 8-Bit-PWM-Signal um". Das mit der
Ausgabe hab ich schon fertig!

von Marco Schwan (Gast)


Lesenswert?

was ist das für ein Signal?(Rechteck oder Sinus)
Gruß Marco

von Sven Johannes (Gast)


Lesenswert?

Moin...

Kann Timer1 nicht auch als Zähler mit externem Takt genutzt werden?
Also: löschen,starten, Intervall warten (anderer Timer), stoppen,
auslesen.
Kommt ein Überlauf => Intervall kleiner, Ergebnis zu klein => Interval
größer.

Dann kennst du Takte/Intervall und ab dafür.

--
 SJ

von johnny.m (Gast)


Lesenswert?

Mit was für einem CPU-Takt arbeitest Du denn? Kleinere Frequenzen sind
eigentlich ein klarer Fall für eine Periodendauermessung, während bei
größeren Frequenzen das Periodenzählen sinnvoller ist (wie Sven
Johannes schon angeführt hat). Wenn es unbedingt über den ganzen
Bereich mit Input Capture sein soll, dann bietet sich folgende
Vorgehensweise an:

-Timer 1 im CTC-Modus (4) mit Vollgas takten (CPU-Takt ohne
Vorteilung)
-Timer 1 Compare A und Capture Interrupts aktivieren (Capture entweder
auf steigende oder auf fallende Flanke)
-OCR1A mit einem Wert laden, der einen Compare-Interrupt z.B. alle
100µs erzeugt (bei 8MHz also 800)
-Bei Capture-Ereignis den Wert von ICR1 sichern, einen Zykluszähler für
die 'Überläufe' (also die Compare-Ereignisse) mit 0 initialisieren.
-Bei jedem Compare den Zykluszähler inkrementieren
-Beim nächsten Capture den Wert aus dem Zykluszähler und den aktuellen
Capture-Wert minus dem ersten Capture-Wert zusammenrechnen und daraus
die Periodendauer errechnen. (Der Zykluszähler enthält dann die Anzahl
der 100µs-Zyklen, die Capture-Werte müssen entsprechend der
Taktfrequenz umgerechnet werden, bei 8MHz entspricht ein Inkrement
125ns)

Das sollte eigentlich für den genannten Frequenzbereich bei einigen MHz
CPU-Takt funktionieren.

Gruß

Johnny

von johnny.m (Gast)


Lesenswert?

...Bei 8 MHz CPU-Takt ist allerdings die Auflösung zum oberen Ende des
Messbereichs mehr als bescheiden. Also schneller Takten oder bei
höheren Frequenzen tatsächlich eine Periodenzählung machen.

von Rahul (Gast)


Lesenswert?

Wenn es "nur" darum geht, herauszufinden, ob es sich bei der Frequenz
um ein Vielfaches von 1kHz handelt, müsste es doch reichen, während
einer Torzeit von 1ms die Anzahl der eingehenden Impulse zu messen.
So wie Johnny schon schrieb: den Timer im CTC auf 1ms einstellen. Dann
mit einem weiteren Timer (z.B. Timer0) die Anzahl der Inpulse an einem
Counter-Eingang zählen (man kann auch einen externen Interruptz
benutzen und händisch zählen).
Die Messung wird gestartet, und bei jedem CTC-Interrupt (ICR oder
OCRxB) wird das Impulszählregister gesichert und geleert.
Wenn man eine Torzeit von 2ms benutzt und die Zählvariable am Ende
durch 2 teilt (ein Mal nach links verschieben)könnte das Messergebnis
auch etwas "ruhiger" sein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.