Frequenzmessung

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.

Hallo,

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);
  }
}

Gruß Michael

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

http://www.atmel.com/dyn/resources/prod_documents/doc8025.pdf

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?

Eigentlich dachte ich an die Beispielschaltung in Fig.3 von Seite 8 in diesem Datenblatt: http://www.national.com/ds/LM/LM231.pdf

Insgesamt möchte ich voraussichtlich 7 oder 8 Batteriespannungen von bis zu 8V messen.

Somit komme ich auf eine Frequenz von bis zu 8kHz die ich an den Eingängen anlegen würde.

Alternative wäre, mehrere Arduinos über einen Bus miteinanter zu verbinden - aber das ist sicherlich auch nicht einfach.

Schau Dir das Kapitel zu Timer 1 an

Meinst du das Kapitel, das auf Seite 110 beginnt?

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)

Michael.

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?

Was Du brauchst sind mindestens 8 analoge Eingänge, richtig? Dann wäre die einfachste Lösung eine Arduino Variante zu nehmen die das schon kann:

Seeduino, Sangduino oder Arduino Mega fallen mir da ein.

Seeduino kostet bei Waterott nur 23 Euronen:

http://www.watterott.com/Seeeduino-V328-Assembled-Arduino-compatible

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.

Gruß, Udo

Halo,

mit Hardwarecounter war ein vorhandener Zähler des Atmel Prozessors gemeint!

Michael