Forum: Mikrocontroller und Digitale Elektronik 6 Tachosignale von PC-Lüftern messen


von Andreas Galauner (Gast)


Lesenswert?

Hallo,
Ich will mir einen kleinen Datenlogger für meinen Linux Server bauen.
Da möchte ich u.a. 6 Lüfterdrehzahlen messen.
Allerdings hat mein Atmega16/32 nur 2 externe Interrupts, sodass ich
das ganze über eine Softwarelösung implementieren muss.

Ich hab aber keine Ahnung, wie ich das machen soll.
Kann mir jemand kurz in Worten oder einem Programmablaufplan erklären,
wie ich da am besten rangehe? Anderen Prozessor würde ich nur ungern
benutzen, weil ich noch genug Mega16 und 32er da hab.
Die Signale hängen an einem normalen Eingang.

http://www.stefan-moench.de/pc/avr_lueftersteuerung/avr_lueftersteuerung.htm
Da oben habe ich eine Lösung mit 4 Lüftern gefunden, allerdings kann
ich kein/kaum Assembler und ich verstehe den Assembler Code überhaupt
nicht.
Ich möchte das ganze gerne in C programmieren.

Wäre super, wenn mir jemand einen Stupps geben könnte!
Vielen Dank,
Andreas

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Man könnte das Tachosignal über ein RC-Gleid schicken und dann per
AD-Wandler die Drehzahl messen. Von den AD-Wandlern hat der Mega16/32
ja 8 Stück...
Du könntest aber auch mit einem Timer den Port an dem die Lüfter hängen
in regelmässigen Abständen (z.B.10µs) einlesen und so die Drehzahl
feststellen.
Du könntest auch die Tachosignale mit einem Multiplexer an den
ICP-Eingang schalten und dann immer die Tachosignale der Reihe nach
"checken".

Genug Stupps?

von Andreas Galauner (Gast)


Lesenswert?

Am liebsten wär mir eine Software Variante, also die mit dem
regelmäßigen Einlesen über die Timer.
Das Problem ist, dass ich nicht weiß wie. Es kommen nur kurze Impulse
über die Tacholeitung und die muss ich ja in einer bestimmten Zeit
zählen.
Bei einem Lüfter geht das ja recht einfach über nen externen Interrupt,
aber wie mach ich das am besten bei 6?

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Hannes Lux hat auf seiner Seite (Link weiß ich nicht aus dem Kopf) einen
Fahrtregler für den Modellbau entwickelt, der nach dem Prinzip arbeitet,
dass er alle 10µs den kompletten Port einliest. Wenn ein Eingang dann
eine 1 hat, zählt er für diesen eine Variable hoch, die er dann bei
einer 0  verarbeitet. Ist aber in Assembler geschrieben.

Wenn man sich den Schaltplan von Stefan Moench anguckt, dann sieht man,
dass er zwei Timer-Eingänge, den ICP-Eingang und einen Interrupt-Eingang
benutzt.
Interessant wäre halt zu wissen, mit welchen Frequenzen zu rechnen ist.

von Andreas Galauner (Gast)


Lesenswert?

Naja... Ich denke so 200Hz ist recht optimistisch. Damit müsste ich bis
6000rpm kommen (haben die Lüfter nicht... einer hat max. 1100rpm und
die anderen max. 1800rpm):

2 Pulse pro Umdrehung * max. 6000 rpm / 60 sekunden = 200Hz
Oder liege ich da falsch?
Dann könnte man eigentlich sogar runter auf 100Hz. Dann kann ich die
Lüfter auch schon sauber messen, wenn die max.1800rpm haben.
Wobei die 6000rpm natürlich universeller wären (ist mir lieber).

Es müssen auch nicht alle Lüfter gleichzeitig aktualisiert werden. Das
kann ruhig nacheinander geschehen. Sagen wir mal alle 5 Sekunden ein
Lüfter. SO extrem genau brauch ich es gar nicht.

von Michael Wilhelm (Gast)


Lesenswert?

Dann pack die 6 Signale doch auf einen 74HC4051 und scanne die dann der
Reihe nach durch. Der Ausgang kann dann ja auf einen externen Int
gehen.Leg ein Datum an, mess die Zeit und schalte weiter, wenn die
Daten ok sind.

