Ich würde gerne mehrere Spannungen in einem Fahrzeug potentialfrei mit dem Arduino messen.
Hardwaretechnisch habe ich da an einen LM331 U/f Wandler plus Optokoppler gedacht.
Wie kann ich mit dem Arduino Frequenzen messen?
Wie genau geht das?
Geht das an allen Eingängen?
Mit der Suche und im Playground habe ich dazu leider nichts finden können.
das hängt von der Frequenz ab. Prinzipiell geht das mit allen digitalen Eingängen. Für eine definierte Zeit die Anzahl Impulse am Eingang messen. Der Code sieht etwa so aus:
void loop()
{
bool messen = false;
int count;
int newval, oldval;
int timestart;
if (!messen) {
// neue Messung initialisieren
messen = true;
// Zähler nullen
count = 0;
/ Startzeit nehmen
oldval = 0;
timestart = millis();
}
else {
newval = digitalRead(pin);
// wenn sich Eingang ändert, neuen Wert merken
if (newval != oldval) {
oldval = newval;
// wenn Wechsel von 0->1, dann zählen
if (newval == 1) count++
}
if (millis()-timestart >= 1000) {
// Messung ist beendet , 1s war Messzeit, count ist direkt Frequenz in Hz
messen = false;
Serial.print(count);
}
}
Der Code klappt allerdings nur bei niedrigen Frequenzen und wird auch durch Timer 0 gewaltig gestört. Wenn Du höhere Frequenzen messen willst wirst Du nicht drum rum kommen einen Hardware Counter zu nehmen. Die Details stehen im Datenblatt
Ist am Anfang etwas "hart", aber man gewöhnt sich dran. Schau Dir das Kapitel zu Timer 1 an.
Man lässt in der Regel einen Counter möglichst lange laufen und rechnet dann die Frequenz aus. Man darf aber das Fentster nicht zu groß machen um "wrap around" zu vermeiden. Alternativ kann man auch zählen lassen bis man eine feste Zahl Ticks gesehen hat (IRQ auslösen, nicht pollen). Während man gleichzeitig einen anderen Timer laufen lässt um dann die Zeit dafür zu ermitteln.
Ist aber alles zugegeben nicht besonders einfach.
Wie hoch sind die Frequenzen die Du messen willst?
Die 8 Spannungen kann man ja nacheinander messen, dann braucht man nur einen Hardwarecounter. EInfach über digitale Ausgänge und Relais oder digitale Multiplexer den gewünschten Kanal an den Timer-Eingangschakten und Messung starten. Bei 1000Hz/V und 1% Messgenauigkeit reichen ja schon 100ms Messzeit aus (Fehler des U/f-Wandlers mal nicht berücksichtigt)
An einen Multiplexer hatte ich auch schon gedacht, aber einen Counter in Hardware?
Ist es denn so tricky mit dem Arduino eine Frequenz von 8kHz zu messen?
und ist meiner Meinung nach eh besser als das Original
Was die Wandlerfrequenz angeht: die ist nicht so toll, einfach mal im Atmel 328 Datenblatt nachschauen. Da Du ja 8 Eingänge brauchst mußt Du für 8kHz schon mal auf 64kHz Wandlerfrequenz kommen.
Laut Datenblatt geht das wohl schon noch, aber Du kommst dann nicht mehr auf 10 Bit Auflösung. Lies es Dir durch und überlege ob Dir das reicht.