Zur Überwachung der Temperatur eines Kühlkörpers benötigte ich ein einfaches Thermometer. Das kann man zwar auch kaufen, aber der Eigenbau macht doch mehr Spaß. Um den Hardwareaufwand gering zu halten benutze ich einen PTC als Thermosensor und ein dreistelliges LED-Display als Anzeige. |
Eine eventuelle zukünftige Erweiterung z.B. um einen RS232-Ausgang stellt mit diesem PIC auch kein Problem dar.
Ein Vorteil der gewählten Lösung ist, dass keine hochstabile Betriebsspannung und keine spezielle Referenzspannung benötigt wird.
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.
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 R12 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.
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 Anzeige mit 7-Segment LEDs wurde schon an
anderer Stelle beschrieben. Ich benutze ein 3-stelliges LED-Display
mit gemeinsamen Anoden. Zur Ansteuerung werden 11 Port-Pins, 3
Transistoren
und 11 Widerstände benötigt. Der Segmentstrom wird durch die Widerstände R1..R8 auf ca. 15 mA begrenzt. Dadurch bleibt die Gesamtstromaufnahme des PortB (15mA x 8 = 120mA) sicher im Rahmen der Spezifikation des PIC (max. 200 mA). Wem die Helligkeit nicht genügt, der kann den Segmentstrom auf 25 mA erhöhen. (R1..R8: 180 Ohm) Die Anzeige erfolgt multiplex mit 3 Takten. Jeder Takt ist ca. 4,1 ms lang, um eine flimmerfreie Anzeige zu gewärleisten (81 Hz). Das Umschalten von Takt zu Takt wird mit einem Timerinterrupt realisiert. Dazu wird der Timer0 mit dem PIC-Zyklustakt (4MHz / 4 = 1MHz) über den internen 16:1 Vorteiler gespeist. Immer nach 256 x 16 Zyklen (4,1 ms) läuft der Timer0 über, und löst einen Interrupt aus. Das wird ständig wiederholt. Für einen Testaufbau habe ich die LED-Anzeige auf einer Lochrasterplatine montiert, die direkt in eine 16F876-Testplatine eingesteckt werden kann. |
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.
Im Definitionsbereich des Thermometerprogramms gibt es die Konstante 'Offset', die standardmäßig 150 beträgt. 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. Das ist nicht sehr komfortabel, funktioniert aber.
Durch die Kalibrierung wird gleichzeitig der Fehler des 2,7kOhm-Widerstandes R12 ausgeglichen.
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.