Forum: Mikrocontroller und Digitale Elektronik AVR Impulse zählen


von Andreas H. (heilinger)


Lesenswert?

Hallo,

ich möchte einen Lüfter überwachen, der einen "Tacho" eingebaut hat. Der 
Lüfter dreht sich mit ca. 6500 U/Min und liefert pro Umdrehung 2 
Impulse.

Ich benutze einen ATmega1284P. Habe ich denn die Möglichkeit bei jedem 
Impuls einen Zähler aufzuaddieren und nach einer bestimmten Zeitspanne 
diesen Zähler auszulesen und zurückzusetzen?

Oder muss ich da jedes mal nen Interrupt ausführen?

von Sebastian (Gast)


Lesenswert?

Nennt sich Capture-Eingang, soweit ich weiß. Gibt es.

von SebX (Gast)


Lesenswert?

6500 U/min => 109 U/sec

Dein Controller taktet doch bestimmt mit mindestens 2Mhz, was spricht 
dagegen irgendeinen Eingang zu pollen?

von Andreas H. (heilinger)


Lesenswert?

ja, mein Controller läuft mit 20MHz.

Bei 6500 U/Min und 2 Impulsen pro Umdrehung sind das 13000 Impuls pro 
Minute = 217 U/sec. Das bedeutet jede 4-5 ms einen Impuls. Da könnte ich 
natürlich jede Milliskeunde einfach nen Eingang abfragen, stimmt. Auf 
diese Idee bin ich noch nicht gekommen.
Mit dem Zähler halte ich es trotzdem für eleganter. Diese "Input Capture 
Unit" steht im Zusammenhang mit den 16-bit Timern. Davon besitzt der 
ATmega1284P 2, jedoch verwende ich beide 16-bit-Timer, weswegen diese 
Lösung wohl ausfallen muss.

von Joachim B. (jojo84)


Lesenswert?

Du kannst doch auch jeden anderen Timer nehmen. Über eine bestimmte Zeit 
die Impulse zu zählen ist nicht sooo sinnvoll, weil du dann ja diese 
Zeit immer abwarten mußt. Besser ist eigentlich die Zeit zwischen zwei 
Impulsen zu stoppen und daraus dann die Impulse/Zeiteinheit zu 
errechnen.
Das wäre dann so:

1. Impuls kommt, TimerX starten
2a. nächster Impuls kommt, TimerX auslesen und
2b. resetten
3. Impulse/Zeiteinheit ausrechnen

Klar soweit?

Gruß

von Andreas H. (heilinger)


Lesenswert?

Naja, ich werde es so machen:

Da ich eh schon einen 1kHz-Interrupt ausführe, werde ich jede ms den 
Eingang abfragen und bei Pegelwechsel am Eingang ne Variable eins 
hochzählen. Und dann nach 1 Sekunde einfach schauen wie hoch der Zähler 
gelaufen ist, dann habe ich genau die Umdrehungen pro Sekunde.

Es ist ja keine zeitkritische Aufgabe, es geht nur darum zu erkennen, ob 
der Lüfter sich dreht oder nicht, und das kann auch ruhig eine Sekunde 
später ausgewertet werden.

Danke für die Antworten!

von Kai S. (zigzeg)


Lesenswert?

Andreas Heil schrieb:
> Naja, ich werde es so machen:
>
> Da ich eh schon einen 1kHz-Interrupt ausführe, werde ich jede ms den
> Eingang abfragen und bei Pegelwechsel am Eingang ne Variable eins
> hochzählen.

Sind den die Impulse des Luefters denn mindestens 1ms lang ? Sonst wird 
das wohl eher nicht funktionieren.

von Andreas H. (heilinger)


Lesenswert?

jo, ich weiss...

Bei 217 U/sec ist jeder Pegel ca. 4,6ms lang, daher sollte das 
hinhauen...

von Helfer (Gast)


Lesenswert?

> Bei 217 U/sec ist jeder Pegel ca. 4,6ms lang, daher sollte das
> hinhauen...

Nicht unbedingt, Kai hat da schon Recht.

Theoretisch könnte ja pro Umdrehung ein superkurzes Pling vom 
signalgeber kommen und das könntest du beim Pollen ganz leicht 
verpassen.

von Andreas H. (heilinger)


Lesenswert?

ne, also die low- und die high-Phasen sind gleich lang...

Also für ne halbe umdrehung gibts nen high-Pegel, für die andere halbe 
Umdrehung nen low-Pegel und dann wieder von vorne...

von Karl H. (kbuchegg)


Lesenswert?

Andreas Heil schrieb:

> Es ist ja keine zeitkritische Aufgabe, es geht nur darum zu erkennen, ob
> der Lüfter sich dreht oder nicht, und das kann auch ruhig eine Sekunde
> später ausgewertet werden.

Wozu dann überhaupt die Drehzahl explizit bestimmen?

Du hast einen Eingangspin, Du willst wissen ob an diesem Pin Pulse 
vorhanden sind oder nicht.

Als Pin einen Interrupt Eingang wählen, der bei einer Flanke auslöst. In 
der zugehötrigen ISR wird ein Zähler auf (Hausnummer) 255 gesetzt. In 
deiner bereits vorhandenen Timer ISR wird dieser Zähler immer um 1 
erniedrigt (wenn er nicht schon 0 war). Erreicht der Zähler irgendwann 
tatsächlich 0, dann hat es für 255 * 1Millisekunden offenbar keinen 
Pin-Interrupt gegeben -> der Lüfter steht -> Warnlampe 
einschalten/Sirene heulen lassen/SMS an Obama schicken.

von Andreas H. (heilinger)


Lesenswert?

naja, ich will die Frequenz ja auch wissen, da der Lüfter einen gewissen 
Volumenaustausch garantieren soll. Und dies kann er eben nur, wenn er 
sich schnell genug dreht.

von Markus B. (up_marki)


Lesenswert?

Karl Heinz schrieb:
> Als Pin einen Interrupt Eingang wählen, der bei einer Flanke auslöst. In
> der zugehötrigen ISR wird ein Zähler auf (Hausnummer) 255 gesetzt. In
> deiner bereits vorhandenen Timer ISR wird dieser Zähler immer um 1
> erniedrigt (wenn er nicht schon 0 war). Erreicht der Zähler irgendwann
> tatsächlich 0, dann hat es für 255 * 1Millisekunden offenbar keinen
> Pin-Interrupt gegeben -> der Lüfter steht -> Warnlampe
> einschalten/Sirene heulen lassen/SMS an Obama schicken.

Hallo Karl Heinz
Nach fast 6 Jahren mal frischer Wind in das Ventilator-Thema :-)

Den Lösungsansatz finde ich toll. Möchte ich auch so machen. Die Frage, 
die sich mir jetzt stellt ist: Muss ich die SMS an Obama oder neu an 
Trump schicken? Hast Du auch noch die Nummer?

P.S. Ist das Projekt zum Laufen gekommen? Und läuft es nach 6 Jahren 
noch?

Gruss
up_marki

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.