Thermometer mit PIC16F876(A)


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


Allgemeines
Messbereich: -20°C .. +120°C
Fehler im Bereich -20°C .. +120°C < 2 K
Fehler im Bereich   -5°C .. +100°C < 1 K
Auflösung der Anzeige:    1 K

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. 

anklicken zum Vergrößern
Zur Steuerung benötige ich einen PIC mit ADC und wenigstens 12 nutzbaren Pins. Meine Wahl fiel auf den 16F876 bzw. 16F873. (Warscheinlich ließe sich auch ein billigerer 16F676 nutzen, den hatte ich aber gerade nicht vorrätig.)

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.



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.

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



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



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

3-stellige LED-Anzeige für Testplatine



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.

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.



Download
Hier liegt




mögliche Erweiterungen
Es sind noch genug analoge und digitale Pins frei, um einige Erweiterungen vorzunehmen. Möglich wäre z.B.
  1. Vermeidung einer unruhigen Anzeige an der Grenze von einem Grad zum nächsten durch eine Hysterese
  2. Anschluss von bis zu 4 zusätzlichen PTC-Sensoren und 5 Auswahltasten
  3. Anschluss eines zweiten Temperatursensors und eines zweiten LED-Displays, um zwei Temperaturen gleichzeitig zu messen und anzuzeigen
  4. Ausgabe der Messergebnisse via RS232
  5. Logger-Mode in dem, bei abgeschalteter Anzeige, Messungen über Stunden gespeichert und später über RS232 zur Auswertung an einen PC ausgegeben werden.
Alternativ könnte man z.B. auf den billigeren PIC16F676 umsteigen, was aber deutliche Softwareänderungen erfordern würde.


Hinweis von Rainer:
Für neuere Pics ist mir folgende Verbesserung eingefallen.
Ich benutze einen 16F1825. Bei diesem Pic kann man die Ref.Spannung auf 2.048 oder 4.096 legen. Wenn man die Spannung auf 2.048 legt, kann man die Messung vereinfachen und die Auflösung erhöhen.
Mann addiert nur 7 Messungen für die Mittelwertbildung und dividiertdann durch 27. Der Messfehler ist dadurch noch geringer.


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