Thermoschalter für PC-Lüfter mit PIC12F675



zurück zu Projekte , PIC-Prozessoren , Elektronik , Homepage


Allgemeines
Variante 1
 
Arbeitsbereich: 0°C .. +99°C  (Fehler <1 K)
Anzahl unabhängiger Kanäle 2
Extras RS232-Ausgang (9600 Baud), Warnton bei Überhitzung


anklicken zum Vergrößern

Variante 2
 
Arbeitsbereich: 0°C .. +99°C  (Fehler <1 K)
Anzahl unabhängiger Kanäle 1
Extras Warnton bei Überhitzung


anklicken zum Vergrößern

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.

Das Ergebnis war die Variante 1 ein 2-kanaliger Schalter, der wahlweise die gemessenen Temperaturen ständig über RS232 (Softwareemulation) ausgibt, oder einen Überhitzungswarnton ausgeben kann (Umschaltbar mit einem Jumper).
 

Ich wollte doch aber eigentlich nur einen Schalter!!!
Also  zurück an's Reißbrett.

Die Variante 2 entsprach dann endlich meinen Vorstellungen. Es ist gar nicht so einfach, etwas einfach zu halten.
 

Nachtrag 2009:
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) ...
  • Athlon64X2 4550E
  • Asrock AM3+ MB N68PV-GS
  • 2 GB-RAM, dual PC2-5300U DDR2
  • VGA-onboard GeForce 7050/630a
  • 1 x 80-GB-HD (2,5') (ersetzt durch 1 x 40-GB-SSD)
  • 2 x 1000-GB-HD, WD Caviar Green (WD10EAS)
  • Debian-Linux 5.0
  • uraltes 150W-Netzteil
... saugt im Leerlauf (RAID aus) primär 37W aus der Steckdose (Vollast 70W),  da ist dann nur noch der mit 5V laufende  Netzteil-Lüfter zu hören (am alten Netzteil außen "angeflanschter" Arctic-Cooling 80-mm-Lüfter) wenn man sein Ohr an den Server hält.
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.
Foto des Servers im Test



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

  1. Temperaturregister (16-Bit) auf 82 setzen (32+50) um die Zahl der Messungen und den Fehler der Division zu kompensieren
  2. 64 mal ADC abfragen, ADC-Wert jeweils zum Temperaturregister addieren (16 Bit Addition)
  3. Temperaturregister durch 101 dividieren (16 Bit Division)
  4. Vom Temperaturregister den Offset (z.B. 150) subtrahieren (16 Bit Subtraktion)
  5. Temperaturregister in BCD umrechnen (3-stellig), Vorzeichen beachten
  6. Temperatur mit den Schaltschwellen (Ton, Toff, Alarm jeweils in °C) vergleichen, entsprechen Lüfter schalten oder Alarm ausgeben.
  7. Temperatur via RS232 ausgeben mit 9600 Baud
Die folgende Tabelle zeigt den Zusammenhang zwischen Temperatur und errechnetem Anzeigewert. Im Bereich von 0°C bis 100°C ist der theoretische Fehler des Thermometers kleiner als 1 Grad. Für den geplanten Anwendungszweck ist das mehr als genug:
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

  1. Temperaturregister (16-Bit) auf 32 setzen um die Zahl der Messungen zu kompensieren
  2. 64 mal ADC abfragen, ADC-Wert jeweils zum Temperaturregister addieren (16 Bit Addition)
  3. die oberen 8 Bit mit den Schaltschwellen (Ton, Toff, Alarm) vergleichen, entsprechen Lüfter schalten oder Alarm ausgeben.



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.


Kalibrierung

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.


Download
Hier liegt



mögliche Erweiterungen und Verbesserungen
Nein, hier wird nichts erweitert. Die Lösungen sind ja das Ergebnis einer Minimierung!

Aber die Hardware lässt sich noch etwas vereinfachen. Insbesondere die Transistorschaltung lässt sich vereinfachen, wie man hier sehen kann. Die LEDs sind low-current-LEDs, die anzeigen, ob der Schalter gerade aktiv ist, sie können auch weggelassen werden.

Schalter, 2 kanalig Schalter, 1 kanalig


zurück zu Projekte , PIC-Prozessoren , Elektronik , Homepage
Autor: sprut
erstellt: 16.08.2005
letzte Änderung:: 03.12.2009