MW

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Es müssen auch nicht alle Lüfter gleichzeitig aktualisiert werden. >Das
kann ruhig nacheinander geschehen.
In diesem Fall würde ich auch Einen Multiplexer vorschlagen. Nicht
unbedigt den 4051, aber den kann man auch nehmen.

>Sagen wir mal alle 5 Sekunden ein Lüfter. SO extrem genau brauch ich
>es gar nicht.

Naja, dann würde alle 30 Sekunden die Drehzahl akutalisiert werden.
Etwas schneller darf es schon gehen.
Entweder misst man die Periodendauer oder die Anzahl der Impulse
innerhalb einer gewissen Zeit. Wobei die 2. Variante schneller zu einem
Ergebnis führen kann, wenn man die Torzeit geschickt wählt. Aber
Mikrocontroller können auch ganz gut rechnen...

von Andreas Galauner (Gast)


Lesenswert?

Das Problem ist, dass ich das alles wieder bestellen muss, weil wir hier
in der Nähe leider keinen Elektronikdealer haben.

Für die Software Variante brauche ich nicht viel. Nur die Pullup
Widerstände. Die Hardware dafür hab ich mir schon mit Display, Taster
und Max232 auf nem Steckbrett gebastelt.
Problem ist halt nur, wie ich die Lüfter polle...

Obwohl... idee hab
Ich lass den Kram in nem Timer laufen... Messe wie oft der Timer
durchläuft, bis ein Signal vom Lüfter kommt und errechne die Zeit. Dann
gehts mit dem zweiten Lüfter weiter: Es wird wieder gemessen, wie oft
der Interrupt aufgerufen wird, bis das nächste Signal kommt und die
Zeit errechnet....
usw.

Ich stelle mir nur grade die Frage, ob der Prozessor dann noch Zeit für
so Sachen wie Display, Taster, Pieper oder UART hat. Weil der Timer ja
relativ schnell laufen muss oder?

von Andreas Galauner (Gast)


Lesenswert?

Hmmm eine Sache ist mir doch noch eingefallen...
Sollte einer der Lüfter nicht anworten, hängt der Prozessor ewig in
einer Schleife fest.
Dann müsste ich noch eine maximale Anzahl der Schleifendurchläufe
einbauen (die besagten 5 Sekunden oder so), bis zu der auf einen High
Impuls gewartet wird.

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Ne ganz "fiese" Methode wäre es, in einer Schleife einen Eingang
abzufragen:
Man wartet, bis der ausgewählte Eingang eine Flanke aufweist.
Dann startet man den Timer und wartet, bis der Eingang die gleiche
Flanke erneut aufweist (Periodendauer Messung).
Dann stoppt man den Timer und speichert dessen Wert (und rechnet damit
rum.
Wenn alle Tachosignale ausgewertet wurden, kann man sich mit der
Anzeige etc beschäftigen.

Das ist aber Mist, weil der Controller die meiste Zeit mit Warten
beschäftigt ist.

Wenn man aber den Timer mit einer "Sample-Frequenz" betreibt, die
doppelt so hoch wie die maximale Drehzahl ist (Shannon-Theorem), dann
kann man in der Timer-ISR alle Eingänge gleichzeitig einlesen und die
Flanken auswerten (Vergleich mit vorheriger und aktueller
"Messung";Exclusiv-Oder könnte helfen...).
Darauf müsste man dann in der Main nur noch reagieren...
Bei 400Hz Abstastfrequenz käme man auf eine Periodendauer von 2,5ms -
das ist für einen Mikrocontroller eine Ewigkeit...

von Andreas Galauner (Gast)


Lesenswert?

Ich denke ich werd das so machen, wie ich das oben beschrieben hab.
Das find ich am einfachsten.

Prescaler von 1024 auf den 8-Bit Timer und dann hat der Prozessor genug
Zeit für ändere Sachen.

von Philipp Burch (nicht einglogt) (Gast)


Lesenswert?

Ich hab's bei mir folgendermassen gelöst (Aber auch in ASM):
Ich lassen einen Timer bei ca. 4kHz (Können auch weniger sein, aber der
läuft schon für was anderes) Überlauf-Frequenz laufen. Dann hab' ich da
einen Zähler drin, der mir alle zwei Sekunden (ungefähr) auslöst. In
jedem Durchlauf teste ich, ob da ein Impuls gekommen ist (Wert
zwischenspeichern, sonst hast du einige hundert Impulse nacheinander)
und zähle damit einen Zähler (Ein byte im RAM) pro Lüfter hoch. Und
alle zwei Sekunden verschiebe ich den aktuellen Wert dieser Zähler
in's Speed-Register und lösche sie wieder. Funktioniert recht gut.
Interrupts kannst du für sowas übrigens eh vergessen, das Zeug
"prellt".

von Andreas Galauner (Gast)


Lesenswert?

Hey, das ist noch einfacher. Das lässt sich ja auch genau so einfach in
C lösen.
Hoffentlich komme ich heute Abend mal dazu das zu programmieren :-/

von D. W. (dave) Benutzerseite


Lesenswert?

Was soll das Programm denn sonst noch machen?

Ich hab mal ne Lüftersteuerung in ASM geschrieben. Ich hab die
Hauptschleife so klein wie möglich gemacht, waren dann so 10 Takte, und
hab den Lüfterport eingelesen, XOR und dann geschaut, ob sich was
geändert hat. Funktioniert gut bis paar tausend Umdrehungen.

von Andreas Galauner (Gast)


Lesenswert?

Das Ding soll noch ein paar Daten, wie aktuellen Festplattenspeicher
usw. anzeigen und auch da ggf. warnen. Dann sollen die Daten an einen
PC geschickt werden und regelmäßig in eine Datenbank geschrieben
werden.

Irgendwann bau ich vielleicht noch ne Regelung ein.

Achja und man soll Lüfter per Taster ein- und ausschalten können.
Evtl.bekommt das Ding noch einen Watchdog, dass den Server neustartet,
wenn er ihn nicht regelmäßig zurücksetzt. Das werd ich über ein
einfaches Cronscript machen. Das schmiert nie ab und funktioniert
zuverlässig ;)

