Forum: Mikrocontroller und Digitale Elektronik Frequenz messen - Arduino


von Jeromyo H. (jeromyo) Benutzerseite


Lesenswert?

Hallo,

ich wollte mit einem Arduino (Eigentlich ja egal) eine Frequenz messen, 
die ich von einer anderen Schaltung bekomme. Die Frequenz liegt im 
Bereich 0.5 bis ca. 150 Hertz und die Spannungspegel schwanken zwischen 
High~2.5V und Low~0.5V. Ich dachte jetzt daran, dass ganze mit einem 
Spannungsteiler an einen Digitalpin zu schalten und dann per Interrupt 
z.B. die fallenden Flanken zu messen. De Anzahl würde ich dann in einer 
Variable speichern und per Timer das ganze genau jede Sekunde ausgeben, 
wenn höhere Genauigkeit, dann würde ich eben 2,3 Sekunden nehmen und den 
Wert der Variable genau hierdurch teilen, dann komme ich ja genau auf 
die Hertz. Kann das so klappen oder wie messt ihr eine solche Frequenz?

von Chris (Gast)


Lesenswert?

Die arduino-IDE liefert für sowas die Funktion pulseln() mit

von Jeromyo H. (jeromyo) Benutzerseite


Lesenswert?

Oh, danke für den Hinweis Chris, muss ich mich genauer einarbeiten

von Tagaktiv (Gast)


Lesenswert?

Jeromyo Hochgesang schrieb:
> Kann das so klappen oder wie messt ihr eine solche Frequenz?

Mit einem reziproken Frequenzzähler. Bei niedrigen Frequenzen von z.B. 
1Hz wirst du keine Lust haben, eine viertel Stunde zu warten, um sie auf 
3 Stellen genau zu bestimmen.
Beitrag "Frequenzzähler 1Hz - 40MHz"

von m.n. (Gast)


Lesenswert?


von Jeromyo H. (jeromyo) Benutzerseite


Lesenswert?

Danke an Tagaktiv und m.n.!

von Sebastian W. (sebastian_w29)


Lesenswert?

Jeromyo Hochgesang schrieb:
> Hallo,
>
> ich wollte mit einem Arduino (Eigentlich ja egal) eine Frequenz messen,
> die ich von einer anderen Schaltung bekomme. Die Frequenz liegt im
> Bereich 0.5 bis ca. 150 Hertz und die Spannungspegel schwanken zwischen
> High~2.5V und Low~0.5V. Ich dachte jetzt daran, dass ganze mit einem
> Spannungsteiler an einen Digitalpin zu schalten und dann per Interrupt
> z.B. die fallenden Flanken zu messen. De Anzahl würde ich dann in einer
> Variable speichern und per Timer das ganze genau jede Sekunde ausgeben,
> wenn höhere Genauigkeit, dann würde ich eben 2,3 Sekunden nehmen und den
> Wert der Variable genau hierdurch teilen, dann komme ich ja genau auf
> die Hertz. Kann das so klappen oder wie messt ihr eine solche Frequenz?

Atmel Datenblatt (z.B. ATmega 2560), Vih, Input High Voltage (Except 
XTAL1 and RESET pins): 0.6VCC.

Beim 5V-Arduino ist Vih also 3V, und die erreichst du mit High~2.5V 
nicht sicher. Also besser einen Level Shifter vorschalten oder einen 
3.3V uC nehmen.

von Jeromyo H. (jeromyo) Benutzerseite


Lesenswert?

Danke Sebastian, die Spannung kann ich an der anderen, 
frequenzerzeugenden Schaltung mit Leichtigkeit ändern, dann stelle ich 
sie auf ca. 3 Volt ein, danke!

von m.n. (Gast)


Lesenswert?

Um Dein Eingangssignal mit dem genannten Pegel direkt auszuwerten, 
eignet sich am besten der Eingang AIN1 in Kombination mit der 
ICP-Funktion des Timers 1. Die Schaltschwelle kann man mit AIN0 
vorgeben, oder stattdessen die interne 'bandgap reference' verwenden. 
Beim ATmega328 (zum Beispiel) liegt diese bei ca. 1,1V, was für Dein 
Signal gut passen würde.
Ferner kannst Du anstatt AIN1 über den ADC-Multiplexer auch jeden 
anderen ADCx-Eingang als Signaleingang benutzen, sofern der ADC nicht 
anderweitig verwendet wird.

Mit ICP und T1 zu arbeiten, liefert die höchste Auflösung. Falls Dir ein 
4-5 stelliges Eregbnis reicht, kann man das Signal auch mit der 
PCINT-Funktion an irgendeinem beliebigen Eingang erfassen.

Das Datenblatt beschreibt die typischen Schaltschwellen und Hysteresen 
der digitalen Eingänge. Bei den neueren AVRs liegen die Schaltschwellen 
bei rund VCC/2 und die Hysteresen bei einigen 100mV. Sofern Du Dein 
Signal mit einem Spannungsteiler in Richtung VCC verschiebst, kannst Du 
die PCINT-Funktion nutzen. Bei geringerer Auflösung kann dann jeder 
Timer verwendet werden, indem er ohne Vorteiler läuft und nur die 
Überläufe als Zeitreferenz verwendet werden. Eine feinere Auflösung 
erhält man durch Auslesen des Timers in der PCINTx-Interruptroutine. 
Damit sind die Messzeiten auf rund 10µs genau zu erfassen, was bei 1s 
Messzeit 5-stellige Ergebnisse liefert.
Ein Beispielprogramm findest Du hier: 
Beitrag "Frequenz / Drehzahl, 4-stell. 7-Segm.-LCD, ATtiny45"
wobei Du Dich zunächst nur auf die Interruptroutinen von T1 (beim 
ATtiny45 nur 8 Bit breit) und die Auswertung konzentrieren solltest.

von Jeromyo H. (jeromyo) Benutzerseite


Lesenswert?

Über die Eingänge muss ich mir noch genauer Gedanken machen, aber ich 
denke ich mache es über einen ADC-Eingang,da stehen noch genug zur 
Verfügung.Aber wie gesagt, ich werde mir zunächst noch die 
Schaltschwellen ansehen und an der Interruptroutine arbeiten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.