Ein Frequenzzähler für niedrige Frequenzen mit dem Arduino Uno und der Periodendauer Messung

Über die Messung der Pulslängen HIGH und LOW kann aus einem Rechtecksignal, oder einem ähnlichen Signal, die Frequenz bestimmt werden.
Der Arduino bietet hierzu die Funktion pulseIn(pin, signal) an. Die funktioniert an jedem Digital Pin und misst, wenn man die HIGH und die LOW Zeit addiert die Periodendauer T in Mikrosekunden.

Die Grenzwertbetrachtung

Bei einer Periodendauer von 100 Mikrosekunden entspricht +- 1 Mikrosekunde Fehler 1%, sodass bis ca. 10 kHz gemessen werden kann mit einem Fehler <1%.

Die Periodendauer T wird als unsigned long angegeben und kann somit bis maximal 4.294.967.295 zählen. Das entspricht 230 Mikroherz und somit ist der Millihertz Bereich voll erfasst und 3 Kommastllen sind bei niedrigen Frequenzen möglich.

Der Messbereich beträgt also 1 Millihertz bis 10 kHz.

Das Programm

void loop() {
  time=micros();
  do {
    T = pulseIn(pin, HIGH) + pulseIn(pin, LOW);
    if (T==0) {
      Serial.println("Timeout.");
    }
    else {
      f=1/(double)T;        // f=1/T   
      k++;    
    }  
    fsum+=f*1e6;
  } while( micros() < (time+1e6)); // 1 Sekunde mitteln
  f = fsum/k*0.9925;         // Korrekturwert einrechnen
  Serial.println(f);
  fsum=0.0;
  k=0;
}

Im Programm wird über 1 Sekunde (1e6 Mikrosekunden) gemittelt, deshalb sind nur Frequenzen bis runter zu ca. 3 Hz messbar.

Für niedrigerer Frequenzen muss entsprechend länger gemittelt werden, zum Beispiel 10, 100 oder 1000 Sekunden um 3 Millihertz erfassen zu können.

Fazit

Mit dieser einfachen und flexiblen Routine sind Messung von 3Hz bis 10 kHz möglich incl. einiger Nachkommastellen.

Links

Für höher Frequenzen wird die hier beschriebene Technik verwendet.

von Matthias Busse

4 Gedanken zu „Ein Frequenzzähler für niedrige Frequenzen mit dem Arduino Uno und der Periodendauer Messung

  1. Pingback: Frequenzzähler mit LCD Display am Arduino Uno. | Shelvin – Elektronik ausprobiert und erläutert

  2. Pingback: Den Frequenzzähler mit LCD auf Platine aufgebaut. | Shelvin – Elektronik ausprobiert und erläutert

  3. GeorgK

    Funktioniert dies auch bei Sinuswellen?
    Muss ich bei dieser Methode 10 Sekunden messen, wenn ich Netzfrequenz im Bereich 49 – 51 Hz auf mindestens 1 Nachkommastelle genau bestimmen will? 1 Sample jede Minute dürfte genügen, allerdings sollte auf dem gleichen Arduino ein 2. Prozess mit etwa 2 Sekunden Zyklus parallel dazu laufen können (Abfrage eines Spannungswertes an einem anderen Pin und evtl. Verzweigung in einen anderen Programmteil) …

    Antworten
  4. admin Beitragsautor

    Hallo Georg,

    bei einem Fehler von +-1 Mikrosekunde ist das theoretisch bei 50 Hz (10ms pro Halbwelle) eine Genauigkeit von 1/10000, also 0,01%. Und das für jede Messung.
    ABER
    1. Vorsicht bei Netzspannung.
    2. Die Wellen sind unter Umständen nicht Symetrisch um die 0 Spannung, also die positive und die negative Halbelle einzeln messen
    3. Netz Spannungsstörungen / Spitzen können das Ergebnis völlig verfälschen.
    4. Ein Schmitttrigger mit einer ordentlichen Hysterese sollte vorgeschaltet werden.
    5. So genau ist die Arduino Quarzfrequenz dann auch nicht.

    Viel Spass beim Tüfteln
    Matthias

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.