Lüftersteuerung mit PIC16F876(A)


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


Allgemeines
Arbeitsbereich: 0°C .. +99°C  (Fehler <1 K)
PWM-Tastverhältnis 0% (50%) .. 100%
Regelsteilheit der PWM 4 % pro 1K Temperaturänderung
Anzahl unabhängiger Kanäle 2
anklicken zum Vergrößern

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:




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 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.



Berechnungen
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,578 (101/64=1,578). Der durch die Näherung auftretende Fehler beträgt nur etwa 0,1%, 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.

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.



Programmablauf einer Messung
  1. Temperaturregister (16-Bit) auf 82 setzen (32+50)
  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 150 subtrahieren (16 Bit Subtraktion)
  5. Temperaturregister in BCD umrechnen (3-stellig), Vorzeichen beachten
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 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.



Überhitzungsalarm

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.



Erzeugung des PWM-Signals

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.



Lüfteransteuerung
Der Controller liefert für jeden Lüfter ein 10-kHz-PWM-Signal, das linear in eine Spannung von 0V..12V zu wandeln ist, um den Lüfter anzusteuern. Dafür gibt es mindestens drei unterschiedliche Herangehensweisen. Welche man verwenden sollte, hängt stark vom zu verwendenden Lüfter ab.
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.



Das RS232-Interface
Die hier vorgestellt Lüfterregelung ist zwar mit einem LED-Display ausgerüstet, bei mir sollte sie aber ohne Display ihren Dienst verrichten. Eine Bedienung über Tasten (zur Änderung von Einschalttemperatur, Sensor-Offset oder Überhitzungsalarmtemperatur) ist damit nicht mehr möglich, da ja das Display zur Komunikation fehlt.
Stattdessen benutze ich das RS232-Interface, das (besonders mit einfachen Transitortreibern) schnell aufgebaut ist.

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.)



Kalibrierung
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.

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.



Download
Hier liegt

mögliche Erweiterungen
Das Pin RA4 ist noch frei und das Pin RB4 lässt sich frei machen (Dezimalpunkt wird in der LED-Anzeige nicht benutzt). Damit ließe sich für Lüfter mit Pulsgeber (Drehzahlsensor) die Drehzahl bestimmen. Dadurch kann eine Regelung erreicht werden, die nicht die Lüfterspannung sondern die Lüftzerdrehzahl temperaturabhängig einstellt.
Damit wäre auch ein sicheres Langsamlaufverhalten der Lüfter erreichbar, und ein defekter Lüfter würde umgehend erkannt werden.


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