Frequenz messen - Arduino

Persönliche Seite #3126833
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?
#3126866
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.
Gast #3126886
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren