Ich habe einen Fileserver (mit Debian-Linux) aufgebaut, der neben
einer
leisen Notebookplatte und einem passiv gekühlten EPIA-Mainboard
noch
ein RAID5-System für die Datenablage enthält. Das RAID-System
schaltet sich nach 10 Minuten Inaktivität von allein ab, so dass
der
Server dann ohne weiteres als Silent-PC durchgeht.
Allerdings benötigen die RAID-Platten bei längerem Betrieb
einen Lüfter. Diesen Lüfter wollte ich nur bei Bedarf
einschalten
(also bei laufendem RAID-System), um die Geräuschkulisse des
Servers
minimal zu halten.
Ich entschloss mich einen Thermosensor zwischen den RAID-Platten
zu platzieren, und den Lüfter nur einzuschalten, wenn die
Temperatur
dort zu hoch würde. Damit läuft der Lüfter nur, wenn
auch
das RAID-System arbeitet, ansonsten schaltet der Lüfter ab,
nachdem er die Festplatten abgekühlt hat.
Ich entwickelte also eine geeignete
Schaltung
mit
einem
PIC-Controller
und
der
nötigen Software.
Das Ergebnis war toll, doch war ich weit über das Ziel
hinausgeschossen.
Das Ziel aus den Augen verlierend hatte ich eine 2-kanalige
PWM-Lüfterregelung
mit LED-Temperaturanzeige und RS232-Interface entwickelt. Eine tolle
Sache,
aber ich wollte eigentlich nur einen Thermoschalter.
Also zurück an's Reißbrett.
Ich wollte doch aber eigentlich nur einen Schalter!!!
Also zurück an's Reißbrett.
Auch die Variante
1 kam dann noch zur Anwendung, als ich einen weiteren
Debian-Server baute. Der wurde mit einem Doppelkern Athlon64X2 4550E
angetrieben, den ich mit einem übergroßen
Scythe-Ninea2-Kühlkörper mit 12 Heatpipes versah.
Ein Kanal
des
Lüfterschalters misst die CPU-Kühlkörpertemperatur und
steuert den daran montierten 12cm-CPU-Lüfter. Der zweite Kanal des
Lüfterschalters misst (wie im ersten Server) die Temperatur
zwischen den Festplatten des RAID-Systems und steuert einen vor den
Festplatten sitzenden Lüfter. Der Festplattenlüfter
läuft nur sporadisch, wenn das RAID-System in Betrieb ist. (Es
schaltet bei Inaktivität nach 10 Minuten ab.) Der CPU-Lüfter war wohl noch nie in Betrieb, da die 45W-CPU im Idle-Betrieb ohne Lüfter gerade einmal eine Chiptemperatur von 43°C erreicht, und auch unter Last bisher der Kühlkörper nie mehr als handwarm wurde. Der Sensor misst nahezu konstante 34°C am oberen Ende des Kühlkörpers. Der RS232-Ausgang wurde mit dem COM1-Port des Mainboards verbunden. Die Temperaturen werden hier regelmäßig per Cron mit einem kleinen Perl-Script ausgelesen. Der ganze Server (Foto rechts während der Erprobung) ...
Den auf einer Lochrasterplatine aufgebauten Lüfterschalter (mit etwas vereinfachter Schaltung mit Aktivitäts-LEDs, siehe unten) habe ich so im Gehäuse montiert, dass seine LEDs durch die seitlichen Lüftungsöffnungen des Gehäuses sichtbar sind. |
Aufbau
Temperatur-Messung
Als Sensor sollte ein billiger PTC benutzt werden. Wie man den (im Bereich von -20°C bis +120°C) als quasi-linearen Temperatursensor benutzen kann, ist schon an anderer Stelle beschrieben worden. Der PTC liefert in dieser Schaltung eine Spannung, mit einem Temperaturkoeffizient von 7,7125 mV/K. Bei einem Temperaturanstieg um 1 Grad steigt die vom PTC abgegebene Spannung also um 7,7125 mV.
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 subtrahiert, und die Zahl aus dem
binären
Zahlensystem in eine Dezimalzahl umrechnet, hat man eine Temperatur 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.
Berechnungen
Variante 1
Eine Umrechnung des Messwerts in eine dezimale Temperatur in
°C
ist nur in der Variante 1 nötig, da nur hier der Messwert via
RS232 ausgegeben wird.
Das mathematische Hauptproblem ist die Division des ADC-Ergebnisses
durch 1,579. Dies lässt sich aber mit ausreichender
Genauigkeit
durch eine Multiplikation mit 64 und nachfolgender Division durch 101
bewerkstelligen.
Diese beiden Operationen zusammen entsprechen einer Division durch
1,578125
(101/64=1,578125). Der durch die Näherung auftretende Fehler
beträgt
nur etwa 0,06%, und ist damit zu vernachlässigen.
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.
(Alternativ könnte man auch 81
Messresultate
aufaddieren, und die Summe durch 128 teilen , was im Binärsystem
trivial
ist. Das entspräche einer Division durch 1,58 (128/81=1,580). Der
Rundungsfehler läge bei 0,08%.)
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 R1/2 ab. Der präzise Wert ist durch eine Kalibrierung zu ermitteln. Dazu wird einfach eine bekannte Temperatur (Eiswasser=0°C) gemessen, und die gemessene Temperatur (der Offset-Fehler) via RS232 ausgelesen. Der Offset kann dann im Assemblerquelltext geändert werden.
Variante 2
Auf eine Umrechnung des ADC-Wertes in °C verzichte ich. Aus
Gründen
der Stabilität, wird die PTC-Spannung aber auch hier 64 mal
gemessen,
und die Ergebnisse zusammenaddiert.
Programmablauf einer Messung
Variante 1
Temperatur | Widerstand des PTC | Strom durch PTC | Spannung am ADC | Resultat des ADC | Rechenergebnis |
-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 |
Variante 2
Lüftersteuerung
Nach der Messung wird die Temperatur mit der Ausschalttemperatur
Toff
(z.B. 33°C) verglichen. Liegt die Temperatur unter Toff, dann wird
der
Lüfter des Kanals ausgeschaltet
Danach wird die Temperatur mit der Einschalttemperatur Ton (z.B.
38°C)
verglichen. Liegt die Temperatur über Ton, dann wird der
Lüfter
des Kanals eingeschaltet
Die Schaltschwellen der Variante 2 liegen übrigens (bei exakter Kalibrierung) bei 32,4°C und 37,5°C. Das ist ein Tribut an die vereinfachte Mathematik.
Da Ton einige °C über Toff liegt, wird ein ständiges An- und Ausschalten der Lüfter vermieden
Überhitzungsalarm
Nach der Messung wird die Temperatur mit der maximal zulässigen
Temperatur (Standard 50°C) verglichen. Ist die Temperatur zu hoch,
dann wird ein 50ms-langer 2-kHz-Piepser ausgegeben. Da das in jeder
Messschleife
passiert, wird der Piepser mehrfach pro Sekunde wiederholt.
Die Alarm-Temperaturschwelle ist standardmäßig auf 50°C
eingestellt, kann aber im Assemblerquelltext leicht geändert
werden.
Variante 1
Alarmtemperaturen von unter 0°C sind in der Variante 1 nicht
möglich.
In der Variante 1 ist die Überhitzungsüberwachung nur
aktiviert, wenn das Pin GP3 des PIC ist durch dem Jumper mit Masse
(Vss)
verbunden ist.
Das RS232-Interface (nur Variante1)
Das Pin GP2 kann direkt mit RX eines RS232-PC-Anschlüssen verbunden werden. Die darüber hinaus nötigen Brücken am RS232-Anschluss zeigt der Stromlaufplan. Am PC ist ein beliebiges Terminalprogramm zu benutzen und auf 9600 Baud (1 Startbit, 1 Stopbit, 8 Datenbits, keine Parität) einzustellen. Das Pin GP3 des PIC ist durch dem Jumper mit +5V zu verbinden.
Der PIC liefert nun ständig die gemessenen Temperaturen an den PC, in jeder Zeile steht zunächst die Temperatur des 1. Sensors, und dann die Temperatur des 2. Sensors. Dies ist vor allem zur Kalibrierung der Temperatursensoren hilfreich.
Solange die RS232-Schnittstelle läuft, ist der Übertemperaturalarm deaktiviert. Eventuell kann es nötig sein, den Piepser (Piezo) oder C1 zu entfernen, damit die RS232-Kommunikation nicht behindert wird.
PS 2005:
Ich habe die RS232-Emulation in diesem Programm
nicht getestet, gehe aber davon aus, das sie funktioniert.
Update 2009: So einen Unsinn behaupte ich nie wieder, bei einem
nachträglichen Test fand ich im Bereich der RS232-Emulation gleich
5 Fehler, die inzwischen alle behoben sind.
Die oben stehende Tabelle zeigt u.A. die vom PTC gelieferte Spannung am ADC-Eingang, für unterschiedliche Temperaturen. Aber keine zwei PTCs sind absolut identisch. So kann der Widerstand des KTY81-110 von seinen Normwerten so weit abweichen, das ein Thermometer ohne spezielle Anpassung 2 Grad zuviel oder zuwenig anzeigt. Wird ein KTY81-120 verwendet, kann der Anzeigefehler sogar doppelt so groß sein. KTY-150 weichen um bis zu 6 Grad ab. Durch eine Kalibrierung kann dieser konstante Offsetwert eliminiert werden.
Variante 1
Der Lüfterschalter 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 9600 Baud (8 Bit, 1 Startbit, 1,5 Stopbits, keine Parität).
Nun muss eine genau bekannte Temperatur gemessen werden, um den
Messfehler 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. Mit dem PC werden
die vom PIC gemeldeten Temperaturwerte beobachtet. Ist der
Messwert
0°C, dann ist alles in Ordnung. Anderenfalls muss die
Offsetkorrektur
in der PIC-Software angepasst werden.
Im ASM-File findet man folgende Passage:
;voreingestellte Default-Werte im EEPROM (Temperaturen in °C) org H'2100' ; EEPROM de D'150' ; Adr 0 = Offset1 de D'150' ; Adr 1 = Offset2 |
Um den Sensor zu kalibrieren, muss der ihm zugehörige
Offset-Wert
verändert werden. Ist der Messwert zu hoch, dann muss
der
Offset um den Fehlbetrag erhöht werden, und umgekehrt. Wird also
Eiswasser
vom 1.Sensor mit +3°C und vom 2. Sensor mit -2°C gemessen, so
ist
der ASM-Text wie folgt zu ändern:
;voreingestellte Default-Werte im EEPROM (Temperaturen in °C) org H'2100' ; EEPROM de D'153' ; Adr 0 = Offset1 de D'148' ; Adr 1 = Offset2 |
Danach ist der ASM-Text neu zu assemblieren, und neu in den PIC zu
brennen.
Wem das zu umständlich ist, der kann die 2,7kOhm-Widerstände
an den PTCs durch 4,7-kOhm-Spindel-Trimmwiderstände ersetzen, und
nach dem Verfahren für die 'Variante 2' vorgehen. Die damit zu
erreichende
thermische Stabilität ist zwar geringer, aber für den Zweck
immer
noch ausreichend.
Variante 2
Das 4,7-kOhm-Spindel-Potentiometer wurde vor dem Einbau ja schon auf
2,7 kOhm eingestellt.
Wir nehmen den Lüfterschalter in Betrieb, wobei während der
Kalibrierung die +5V-Versorgungsspannung genau eingehalten werden
muss
(höchstens 0,3% = 17mV Fehler sind zulässig). Nun messen wir
die Temperatur am Sensor mit einem guten Thermometer, und messen
gleichzeitig
die Spannung am Pin GP0 des PIC. Anhand der obigen
Tabelle stellen wir das Poti nun so ein, das sich die zur
Temperatur
gehörende Spannung an GP0 ergibt. Fertig. Zukünftig darf die
5V-Spannung wieder im Bereich von 4..6V schwanken.
Man kann natürlich den Sensor auch am Messort (z.B auf einer Festplatte) zusammen mit einem Thermometer platzieren, und am Poti solange herumspielen, bis der Lüfter bei der richtigen Temperatur ein- bzw. ausschaltet. Dann entfernt man das Thermometer wieder.