Forum: Mikrocontroller und Digitale Elektronik 4-Kanal Drehzahlmessung mit ATmega88


von m.n. (Gast)


Angehängte Dateien:

Lesenswert?

In den letzten Monaten wurden hier Schaltungen für reziproke 
Frequenzzähler vorgestellt, die nach Möglichkeit höchste Frequenzen bei 
möglichst vielen angezeigten Stellen bieten sollten.
Siehe:
Beitrag "Frequenzzähler 1Hz - 40MHz"
oder auch
Beitrag "PIC - Frequenzzähler weit über 50 MHz auf die minimalistische Art"

Für niedrige Frequenzen haben diese jedoch den Nachteil, daß zwischen 
den einzelnen Messungen immer Lücken vorhanden sind, um neu zu 
synchronisieren. Bei 1 Hz Eingangsfrequenz wird daher nur jede zweite 
Periode erfaßt.

Zu "immer schneller, weiter, höher" ist hier ein Gegenentwurf, der sich 
speziell für tiefere Drehzahlen / Frequenzen eignet und diese lückenlos 
erfaßt und auswertet. Anstatt ein einzelnes Signal zu messen werden hier 
4 Kanäle mit je 5-stell. Auflösung gleichzeitig gemessen. Genau genommen 
ist es also eine Messung mit 20 Stellen (4 x 5) und damit doch wieder 
ein neuer Rekord :-)
Die angehängte .c-Datei wurde unter AVR-Studio 4.18 erstellt. Benutzt 
werden die float-Routinen, die AVR-GCC zur Verfügung stellt. Es findet 
keinerlei Programmierung in Assembler statt. Mit 5,5KB Code läßt ein 
Atmega88 noch genug Platz für eigene Anpassungen.

typ. Daten:
4 Eingänge für Drehzahlen von 1 U/min – 1000000 U/min
gleichzeitige Messung aller Eingänge
3 Messungen/s oder min. ein Eingangsimpuls (<180.00 U/min)
5 gültige Stellen
5-stellige Anzeige bis 99999, darüber hinaus 6. oder 7. Ziffer als '0'

zur Schaltung:
Die Schaltung benötig nur wenige Bauteile: Atmega88 + LCD 16x2 + 
Kleinteile
Die Signale werden an den Eingängen PC.2 – PC.5 (1.Kanal – 4.Kanal) 
erwartet. Pullups sind aktiviert, sodaß Hallsensoren oder prellfreie 
Signalquellen direkt angeschlossen werden können.
Die LC-Anzeige nebst Programmierstecker werden lt. Schaltbild 
angeschlossen.

Zum Programm:
Die Eingangsimpulse lösen den PCINT1-Interrupt aus, welcher nur die 
negativen Flanken wertet. Fortlaufend erfaßt werden die Anzahl der 
Impulse und der Zeitpunkt des letzten Impulses.
Gleichzeitig wird grob ermittelt, wie lange die laufende Messung 
andauert. Die Überläufe von T1 im 3,3ms Raster werden dazu genutzt. Dies 
geschieht für alle vier Kanäle gleichzeitig.

Die Auswertung erfolgt mit den Differenzen der Anzahl der Impulse und 
der Zeit  (Endwert – Startwert). Abschließend werden die aktuellen 
Endwerte als Startwert für die nächste Messung abgelegt. Auf diese Weise 
geht kein Eingangsimpuls verloren. Der Zähler der Messdauer wird 
gelöscht und die neue Mindestzeit abgewartet.

Auswertung und Anzeige eines Signals erfolgen hier asynchron zu den 
Eingangsimpulsen; daher müssen folgende Bedingungen eingehalten werden:
1. eine Mindestzeit von 0,33 Sekunden ist seit der letzen Auswertung 
verstrichen
2. mindestens ein Eingangsimpuls ist aufgetreten
3. zwischen Beginn der Messung und letztem Impuls ist eine Mindestzeit 
abgelaufen.

