|
Für einen Silent-PC benötigte ich eine
Lüftersteuerung,
die an zwei Orten im PC-Gehäuse die Temperatur misst, und bei
Bedarf zwei den Messstellen zugeordnete Lüfter in Betrieb
nimmt.
Dabei soll die Drehzahl des Lüfters proportional mit der
Temperatur
steigen. Unterhalb der Einschalttemperatur sollen die Lüfter aber
abgeschaltet werden.
Im laufenden Betrieb sollen die Parameter der Lüfterregelung
über
eine RS232-Schnittstelle abgefragt und verändert werden
können.
(Eine einfachere Lösung ohne Display und ohne PWM findet
man hier.)
Die Lüftersteuerung hat 2 unabhängige Kanäle mit
jeweils
einem Temperatursensor und einem Lüfteranschluss.
Die Temperatur wird mit einer Genauigkeit von 1 K gemessen. Unterhalb
einer einstellbaren Einschalttemperatur (z.B. 35°C) bleibt der
Lüfter
aus. Beim Erreichen der Einschalttemperatur wird der Lüfter
eingeschaltet,
wobei die Lüfterspannung nur 50% (von 12V) beträgt. Bei
steigender
Temperatur steigt die Spannung um 4% pro K, bis sie bei ca. 48°C
schließlich
100% (12V) erreicht.
Auf einem 2-stelligen LED-Display kann die Temperatur im Bereich von
-9°C .. 99°C angezeigt werden.
Beim Überschreiten einer Maximaltemperatur (z.B. 63°C) wird
ein Alarmton ausgelöst.
Sinkt die Temperatur ab, dann wird die Lüfterspannung wieder verringert, bis sie bei der Einschalttemperatur einen Wert von 50% erreicht. Sinkt die Temperatur weiter ab, so bleibt die Spannung erst einmal weiterhin bei 50%. Wird die Einschalttemperatur um den Hysterese-Wert unterschritten, wird der Lüfter abgeschaltet. Die Einschalttemperatur liegt also um den Hysteresewert über der Ausschalttemperatur. Das vermeidet ständiges ein-aus-Schalten bei Temperaturen um den Einschaltpunkt herum. Die Hysterese sollte nur einige Kelvin betragen.
Die Einstellung der Einschalttemperaturen für die beiden Kanäle, wie auch die Kalibrierung der Temperatursensoren erfolgt mit einem einfachen Terminalprogramm über die RS232-Schnittstelle.
Zur Steuerung benötige ich einen PIC mit 2-ADC-Eingängen, 2 PWM-Ausgängen und einer USART. Meine Wahl fiel auf den 16F876 bzw. 16F873.
Die obrige Schaltung stellt den Controller dar, der noch um die Endstufen
zur Lüfteransteuerung ergänzt werden muss.
Als RS232-Treiber kommt z.B. ein richtiger MAX232-Schaltkreis
oder ein vereinfachter Transistortreiber in Frage.
Wer lediglich eine temperaturgeregelte Lüftersteuerung benötigt, kann die oben gezeigte Schaltung gewaltig abspecken:
Der ADC des PIC misst (ohne besondere Maßnahmen) externe Spannungen mit einer Auflösung von 4,883 mV/digit. Eine Änderung der Eingangsspannung um 4,883 mV verändert den vom ADC ausgegebenen Zahlenwert also um 1.
Aus diesen beiden Zahlen ergibt sich, dass die Änderung des
ADC-Ergebnisses
um 1 einer Temperaturveränderung um 0,633 Grad entspricht. Deshalb
ist es nötig, das ADC-Ergebnis im PIC durch den Korrekturwert
1,579
zu dividieren (oder mit 0,633 zu multiplizieren), um ein Ergebnis zu
erhalten,
das sich bei einer Temperaturveränderung um 1 Grad um den Wert 1
ändert.
Diese Zahl kann aber noch nicht direkt angezeigt werden, da sie um ca.
150 über der Temperatur in °C liegt (Offset).
Wenn man aber noch diese 150 subtraiert, und die Zahl aus dem
binären
Zahlensystem in eine Dezimalzahl umrechnet, hat man eine Anzeige in
°C.
Der Linearitätsfehler des PTC liegt im interessierenden Temperaturbereich (0°C..+100°C) bei unter 1 Grad, allerdings wird der ADC an der Grenze seiner Auflösung betrieben. Deshalb sollte der ADC die Sensorspannung mehrfach messen, und dann aus diesen Messungen der Durchschnitt gebildet werden, um Rauschen zu unterdrücken. Ich messe deshalb jeweils 64 mal.
Schwankungen der Beteriebsspannung zwischen 4,0V und 6,0V wirken sich praktisch nicht auf die Messgenauigkeit aus, da PTC und ADC aus der gleichen Spannung versorgt werden.
Die anfängliche Multiplikation des ADC-Ergebnisses mit 64 lässt sich mit der Mehrfachmessung verbinden, die zur Mittelwertsbildung ohnehin nötig ist. Die Sensorspannung wird einfach 64 mal gemessen, und alle 64 Resultate zusammenaddiert. Da jedem Messwert durchschnittlich 1/2 Bit fehlt (Das nächstkleinere Bit unterhalb des Bit0 vom ADC könne 0 oder 1 sein. Im Durchschnitt ist es also 1/2.), ist ein Korrekturwert von 32 zur Summe hinzuzuaddieren.
Die Division durch 101 kann durch wiederholte Subtraktion von 101 erfolgen. Um als Ergebnis einen Rundungswert (und nicht ein am Dezimalpunkt abgeschnittenes Ergebnis) zu bekommen, ist vor der Division auf die zu dividierende Zahl 50 aufzuschlagen (ca.101/2).
Vom Ergebnis der Division ist der Sensor-Offset 150 zu subtrahieren. Dieser Offset kann von PTC zu PTC etwas anders ausfallen, und hängt auch vom konkreten Wert von R13/14 ab. Der präzise Wert ist durch eine Kalibrierung zu ermitteln. Dazu wird einfach eine bekannte Temperatur (Eiswasser=0°C) gemessen, und der Offset am Display abgelesen. Der Offset kann im Assemblerquelltext oder per Terminalprogramm leicht geändert werden.
Temperatur | Widerstand des PTC | Strom durch PTC | Spannung am ADC | Resultat des ADC | Anzeigewert |
-55°C | 490 Ohm | 1,567 mA | 0,7680 V | 157 | - 50 |
-40°C | 567 Ohm | 1,530 mA | 0,8678 V | 177 | - 37 |
-20°C | 684 Ohm | 1,477 mA | 1,0106 V | 206 | - 18 |
0°C | 815 Ohm | 1,422 mA | 1,1593 V | 237 | 0 |
+20°C | 961 Ohm | 1,366 mA | 1,3125 V | 268 | + 20 |
+40°C | 1122 Ohm | 1,308 mA | 1,4678 V | 300 | + 40 |
+100°C | 1696 Ohm | 1,137 mA | 1,9290 V | 395 | + 100 |
+120°C | 1915 Ohm | 1,083 mA | 2,0748 V | 425 | + 119 |
+140°C | 2124 Ohm | 1,036 mA | 2,2015 V | 450 | + 135 |
+150°C | 2211 Ohm | 1,018 mA | 2,2511 V | 461 | + 142 |
Die LED-Anzeige arbeitet nur im Bereich von -9°C .. +99°C korrekt. Die Temperaturmessung arbeitet aber im Bereich vonn -55°C bis +150°C (Limit des KTY81-110), und die ermittelte Temperatur kann in diesem Bereich jederzeit über die RS232-Schnittstelle abgefragt werden, auch wenn das LED-Display nur noch 'Unsinn' anzeigt.
Nach der Messung wird die Temperatur mit der maximal zulässigen Temperatur (Standard 63°C) verglichen. Ist die Temperatur zu hoch, dann wird ein 50ms-langer 2-kHz-Pipser ausgegeben. Da das in jeder Messschleife passiert, werden Pipser mehrfach pro Sekunde wiederholt.
Die Alarm-Temperaturschwelle ist standardmäßig auf 63°C eingestellt, kann aber im Assemblerquelltext, oder per Terminalprogramm leicht geändert werden. Einschalttemperaturen von unter 0°C sind nicht möglich.
Da beide PWM-Kanäle des 16F876 vom gleichen Timer gesteuert werden, ist die Frequenz beider Kanäle identisch. Ich habe den recht hohen Wert von 10kHz gewählt, damit möglichst keine hörbaren Zirpgeräusche am Lüfter entstehen.
Der Timer2 wird mit dem 1:1-Vorteiler aus dem PIC-Zyklustakt (1MHz) gespeist. Das Register PR2 des CCP-Moduls wird auf 99 eingestellt. Damit dauert eine PWM-Periode 100µs. In die Register CCPR1L bzw. CCPR2L lässt sich nun das geplante Tastverhältnis für die beiden Kanäle direkt als Prozentwer (0 .. 100) einschreiben.
Ist die gemessenen Temperatur unterhalb der Einschalttemperatur,
dann
wird das Tastverhältnis auf 0% gestellt. Der Lüfter bleibt
ausgeschaltet.
Beim Erreichen der Einschalttemperatur wird Tastverhältnis
auf
eine Minimaltastverhältnis (Standard 50%) gestellt. Der
Satndardwert
von 50% ergibt bei einem 12V-Lüfter eine Spannung von 6V, und
sollte
zum sicheren Anlaufen ausreichen. Für jedes zusätzliche
Grad-Celsius
wird das Tastverhältnis um 4% erhöht, so dass bei einer
Sensortemperatur
von ca. 12K über der Einschalttemperatur das Tastverhältnis
100%
erreicht, und der Lüfter mit Maximaldrehzahl läuft.
Die Einschalttemperatur ist standardmäßig auf 35°C
eingestellt,
kann aber im Assemblerquelltext, oder per Terminalprogramm leicht
geändert
werden. Einschalttemperaturen von unter 0°C sind nicht
möglich.
Die Hysterese ist auf 1 K voreingestellt, kann aber ebenfalls leicht
verändert werden. Werte zwischen 0 K und 10K erscheinen mir
sinnvoll.
Das Minimaltastverhältnis ist standardmäßig auf 50% eingestellt, kann aber im Assemblerquelltext, oder per Terminalprogramm leicht geändert werden. Es ist so zu wählen, das der Lüfter sicher anläuft.
Direkte Pulsansteuerung Man wandelt die 5V-Pulse des Controllers mit einem Transistor in 12V-Pulse, die man direkt auf den Lüfter gibt. Das ist billig, und funktioniert mit einfachen Lüftern (ohne interne elektronische Regelung) problemlos. Mit Lüftern, die eine eigene, interne Temperaturregelung haben, funktioniert das Verfahren aber nicht. Einige andere Lüfter entwickeln ein deutliches 10kHz-Pfeifen. Bei laufendem Lüfter ist die Spannung am Lüfter deutlich höher, als das Produkt aus 12V und PWM-Verhältnis. Deshalb sollte das Mindesttastverhältnis auf ca. 30% abgesenkt werden. Als Transistor können auch kleinere Typen, wie z.B ein BC338 eingesetzt werden. Eine Kühlung des Transistors ist nicht nötig. Als Diode genügt eine 1N4001. Die Drehzahlüberwachungspulse eines modernen Lüfters können hier nicht vom Mainboard ausgewertet werden. |
|
Buck-Konverter (Schaltwandler)
Mit Hilfe einer Spule, zweier Schalttransistoren, einer Diode und eines ELKOs wandelt man das PWM-Signal in eine Spannung von 0V..12V. Eine Kühlung des Transistors ist nicht nötig. Als Diode genügt eine 1N4001. Die Drehzahlüberwachungspulse (soweit am Lüfter ein Anschluss vorhanden ist) können bei Bedarf vom Mainboard ausgewertet werden. |
|
DA-Wandler Man wandelt das PWM-Signal mit einem einfachen RC-Glied in eine dem Tastverhältnis proportionale Spannung von 0V..5V um. Mit einem OPV sowie einem Transistor verstärkt man diese Spannung 2,4-fach auf 0V..12V. Der Schaltungsaufwand ist vergleichsweise hoch, aber der Lüfter funktioniert mit dieser Spannung problemlos und ohne Zirpen. Die Treibertransistoren hinter dem OPV müssen mit einem Kühlkörper versehen werden. Die Drehzahlüberwachungspulse eines modernen Lüfters können hier nicht vom Mainboard ausgewertet werden. |
Prinzipiell können bei den ersten beiden Schaltungen leise 10kHz-Zirpgeräusche auftreten, wenn der Lüfter läuft. Ob soche Geräusche auftreten hängt im Wesentlichen vom verwendeten Lüftermodell ab. Mit der ersten Schaltung arbeiten nur gutmütige Lüfter problemlos zusammen.
Die USART wird auf 19,2 kBaud (1 Startbit, 1,5 Stopbits, 8
Datenbits,
keine Parität) initialisiert, und wartet auf Kommandos.
Gültige
Kommandos sind die Kleinbuchstaben h t q a w s e d r f u j i k o l
c v b n.
Mit einem beliebigen Terminalprogramm lässt sich nun Kontakt
zur Lüftersteuerung aufnehmen. Jedes zur Lüftersteuerung
gesendete
sinnvolle Zeichen wird umgehend zurückgesendet (das dient als Test
der Komunikation). Ist das Zeichen keinem Befehl zugeordnet, wird es
dagegen
ignoriert.
h - diesen Text ausgeben t - Werte anzeigen q/a - Offset 1 +/- w/s - Offset 2 +/- e/d - Einschaltpunkt 1 +/- r/f - Einschaltpunkt 2 +/- u/j - Alarm 1 +/- i/k - Alarm 2 +/- o/l - Mindest-PWM +/- c/v - Hysterese 1 +/- b/n - Hysterese 2 +/- |
Das Zeichen h (Hilfe) veranlasst die Ausgabe aller
bekannter
Tasten, und ihrer Funktionen.
Das Zeichen t (Temperaturen) zeigt für beide
Kanäle
die gemessene Temperatur, Einschalttemperatur, Offset und
Tastverhältnis
an.
Die Zeichen q a w s e d r f u j i k o l c v b n
ändern
Offsert,
Einschalttemperatur, Überhitzungsalarmtemperatur, Hysteresis und
Mindesttastverhältnis
(entsprechend der mit h angezeigten Funktionen) in
1er-Schritten
und speichert den veränderten Wert dauerhaft im EEPROM des PIC.
Anschließend
wird die Funktion von t ausgeführt, um die Auswirkung der
Änderung
zu zeigen. (Temperatur und PWM werden aber erst nach erneutem
Drücken
von t korrekt angezeigt, da sie erst nach der nächsten
Temperaturmessung
errechnet werden.)
Dazu muss eine genau bekannte Temperatur gemessen werden, um den Anzeigefehler zu ermitteln. Sehr gut eignet sich Eiswasser, das eine Temperatur von genau 0°C aufweist. Der Sensor wird am Thermometer angeschlossen , und elektrisch isoliert in das Eiswasser getaucht. Ist der Anzeigewert 0, dann ist alles in Ordnung. Anderenfalls muss die Offsetkorrektur in der PIC-Software angepasst werden. Durch die Kalibrierung wird gleichzeitig der Fehler des 2,7kOhm-Widerstandes R12 ausgeglichen.
Kalibrierung über ein Terminalprogramm (mit RS232)
Die Lüftersteuerung wird mit dem RS232-Anschluss (z.B. Com1)
eines PC verbunden, und auf dem PC ein Terminalprogramm (z.B.
HyperTerminal
von Windows) gestartet. Man öffnet eine Verbindung auf der
Com-Schnittstelle
mit 19200 Baud (8 Bit, 1 Startbit, 1,5 Stopbits, keine Parität).
Die Kommunikation mit der Lüftersteuerung erfolgt über
einzelne
Tasten. Ein Drücken der Enter- (Return)-Taste ist nicht
nötig.
Die Taste 'h' (für Help) führt zur Anzeige aller von der
Lüftersteuerung
akzeptierten Tasten. 't' zeigt z.B. für beide
Lüfterkanäle
die Temperatur, die Einschalttemperatur, den Kalibrier-Offset und das
Tastverhältnis
des PWM-Ausgangs (in %) an. Über die Tasten 'qwerasdf' lassen sich
Offsets und Einschalttemperaturen verstellen.
Die veränderten Werte merkt sich die Lüftersteuerung
dauerhaft
im EEPROM.
manuelle Kalibrierung (ohne RS232)
Im Definitionsbereich des Thermometerprogramms (Assemblerquelltext)
gibt den Abschnitt ;voreingestellte Default-Werte im EEPROM
, wo Offsets und Einschalttemperaturen (TMin) definiert sind. Der
Offset
beträgt standardmäßig 150. Dieser Zahlenwert
muss
um die Fehlanzeige korrigiert werden. Misst das Thermometer z.B.
2°
zuviel, dann muss Offset auf 152 korrigiert werden. Mit dem
modifizierten
Programm ist dann der 16F876 noch einmal zu programmieren.
Die Einschalttemperatur TMin) ist dort auf 35°C festgelegt, und
kann auch frei verändert werden.
Danach ist das Programm zu assemblieren und neu zu brennen.
Das ist nicht sehr komfortabel, funktioniert aber.
Hinweis für Faulpelze
Wenn man anstelle des 2,7-kOhm-Widerstands eine
Reihenschaltung aus einem 2,5k-Ohm-Widerstand und einem
470-Ohm-Einstellregler
verwendet, dann kann man die Kalibrierung auch am Einstellregler
vornehmen,
und muss die Software nicht ändern. Allerdings haben
Einstellregler
schlechte Temperaturkoeffizienten. Desshalb ist dann die
Messgenauigkeit
schlechter.