PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ideen für automatische PC-Lüfterdrosselung?



Dunuin
16.07.2011, 06:25
Moin,

Ich hab mir in den Kopf gesetzt selbst eine uC-gesteuerte Lüftersteuerung für den PC zu bauen, da ich mit den kaufbaren Fertigdingern nicht wirklich zufrieden bin.
Da wollte ich einmal fragen, ob da schon jemand Erfahrungen mit gemacht hat und mir ein paar Tipps geben kann.

Im Groben habe ich mir das so gedacht:


die Lüfter werden über eine Spannungsverringerung gedrosselt (bekomme leider keine PWM-Lüfter in 200mm, was natürlich viel einfacher zum Regeln wäre). Sollte ja auch später bei PWM-Lüftern klappen, da die auf 100% laufen sollten, wenn das 4. PWM-Kabel kein PWM-Signal erhält und man sie dann normal über die Spannung drosseln kann
Es gibt 3 Modi: Manuell, Automatik und "Volle Leistung", welche sich über einen Wippschalter mit 3 Stellungen einstellen lassen
bei "Volle Leistung" wird die Drosselung der Lüftersteuerung komplett umgangen und einfach nur die 12V vom Netzteil den Lüftern zugeführt
bei "Manuell" kann man die Drehzahl der Lüfter per Poti einstellen (ich dachte da an einen Spannungsteiler und dann Auslesen per ADC)
bei "Automatik" wird das PWM-Signal vom CPU-Lüfter-Anschluss am Mainboard angezapft, ausgewertet und dementsprechend die Drosselung der Gehäuselüfter eingestellt. Die ganzen Kaufdinger machen das ja über Temperatursensoren, aber ich würde es schon gut finden, wenn auch die Gehäuselüfter ordentlich mitdrehen, wenn die CPU ausgelastet wird, da die wesentlich zu dessen Kühlung beitragen
ich würde gerne meine 4 Lüfter einzeln steuern können, da es mal 200mm und mal 120mm Lüfter sind. Daher dachte ich an 4 einzelne Module, wo jeweils ein Attiny44A über Timer0 das Tachosignal auswertet und die Spannung regelt.
an einen Atmega644 für eine Warnung per Speaker bei Lüfterausfall, zum Auslesen der Mainboard-PWM und ggf. zum Kommunizieren per RS232 mit dem PC und Ansprechen eines LCDs hatte ich da auch schon gedacht
beim Hochfahren des Rechners müssten alle Lüfter ungedrosselt laufen, da die Spannung zum Anlaufen der Lüfter recht groß sein kann

Jetzt hätte ich da aber vor Allem die Frage, wie sich die Spannung am besten per uC regeln lässt. So wie ich das jetzt herausfinden konnte, hätte ich da 2 Optionen:

ein leistungsstarker Transistor mit einem RC-Tiefpass am Ende und PWM vom uC an der Basis. Da stelle ich mir jedoch gerade die Frage, ob man da das Tachosignal überhaupt noch auslesen kann, da der Strom ja nur Stoßweise kommt.
einen regulierbaren Spannungsregler wie den LM317. Da habe ich dann aber wohl das Problem, dass der nie voll auf 12V aufgedreht werden kann und ich da auch erst wieder eine Spannung erzeugen muss, um diesen zu steuern. Einen DAC haben die einfachen uCs von Atmel ja leider nicht.

Hat da vielleicht jemand ein paar Tipps, wie man kostengünstig per uC eine änderbare Spannung erzeugen kann, die auch so ca 5 Watt verträgt? Muss ja auch nicht so super genau sein.
Oder habe ich da sonst noch Probleme übersehen?

MfG

Dunuin

Bumbum
16.07.2011, 08:25
Hallo,

5 AVR für 4 Lüfter, und davon noch ein Mega644 finde ich völlig überdimensioniert. Ich würde sagen da reicht ein Mega8. Und der langweilt sich dann immernoch die ganze Zeit.

