Lüfterregelung

Wer kennt das nicht: Am Mainboard im PC kann man zwar meistens zwei bis drei Lüfter anschließen, die Drehzahl auslesen und dann vielleicht noch die Drehzahl nur vom CPU-Lüfter steuern. Wenn man die anderen Lüfter steuern will, steht man somit sehr schnell im dunkeln, obwohl es bei modernen Computern immer wichtiger wird, die Hardware richtig zu kühlen. Das ganze soll dann auch noch so leise wie möglich, und so laut wie nötig sein. Natürlich gibt es Steuerungen mit denen man vorne an am Gehäuse herumdrehen kann - der PC selbst wird dann meistens eher zur Nebenbeschäftigung (ok, da kann ich jetzt nicht aus Erfahrung sprechen). Zum Schluss vergisst man dann vor Renderaufgaben des PCs den einen dummen Lüfter hochzudrehen, wodurch sich die Hardware eigentlich nur unnötig strapaziert wird - oder ein Lüfter bekommt so wenig Strom, dass er aufhört zu drehen. Da er kurz vor dem Andrehen ist, werden die Spulen warm, die Lebensdauer wird eingeschränkt, blablabla...

Das muss man doch irgendwie lösen können - die Lüfter sollen überwacht werden und je nach Situation entsprechend geregelt werden.
Meine erste Idee war: AD-Wandler zur Drehzahlregelung und Frequenzzähler für den Tacho des Lüfters.
Also auf die Suche nach einem Software-Frequenzzähler für irgendeinen PIC, extra einen Frequenz-Spannungswandler mit ADC hinten dran oder sonst was ist irgendwie zu aufwändig und auch ungenau.
Frequenzzähler in cc5x sind etwas Mangelware, da der Code viel zu langsam arbeitet. Wenn sich der Mikrocontroller den Takt andauernd verarbeitet kommt man bei IIRC 4MHz Takt auf eine Abtastrate von höchstens 3kHz, Lüfter drehen aber mit teilweise bis zu 6000 und mehr Umdrehungen pro Minute, was allerdings auch noch nicht bedeutet, dass der Takt so am Ausgang anliegt (Divisor!). Frequenzteiler an den PIC, der dann die ganze Zeit an dem Takt herumrechnet und den Lüfter auch noch regeln soll... Auweia, das wird übel!

Also ein bisschen nach anderen Lösungsmöglichkeiten umsehen. Ach, ich liebe Maxim! Auf Anhieb habe ich einen kleinen IC gefunden, der das viel besser als ein PIC kann: der MAX6650. Der IC ist wirklich nett - zwar wieder im winzigen µMAX-Gehäuse aber mit ein bisschen Lötkunst ist auch das zu bewältigen. Auch angenehm: das Interface - er mag I²C, an dem ich ja auch sehr großen Gefallen gefunden habe.
Also mal einen bestellen und damit eine Testschaltung nach AppNote aufbauen:

1. Versuch mit dem MAX6650
Nicht ganz gut zu erkennen, aber der IC wurde mit Cu-Lackdraht in eine IC-Fassung gelötet.
Ist zwar eine fummelige Angelegenheit, dafür kann man den IC wie einen im DIP-Gehäuse auf Lochraster verwenden.

Im Rohzustand dreht der Lüfter auf 100% und macht das, was er am Besten kann: Lärm.
Also schnell ein Programm in VB aufsetzen, das mit dem IC kommunizieren kann.
Nach etwas herumprobieren war es auch schon möglich, den Lüfter zu regeln!
Wenn ich den Lüfter von 100% auf 50% stellte, sank die Drehzahl nicht schlagartig nach unten, nein - die eingebaute Regelung ließ den Lüfter langsam auf 50% fallen. Als ich die Drehzahl auf 0% sank dauerte es ein bisschen länger, die Drehzahl pendelte sich aber bei ~800RPM ein. Was daran besonders ist? Als ich den Lüfter mal ein bisschen gewendet habe, sah ich am Labornetzteil, dass der Stromverbrauch etwas anstieg - was passiert da? Die Betrachtung des DAC-Registers im IC brachte Aufklärung: der IC versuchte die Drehzahl zu halten und somit einen (später im PC gefährlichen) Lüfterstopp zu vermeiden. Nicht schlecht, Herr Specht! Der "Oha"-Effekt kam, als ich die Drehzahl wieder erhöhte - erst auf 20% - der Lüfter drehte wieder bisschen schneller und der Wert des ADCs stieg langsam an. Als ich die Drehzahl auf 100% aufdrehte, schnellte der ADC in kürzester Zeit nach oben und der Lüfter drehte in kürzester Zeit mit voller Drehzahl - mhmm, eine Kickdown-Funktion.
Eines steht jetzt schon fest: Das Teil muss irgendwie verbaut werden! Preislich ist er auch ganz ok, bei Maxim unter 3$. Leider muss man ihn bei Maxim direkt bestellen, da eigentlich keiner der üblichen Distris ihn führt. In kleinen Stückzahlen ist das bisschen blöd, aber Reichelt kann man mal fragen, ob sie den übrigens 5x5mm großen IC ins Programm aufnimmt...

