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?
> 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?
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!
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
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
...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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.