Zur Ansteuerung: Ein DAC ist wohl völlig überdimensioniert. Ich schätze der Hauptgrund für eine Regelung der Geschwindigkeit der Lüfter wird der Geräuschpegel sein. Aber ich denke mal der ändert sich gar nicht sooo stark, dass man eine stufenlose Regelung braucht. Vielleicht reichen schon 4 Stufen? Du müsstest einfach mal mit 4 verschiedenen Spannungen testen wie laut sich das anhört und ob sich mehr Stufen überhaupt rentieren. Diese 4 Stufen könnte man dann über 2 Ausgänge schalten. (binäre Addition)

Viele Grüße
Andreas

dussel07
16.07.2011, 08:39
Scheint mir ein wenig zu viel Aufwand für den geringen Funktionsumfang -

Eigentlich machst Du nichts anderes als einen manuellen Modus hinzu zu fügen.

Warum im Automatikbetrieb, so wie Du ihn dir vorstellst, nicht einfach das Signal vom Mainboard 1 zu 1 auf die Lüfter schalten?

Zum LM317
Hier die Ansteuerung nicht mit einer stufenlos verstellbaren Spannung vornehmen sondern zB. mit einem ULN2803 verschiedene Widerstände (Spannungen) schalten. So hast Du zwar keine stufenlose Verstellung der Drehzahl aber ein paar feste Drehzahlstufen reichen ja auch.
Für die Maximaldrehzahl einfach den LM317 umgehen (Vollastmodus) und die 12V direckt auf den Lüfter.

Ansonsten - Tiefpass mit nachgeschaltetem OP und Leistungstransitor.

Edit
war zu langsam -
Mist - nicht trödeln sondern zügig schreiben -

Dunuin
16.07.2011, 18:00
Warum im Automatikbetrieb, so wie Du ihn dir vorstellst, nicht einfach das Signal vom Mainboard 1 zu 1 auf die Lüfter schalten?

Weil die 4-poligen PWM-Lüfter eine eingebaute Drosselung haben, welche über den Duty Circle von dem PWM-Signal des Mainboards gesteuert wird.
Meine 200mm Lüfter sind da aber leider normale 3-polige Lüfter, welche keine eingebaute Drosselung besitzen und sich nicht per PWM regeln lassen.
Daher wollte ich gerne den Duty Circle vom Mainboard-PWM auslesen (0-100%) und darauf basierend dann die Lüfter selbst per Spannung drosseln.

Am liebsten wäre mir halt die Variante mit der Spannungserzeugung per PWM, wenn man da irgendwie ein stabile Spannung hinbekommt, so dass auch eine Messung des Tachosignals noch funktioniert. So ein Attiny44 für unter 2€ hätte nämlich 2 Timer und auch einen ADC. Da könnte man dann den ersten Timer nehmen, um die Drehzahl des Lüfters per Tachosignal auszulesen, man hätte noch den 2. Timer um 1 oder 2 PWM-Signale mit bis zu 31kHz zu erzeugen und halt den ADC um per Spannungsteiler die Stellung des Potis auslesen zu können. Da könnte dann so ein Attiny44 pro Lüfter die ganze automatische und manuelle Steuerung übernehmen, sofern man diesen per Atmega noch übermittelt, wie es gerade bei der Mainboard-PWM mit dem Duty Circle steht.

Bumbum
17.07.2011, 08:49
...mit ein bischen Nachdenken bei der Programmierung macht das ein Tiny in einem Timer für alle 4 Lüfter, und langweilt sich immer noch dabei...

Dunuin
09.10.2011, 19:12
Ich habe noch einmal nachgedacht und mir nun folgendes überlegt.

Das Ganze besteht aus 3 verschiedenen Modulen.

