2014
HOME

Arduino als Zähler
Frequenzzähler mit Arduino
An manchen Schulen werden Zählraten und andere Ereignisse im Praktikum gemessen. Ein GM-Zählrohr liefert Impulse, die der Intensität von z.B. Gamma-Stahlen entsprechen. In der Mechanik können Geschwindigkeiten mittels Speichenrad in eine Frequenz gewandelt werden. Interferenzübergänge erlauben Aussagen zu optischen Weglängenänderungen.
Arduino als Frequenzzähler
Arduino zeigt die Netzfrequenz bei offenem Eingang auf einem LCD-Display.
Arduino als Zollstock
Ein Blick in die Referenz auf arduino.cc zeigt bei den Eingaben unter 'Advanced I/O' die Funktion pulseIn(). Die Beschreibung sagt, dass mit dem Aufruf pulseiIn(pin, HIGH) gewartet wird, bis das Signal an dem Eingangs-Pin (pin) auf Logikpegel HIGH geht. Dann wird ein Timer gestartet und gewartet bis der Pegel LOW erreicht wird. Die verstrichene Zeit wird in Mikrosekunden zurück geliefert. Etwas anders ausgedrückt: puseIn(pin,HIGH) liefert die Impulsdauer ti.
Die Impulspause t
p kann mit pulsIN(pin,LOW) ermittelt werden. Die Periodendauer T ergibt sich aus T = ti+ tp. Bei einem symmetrischen Rechtecksignal ist ti = tp, also die Zeit für HIGH-Pegel gleich der Zeit für LOW-Pegel.

Die Funktion kehrt bei einem Timeout mit dem Wert 0 zurück, womit auch bei fehlendem Signal das Programm fortgesetzt werden kann.

Der Kehrwert der Periodendauer T entspricht der Frequenz f. Aus Mikrosekunden (1e-6) werden Megahertz (1e6). Um eine Anzeige in Hertz zu erreichen wird mit 1e6 multipliziert. Hier der Sketch.


Probe mit DSO-Quad
Arduino als Zollstock
Das Hosentaschenoszilloskop 'DSO-Quad' mit seinem eingebauten Frequenzgenerator soll als Testsignalgeber dienen. Die Rechteckfrequenz kann in weiten Bereichen eingestellt werden. Mit zwei Verbindungen kann der Test beginnen. Masse an Masse und Generatorausgang vom Quad an Pin 7 des Arduino. Bei der Frequenz 5000 Hz wird in der Tat auch ein Wert um 5025 angezeigt. Wer da jetzt im Recht ist, müsste eine Kalibrierung zeigen. Für einfache Messungen sollte das jedoch zunächst reichen.

Ratemeter oder Impulszähler

Arduino als Zollstock
Bei parallel laufenden, freien Praktika kann es vorkommen, dass plötzlich alle Impulszähler in Gebrauch sind. Abhilfe schafft da ein kleiner Arduino mit einem kleinen Sketch. Impulsraten sind Ereignisse aperiodischer Signale pro Zeiteinheit, wie zum Beispiel die Impulsfolge eines Geiger-Müller-Zählrohrs.

In wenigen Zeilen wird hier mittels pulseIN() und micros() die Impulsrate an Pin 7 gemessen. Als Zeitintervall T ist hier eine Sekunde, bzw. 1000000 (1e6) Mikrosekunden voreingestellt.

In der Hauptschleife wird die Einzelmessung initialisiert und dann während des Zeitintervalls T mittels pulseIn() auf eine ansteigende Flanke gewartet. Anschließend enthält N die Anzahl der Impulse pro Sekunde und wird via Serial.println gesendet.

Benutzt man symmetrische Signale (Rechteck, Sinus, Dreieck), so ergeben sich bei beiden Zählervarianten gleiche Ergebnisse, obwohl sie anders funktionieren.

Durch Änderung der Variablen T kann die Messdauer verändert werden. Für eine Zähldauer von z.B. 10 Sekunden würde T = 10*1e6 betragen.

Hier der Sketch.


LCD-Anzeige

Wie beim 'Arduino als Zollstock' macht eine LCD-Anzeige die Messanordnung autonom. Auf einem 2x16-Display erfolgt die Darstellung durch Einbindung der 'LiquidCrystal'-Bibliothek, die unter http://arduino.cc/en/Tutorial/LiquidCrystal beschrieben ist. Das gesamte Programm wird dadurch kaum länger. Hier die Variante für den Frequenzzähler. Da die Umlaute wieder Probleme machen, zeigt das Display 'FrequencyCounter'. Bei offenem Eingang fängt sich der Zähler hier die Netzfrequenz ein.

/* Frequenzzähler
   Gibt die Frequenz des Spannungsignals an Pin 7 aus 
*/
#include <LiquidCrystal.h>
int pin = 7;
unsigned long T;          //Periodendauer in us
double f;                 //Frequenz in MHz 
char fm[] = " %8ld Hertz";
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() 
{ lcd.begin(16, 2);
  pinMode(pin, INPUT);
  lcd.print("FrequencyCounter");
}

void loop() 
{ char s[20];     // Messen von ti + tp = T
  T = pulseIn(pin, HIGH) + pulseIn(pin, LOW);
  T == 0 ? f = 0 : f=1/(double)T;
  sprintf(s,fm,(unsigned long)(f*1e6));
  lcd.setCursor(0, 1);
  lcd.print(s);
  delay(200);
}

Hier der Sketch.


Weitere Software

.
Startseite Bücher Software Digital RTV Musik Kontakt

Für Inhalt und weitere Verzweigung externer Links sind die Betreiber der dortigen Seiten verantwortlich - H.-J. Berndt