Frequenz messen und gleichzeitig ausgeben

Hi Leute,

ich bin absoluter Neuling was das Thema Arduino angeht.

Ich möchte bei einem Tacho das Ziffernblatt wechseln und dafür die Anzeige anpassen.
Der Tacho bekommt das Geschwindigkeitssignal in Form von einem 5V Rechtecksignal mit 50% duty. Dieses möchte ich mittels Arduino Uno (uno habe ich da und würde dann später auf Nano gehen, sofern das die selben Möglichkeiten bietet) auslesen, über einen Faktor (1,5555) teilen und dann wieder ausgeben.

Kennt jemand evtl einen schon fertigen Sketch der in diese Richtung geht?

Ich wollte mich erstmal mit dem Thema Frequenzmessen beschäftigen und habe mir dazu folgende Sachen angeguckt:

Was mir jedoch aufgefallen ist, dass die Frequenz stark zeitverzögert (hier 1000ms) erfasst wird.

Gibt es beim Arduino über eine andere Funktion die Möglichkeit das Signal in “Echtzeit” zu erfassen?

Hallo
Schaue mal hier.
https://www.arduino.cc/reference/en/language/functions/advanced-io/pulsein/

Einfache Frequenzmessungen nehmen eine Torzeit und zählen die Impulse während der Zeit. Das ist auch generell für hohe Frequenzen gut (ab ca. 1kHz). Und wenn man da eine Sekunde verwendet hat man auch direkt die Frequenz.
Aber natürlich auch die Verzögerung da man immer die Torzeit abwarten muss. Man kann aber auch einfach etwas heruntergehen und z.B. nur eine halbe Sekunde messen und das Ergebnis entsprechend anpassen.

Diese Library macht dass zusätzlich nicht-blockierend so dass man während der Messung noch andere Dinge tun kann:
https://www.pjrc.com/teensy/td_libs_FreqCount.html

Es gibt auch eine Version für niedrige Frequenzen (0.1 bis 1000 Hz) die statt dessen die Pulslänge misst (und anders als pulseIn nicht-blockierend!)
https://www.pjrc.com/teensy/td_libs_FreqMeasure.html

Im Prinzip kannst du die Torzeit aber auch den Bibliotheken die du gefunden hast anpassen.

1 Like

Ja, das hatte ich schon versucht aber wenn ich zu stark runter bin mit der Zeit, dann stimmte die im “seriellem Monitor” angezeigte Frequenz nicht mehr mit der tatsächlich mittels externen Frequenzgenerators gesendete Frequenz überein.

Danke erstmal für die Links. Werde mich da gleich ransetzen und mich da einlesen.

Beliebig runtergehen kann man natürlich nicht. Das muss man mit den zu messenden Frequenzen abwägen. Das ist halt Prinzip-bedingt so, da man eine gewisse Anzahl an Impulsen in der Messzeit braucht. Da ändern auch andere Bibliotheken nichts dran.

Du kannst statt dessen die Pulslänge messen. Das geht auch bei niedrigen Frequenzen noch gut da man nicht mehrere Perioden braucht. Dafür leidet die Genauigkeit dann bei hohen Frequenzen.
Außerdem muss man etwas extra Logik einbauen um eine Frequenz von Null richtig anzuzeigen

ja, hab ich schon gesehen im test, dass es obenrum ungenau ist und stark schwankt.

ausgabe mittels tone fällt für mich auch flach, da ich nicht unter 31hz gehen kann. da steht die nadel dann gerade mal bei 1000rpm ab drehazhlmesser.

noch zur ergänzung…
bei dem drehzahlmesser muss ich von ca. 1-295hz (5v) und dann /10x9 und wieder ausgeben und bei der geschwindigkeit sind es ca. 100hz - 1300hz (10v) und dann /280x180 und wieder ausgeben.

der einfachheit halber gehe ich erstmal den drehzahlmesser an.

Hallo,
wenn Deine Frequenz zwischen 0 und 300Hz liegt solltest Du auf jeden Fall eine Periodenmessung machen, sonst wird das mit der Auflösung nichts. Allerdings must Du dich dann auf eine kleinste Messgröße / größte Periodendauer festlegen( z.B 1Hz) . Bei 0Hz wartet das Ding sonst ewig und es gibt eventuell einen Überlauf.
Du kannst das auch im loop messen, ich würde aber ehr mit Interrupt arbeiten und die micros() zwischen zwei Aufrufen messen. Achtung Regeln zur Übergabe aus ISR beachten.
Heinz

Die FreqMeasure Bibliothek macht das alles intern. Die arbeitet mit einem Timer im Capture Modus. Also löst automatisch einen Interrupt aus wenn eine Flanke kommt und sichert den Timer-Stand in einem extra Register. Dadurch hat man eine Auflösung bis runter zur Taktfrequenz des Prozessors.
Außerdem enthält sie einen Ringpuffer für 12 Ergebnisse

Diesen Fall kann man mit einem Timeout behandeln. Abfragen wann zuletzt ein Wert vorlag. Und dann abbrechen wenn das zulange her ist

ich hab das oben nochmal geändert auf ca. 1-295hz. also mit den 0hz sollte kein problem bei diesem vorhaben sein. richtig tun tut sich erst bei vllt. 3hz was am drehzahlmesser. also bitte nicht von den 0hz die ich zuvor geschrieben hatte irritieren lassen :).

ich guck mir das mit der freqmeasure bibliothek mal an, vielen dank erstmal.

ich habe beim stöbern im forum noch den thread gefunden… muss aber sagen da ich da auch leider nicht wirklich schlau draus werde.

scheint aber das thema zu behandeln was ich eigentlich auch möchte.

vermutlich falsch ohne ende (bin wie gesagt nen absoluter anfänger), aber es funzt. Zumindest ab den besagten 31Hz Ausgabefrequenz. Ich muss mir das morgen dann nochmal nachlesen wie ich die Frequenz ausgebe ohne diese tone-funktion.

Funktioniert sowohl im seriellen Monitor, als auch am Drehzahlmesser, wie ich es wollte…

Gibt es jemanden der mir netter Weise einen entsprechende Codesnipped beisteuern kann?

hab gestern Nacht noch 2std dran gesessen und heute 6std :frowning: )...

int pinIN = 7;
unsigned long duration;

void setup() {
Serial.begin(9600);
pinMode(pinIN, INPUT);
}

void loop() {
duration = pulseIn(pinIN, HIGH);
unsigned long frequencyIN = 1000000L / duration /2;
unsigned long frequencyOUT = frequencyIN /10*9;
tone(10,frequencyOUT);
Serial.print(F(" Frequency IN: "));
Serial.print(frequencyIN);
Serial.print(F(" Frequency OUT: "));
Serial.println(frequencyOUT);
}