A.) Lüfterregulierungs-Einheit
Hier dachte ich an einen Attiny261 der auf 8 (oder vielleicht auch 16) MHZ läuft und die Spannung von 3 Lüftern per PWM erzeugt und auch dessen 3 Tachosignale auswertet.
Mit Timer1 erzeuge ich 3 8bit PWM-Signale ohne Prescaler im FastPWM-Modus. Dann sollte ich ja auf knapp über 31 kHz kommen, wo die Resonanz nicht hörbar sein sollte (wenn der Mensch nur bis zu 20 kHz hören kann). Hinter jedem PWM-Ausgang kommt dann ein Tiefpass und ein Leistungstransistor um die Rechtecksignale auszugleichen.
Den Watchdogtimer nutze ich dann zur Zeitmessung und den Timer0 nur Tachosignalmessung. Dazu gehe ich mit jedem der 3 Tachosignale an einen Transistor, welche dann alle das Tachosignal auf T0 leiten, sobald ich über 3 Pins am uC Strom auf die Basen gebe. So kann ich dann die Tachosignale multiplexen und Timer0 zählt die jeweilige Drehzahl im vom Watchdog gemessenen Intervall.

B.) PWM-Mess-Einheit
Da ich ja die Gehäuselüfter passend zum Steuersignal von Grafikkarten- und CPU-Lüfter regeln will, muss ich ja den Dutycirce von den Steuersignalen herausfinden. Hier ist mir noch nichts so wirklich gescheites eingefallen.
Zum einen könnte ich wohl über den Input Capture Mode eines Counters den Dutycircle auslesen, aber das müsste wirklich schnell sein, da das Steuersignal bei, glaube ich, zwischen 30 und 40 kHz liegt und alles ausgewertet und gespeichert sein muss, bevor die nächste Messung reinkommt.
Meine 2. Idee wäre nun gewesen das umgekehrt wie bei der Lüfterregulierung zu machen. Ich nehme das Steuersignal über einen Optokoppler und jage es durch einen Tiefpass und Spannungsteiler und messe dann per ADC die Spannung aus.

C.) Steuereinheit
An der Steuereinheit (Atmega644P habe ich noch rumliegen) sollen dann ein Text-LCD, ein Speaker sowie etliche Taster dranhängen zur Ein-/Ausgabe. Die Steuereinheit regelt dann alles und arbeitet als I²C-Master. Sie empfängt dann die Ergebnisse von den Lüfter-Steuersignalen (PWM-Mess-Einheit dann als I²C Slave) und die Umdrehungen pro Minute (Lüfterregulierungs-Einheit auch I²C Slave) und sendet diesen auch den Dutycircle, den die Lüfterregulierungs-Einheiten ausgeben sollen.
So müsste man dann das ganze auch gut erweitern können, wenn es mehr als 3 Lüfter zu regulieren gilt. Bei meinen 4 Lüftern müssten dann also 2 von den Lüfterregulierungs-Einheiten rein.

Düfte das so in etwa klappen oder habe ich da noch einen Denkfehler?

Bumbum
10.10.2011, 06:25
...ich bin immer noch der Meinung dass dazu ein einziger Atmel mehr als ausreichend ist.

Hast du dir mal den Aufwand überlegt alle drei zu programmieren und zu debuggen? Wenn du die Kommunikation entwickelst musst du ständig zwischen mindestens zwei Programmen umschalten und auch noch umstecken. Das habe ich bis jetzt einmal gemacht, und das nervt gewaltig und führt zu Fehlern.

Ich würde auf die AVR's vertrauen und alles mit einem Chip lösen.

Die Aufgabe hört sich wirklich zu "popelig" an, um damit mehrere µC zu bemühen.

Viele Grüße
Andreas

Dunuin
10.10.2011, 16:36
Naja, ich brauch da halt mindestens 4 PWMs, einen Counter für die Drehzahlmessung der 4 Lüfter und und dann noch einen Timer, welcher die 2 Dutycircles ausliest. Dann gehen noch 5 Pins fürs Display, 1 Pin für den Speaker, 4 Pins für die Knöpfe und 5 Pins fürs Multiplexen wegen Lüfterdrehzahl und Steuersignal drauf. Das da wird das ganze mit einem Atmel schon ziemlich eng, besonders wenn man bedenkt, wieviel da parallel gemacht werden muss. Ansprechen des LCDs etc dauert ja auch etwas.

Bumbum
10.10.2011, 17:19
Wenn dir die Pins bei einem MegaAVR nicht reichen, dann weiß ich auch nicht. Da kannst du das LCD ja sogar mit 8 Pins anschließen!