von Bjoern B. (tishima)


Lesenswert?

Moin!
Hab vor einiger Zeit ner Lüfterdrehzahlmessung rumgespielt.
Meine Lösung im Timer0 den Eingang abgefragt und die Periodendauer
gemessen. Alkso wie deine Idee von 10:35
Da sollte eigentlich noch genug Luft sein alle anderen Eingaenge
zyklisch abzufragen und den Rest zu bewerkstelligen.
Drann Denken, es gint Lüfter mit
2 Impulsen und 4 Impulsen (evtl auch noch andre) pro Umdrehung.

gruss,
Bjoern

von Philipp B. (philipp_burch)


Lesenswert?

Ich würde allerdings empfehlen, die Umdrehungen pro Zeit zu messen, da
du dir dann die Mathematik ersparen kannst. Nicht dass das nicht gehen
würde (In C sowieso nicht wirklich schwer), aber man muss ein Programm
meiner Meinung nach ja nicht unnötig aufblähen. Du brauchst ja wohl
kaum 2000 - 3000 Messwerte pro Minute ;)
Die Unterscheidung zwischen den verschiedenen Lüftertypen (Anzahl
Impulse pro Umdrehung) habe ich in der Software für den PC gemacht. Da
sieht man ja, was etwa realistisch ist.

"Das Ding soll noch ein paar Daten, wie aktuellen Festplattenspeicher
usw. anzeigen und auch da ggf. warnen. Dann sollen die Daten an einen
PC geschickt werden und regelmäßig in eine Datenbank geschrieben
werden."

Das Dingens holt sich die Daten vom PC und schickt sie nachher wieder
zurück? :-/

von Andreas Galauner (Gast)


Lesenswert?

Nein, die Daten, die vom PC kommen werden angezeigt.
Die Daten, die aus der Lüftermessung kommen werden angezeigt, zum PC
versandt und angezeigt.

Und geloggt wird auf dem PC sowieso alles.

Das Ding ist nur dafür da die Drehzahlen zu erfassen, die Lüfter zu
schalten und Warnungen anzuzeigen und dabei n bischen zu piepsen ;)

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.