zu 1. Für eine 5-stellige Auflösung bei 330ms (Mindest-)Messdauer muß 
die Zeit auf 3,3µs genau erfaßt werden. Die PCINT1-Routine 'schafft' 
dies, wobei die Dauer des Interrupts auch vom gleichzeitigen Auftreten 
der Eingangsimpulse abhängt. Selbst wenn die 3,3µs überschritten werden, 
ist dies kaum nachteilig, da eine Anzeige immer mit +/- 1 Digit gewertet 
werden sollte.

zu 2. Ohne Eingangsimpuls kann natürlich nichts gemessen werden. Nach 60 
Sekunden ohne Eingangsimpuls (timeout), wird die Anzeige des Kanals 
gelöscht (Anzeige von "-.-").

zu 3. Gleich zu Beginn einer neuen Messung kann zum Beispiel nach 1ms 
ein Impuls eintreffen und danach kein weiterer. Bedingungen 1. und 2. 
wären erfüllt, das eff. Meßintervall aber zu kurz, um daraus fünf 
gültige Stellen abzuleiten. Im Programm wird daher ein Mindestintervall 
von 250ms vorgegeben (F_CLOCK/4).

Angezeigt werden die vier Kanäle auf einem 'üblichen' 16x2 Display, was 
aber wenig Raum für formatierte Ausgaben bietet. Drehzahlen von 1.0000 – 
99999 werden dimensionslos mit korrekter Auflösung gerundet angezeigt. 
Um Werte von 100000 –  5000000 (max. bei nur einem Kanal) unverstümmelt 
auszugeben, werden die 6. oder ggf. 7. Stelle als '0' angezeigt.
Wem dies nicht gefällt kann eine andere Anzeige verwenden 
(beispielsweise 4 x 20) und das Ausgabeformat optimieren.  Wie dies 
gehen könnte, wird hier gezeigt:
Beitrag "einfache Drehzahlmessung mit ATmega88"

Wer weitergehende Informationen zum Meßverfahren braucht oder 
speziellere Problemlösungen sucht, kann sich hier umsehen:
http://www.mino-elektronik.de/fmeter/neue_versionen.htm

Das Programm ist ganz frisch und braucht noch einen abschließenden Test. 
Anregungen, konstruktive Kritik und Erfahrungsberichte würden mich 
freuen.

von m.n. (Gast)


Angehängte Dateien:

Lesenswert?

Nach dem langen Text noch zwei Fotos der Anzeige, die die Funktion 
verständlicher machen.
1. Der Startbildschirm mit der Kanal-Zuordnung und 2. die Messergebnisse 
mit 5-stelliger Auflösung auch bei sehr niedrigen Drehzahlen.

von interesse (Gast)


Lesenswert?

Kann ich das ganze in 6 Fach ausführung bauen mit einem attiny2313 und 
die Werte per uart senden?

von Michael H. (michael_h45)


Lesenswert?

nein.

von Bastler (Gast)


Lesenswert?

interesse schrieb:
> Kann ich das ganze in 6 Fach ausführung bauen mit einem attiny2313 und
> die Werte per uart senden?
Das kommt drauf an, wie gut du mit µC-Programmierung umgehen kannst.
Noch wird der UART nicht benutzt ;-)

von m.n. (Gast)


Lesenswert?

interesse schrieb:
> Kann ich das ganze in 6 Fach ausführung bauen mit einem attiny2313 und
> die Werte per uart senden?

Wegen der Codegröße müßte es mindestens ein ATtiny4313 sein, wenn man es 
kompakt programmieren kann.

Mit einem ATmega88 ist man aber auch bei ungeschickter Programmierung 
auf der sicheren Seite.
Man kann ein 2x20 oder 2x40 Display nehmen, wenn alle Werte gleichzeitig 
ablesbar sein sollen.

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.