Was die Ressourcen angeht: Die Timer müssen halt gut durchdacht werden und sind dann IRQ-ausgelöst. Da ist das LCD-ansprechen überhaupt nicht relevant. Wenn was zeitkritisches ansteht muss das per IRQ erfolgen, dann wird das alles kein Problem.

Ich würde einen kurzen Timer planen, in dem dann die PWM-Signale erzeugt werden. Einfach den Timer auf die gewünschte Frequenz z.B. 30 Hz berechnen und 4 if-Abfragen, ob der Pin High gesetzt werden soll für den entsprechenden PWM-Ausgang. Wenn der Timer dann resetet wird, alle Ausgänge wieder auf Low.
Dann kommt noch ein weiterer Timer als Zähler für deine Duty-Cycles. Diese legst du am besten an die INT0 und INT1 Eingänge und liesst dann beim IRQ immer nur den Zählerstand ab. Fertig.
Bis jetzt wird quasi noch keine Prozessorlast erzeugt.

LCD + Taster macht dann der AVR gähnend im Hauptprogramm und langweilt sich geschätzt 80% in Warteschleifen.

Was du mit dem Multiplexen meinst, weiß ich nicht genau, sollte aber egal wie auch noch locker zu realisieren sein.

Viele Grüße
Andreas

Dunuin
11.10.2011, 00:51
Dann kommt noch ein weiterer Timer als Zähler für deine Duty-Cycles. Diese legst du am besten an die INT0 und INT1 Eingänge und liesst dann beim IRQ immer nur den Zählerstand ab. Fertig.
Bis jetzt wird quasi noch keine Prozessorlast erzeugt.

Aber ich will ja den Duty-Cycle haben, also das zeitliche Verhältnis zwischen einem hohen und tiefen Pegel, da bringt es mir doch nicht viel, wenn ich messe, wieviele Interrupts in einem Zeitraum ausgeführt werden. Das Steuersignal läuft auch mit rund 25 kHz und wenn des nun eine Auflösung von 8 Bit hat und ich z.B. einen Duty-Cycle von 1% auslesen will, dann muss der Timer im Capture Mode ja schon Veränderungen im 3,2 MHZ Takt feststellen können. Da wird das ganze schon echt zeitkritisch, weil bei jedem Flankenwechsel ja noch der Wert des Timers gespeichert und der Duty-Cycle ausgerechnet werden muss, bevor der nächste Takt kommt.

Und dann ist da auch wieder das Problem, dass so ein Atmega ja nur 3 Timer hat, wovon dann 2 Timer durch die PWM belegt sind (geht ja nur 2x PWM pro Timer).

Bumbum
11.10.2011, 06:20
Ich glaube du liest meine Postings nicht richtig, bzw. verstehst die Lösungen noch nicht, deswegen willst du auch mit Kanonen (3 AVRs) auf Spatzen schießen.

Im Atmel gibt es 16-Bit Timer, die mit FCPU getaktet werden können. Mit ein paar Befehlen ist das ein 32-Bit-Counter. Wenn dir das als Auflösung nicht reicht, dann weiß ich auch nicht. Im Int0 bzw. Int1 merkst du dir einfach die Timerwerte und hast mit einer einfachen subtraktion deinen Duty-Cycle. Das sind beim 16-Bit-Timer 2 Befehle im IRQ. Aber 3,2 MHz wirst du egal mit welchem Atmel sowieso nicht messen können. Da müsste man über eine Glättung des Signals mit einem Kondensator mit einer analogen Auswertung nachdenken.

Und PWM habe ich dir schon erklärt. Da reicht der popeligste 8-Bit-Timer. Beim Überlauf alle Ausgänge auf 0 und im Timer mit z.B. 30Hz prüfen, ob der PWM-Wert erreicht ist und den entsprechenden Ausgang auf High. Fertig. Sind 4 if-Abfragen, die 30x die Sekunde ausgeführt werden müssen.

Viele Grüße
Andreas