Frequenz messen mit dem Uno

Mit dem Uno eine einfache Rechteckfrequenz einzulesen ist eigentlich nicht schwer. Im Internet habe ich verschiedene Ansätze dafür gefunden. Am einfachsten erscheint es mir aber die Input Capture Funktion im Timer 1 des ATMega328p zu verwenden. Nur die Frequenz messen. Eine gleichmäßige Frequenz als Rechteck mit einem Puls / Pause Verhältnis von 50%. Mit der Vorgabe im Bereich von 31Hz bis 99Hz.

Das Verfahren
Der Counter läuft kontinuierlich von 0 bis 65535 durch. Beim Überlauf kann er einen Interrupt erzeugen. Das lässt sich einsetzen um längere Zeiten zu messen, für kleinere Frequenzen. Für die eingestellte Flanke des Eingangssignals, ob steigend oder fallend, erzeugt der Capture ebenfalls einen Interrupt. Hier muss ich nur abwarten bis die erste Flanke kommt. Dann kann ich kontinuierlich die Zeiten messen. Aus der gemessenen Zeit, die der Periodendauer der Frequenz entspricht, berechne ich dann die Frequenz mit 1 / (Periodendauer in Sekunden)

Einstellungen
Für den UNO gibt es verschiedene Einstellungen für den Takt, mit dem der Timer läuft. Das Ergebnis sind dann verschieden Mindest- und Höchstfreuenzen, die sich messen lassen. Außerhalb dieses Bereichs sind die Berechnungen dann immer falsch.

// mindestfrequenz fuer ATMega328p
// Takt 8 MHz 16 MHz
// Prescale /8 15,26 30,52 Hz
// Prescale /64 1,9 3,8 Hz
// Prescale /256 0,48 0,96 Hz
// Prescale /1024 0,12 0,24 Hz

// hoechstfrequenz fuer ATMega328p (theoretisch)
// Takt 8 MHz 16 MHz
// Prescale /8 1e06 2e06 Hz
// Prescale /64 125e03 250e03 Hz
// Prescale /256 31,25e03 62,5e03 Hz
// Prescale /1024 7812 15625 Hz

// Zeit je Zaehler / Zaehlertakt
// Takt 8 MHz 16 MHz
// Prescale /8 1 0,5 us
// Prescale /64 8 4 us
// Prescale /256 32 16 us
// Prescale /1024 128 64 us

Anmerkung
Die Messdauer, also Periodendauer des Messsignals, sollte länger sein, als die Laufzeit der Interruptroutine. Sonst gibt es ebenfalls nur Müll.

Der Sketch

Ergebnis
Das funktioniert ganz gut. Nur außerhalb des Bereichs werden „seltsame“ Werte berechnet. Das lässt sich aber mit weiteren Abfragen abfangen, in diesem Beispiel im Bereich zwischen 31Hz und 99Hz, wie oben angegeben.

Links

Frequenzmessung, ein Beispiel
https://gist.github.com/billroy/4032657

Input Capture auf einem STM32F0 / Seite 951
https://www.st.com/content/ccc/resource/technical/document/reference_manual/c2/f8/8a/f2/18/e6/43/96/DM00031936.pdf/files/DM00031936.pdf/jcr:content/translations/en.DM00031936.pdf

Veröffentlicht von

Jürgen

Ich bin Software Ingenieur und habe meine Schwerpunkte in allen Aktivitäten, die zur Software Entwicklung gehören. Am längsten bin ich als Software Entwickler von Embedded Software in C tätig.