mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frequenzmessung


Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Marco Schwan (Gast)
Datum:

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

Autor: Sven Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

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.