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
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?
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?
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.
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.
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
>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...
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?
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.
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...
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.
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".
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 :-/
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.
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 ;)
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
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? :-/
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.