Nachdem ich so fasziniert von dem IC war, mussten natürlich Ideen für eine Lüfterregelung her. Also das Thema mal in #hobbyelektronik bisschen durchkauen. Irgendwie hatten L, LAIE nicht so viel Begeisterung, Robert  desto mehr!

Hier ein paar Ideen:
- klar, den MAX6650 als Regler für die einzelnen Lüfter
- Modulbauweise, damit man je nach Bedarf Reglerplatinen zustecken kann
- Temperaturüberwachung im PC (DS75, DS1775?)
- Autonome Regelung über einen Mikrocontroller und Regelung über Software im PC
- Anschluss an den SMBus im PC (wurde aber vorab zurückgestellt, da das Risiko am Anfang wohl zu hoch ist...)
- Einbau in den 3,5''- oder 5,25''-Schacht als Frontpanel mit LCD, Tastern und pi-pa-po
- Watchdog für den PC (Reset, wenn das Betriebssystem abschmiert)
- Überwachung der Spannungen im PC (für Diagnosezwecke, könnte man aber auch über PC-Software lösen)
- Anbindung an die serielle Schnittstelle, später dann über USB mit einem FTDI-USB-IC
- Dimmer für Innenbeleuchtung (mit DS1050 [PWM], eigentlich Schmarren aber manche wollen/brauchen das ja)
- OpenSource! Allerdings nur für den privaten Gebrauch - Robert und ich wollen uns das Recht vorbehalten, das Zeug zu verkaufen, wenn es dann doch mal was wird ;)

Das ganze hört sich hier schon sehr erstrebenswert an. Nur wie umsetzen?
Mit PICs stößt man schon sehr schnell an eine gewisse Grenze - cc5x ist als Freeware-Version ganz nett, wenn es aber über 1024 Assembler Befehle im Programm hinausgeht, muss man den Code teilen, kompilieren, linken und dabei wahrscheinlich verzweifeln. "Umgehen" kann man das zwar mit einer Vollversion von cc5x aber ich persönlich sehe es nicht ein, für ein bisschen Freizeitprogrammieren an den, mit C-Programmen gefütterten und dadurch langsamen PICs 250$ auszugeben.
Also nach einer alternative umsehen.
Beim stöbern auf Mikrocontroller.net habe ich öfters von einem C-Compiler für AVRs gelesen, der kostenlos ist - also noch einmal vorbeischauen...
Genau, Win-AVR heißt der Compiler, der ein etwas umgebautes GCC ist.

Bei dem Mikrocontroller fiel mir am Anfang die Auswahl etwas schwer, Atmel hat einiges zu bieten. Viel Speicher wird das Ganze wohl nicht brauchen, Lüfterregelung, bei der das meiste ein externer IC übernimmt, ein paar andere I²C-Devices, Anzeige auf einem LC-Display, UART - da braucht man wirklich nicht viel Speicher, 8K sollten für den Anfang also reichen. Erster auf der Seite ist da der AtMega8 - seine Features sind im Gegensatz zu so manchen PIC sehr schön: 8KB Programmspeicher, 0.5KB EEProm, 1KB SRAM, 23 I/Os, 3 Timer, 3 PWM-Ausgänge, Echtzeituhr, SPI, UART, und, und, und... zudem reicht bei AVRs ein einfaches Dongle am Parallelport zum Programmieren - also keine aufwändigere Brennschalung wie bei den PICs.

Zwischenzeitlich ist auch schon ein bisschen etwas in EAGLE entstanden:

Stromlaufplan des Lüftermoduls
Stromlaufplan des Lüftermoduls. der Zustand von ADD legt die Adresse des I²C-Devices fest.
Da nur 4 verschiedene möglich sind (Vdd, GND, offen, 10k gegen GND) wende ich einen simplen Trick an:
Die ICs werden dynamisch adressiert, sprich alle inaktiven kommen auf GND-Level, nur der aktive wird mit Vdd belegt.
Damit kann man prinzipiell beliebig viele der ICs kaskadieren.

Layout des Lüftermoduls
Das Modul als Board. die Kantenlänge der Leiterplatte beträgt nur 20.625x41.265mm. Mit einem anderen Transistor würde es noch kleiner werden, allerdings habe ich noch keinen besser geeigneten gefunden.


Sie sieht der Dimmer aus. Wie der MAX6650 ist der DS1050 ein I²C-Device. Der Pulsweitenmodulator hat 32 Stufen, das Taktverhältnis lässt sich also in 3.23%-Stufen einstellen.


Das Layout ist wieder in SMD, der IC in angenehmen SO8. Die Adressierung findet über die Jumperleiste statt, der Ausgang ist ein offener Kollektor gegen 5 und 12V. Strombegrenzung für LEDs ist nicht vorhanden, muss also noch am Strang angelötet werden.

Die Module werden einfach an der Hauptplatine angesteckt. um die MAX6650 zu adressieren, wird ein I²C-Portextender verwendet. Eigentlich überdimensioniert aber wenn der Bus schon am IC vorbeiläuft ;)

Das war es vorerst einmal - bis nach meinem FachAbi leg ich das Projekt auf Eis, da ich mich erst in die Programmierung von AVRs einarbeiten muss.