Thermometer
Die Temperatur wird folgendermaßen gemessen: Ein Kondensator wird aufgeladen und entlädt sich danach über einen NTC (wärmeabhängiger Widerstand). Der Mikrocontroller mißt die Zeit, bis der Kondensator halb entladen ist und errechnet anhand einer Übersetzungstabelle den aktuellen Temperaturwert. Da ich die Temperatur ohne Nachkommastelle anzeige und die Programmierung so einfach ist, habe ich mich hierfür entschieden. Die benötigte Übersetzungstabelle muss allerdings erst durch eigene Messungen erstellt werden.
Elektronik
Da der Mikrocontroller nur einen Analog-Vergleicher besitzt, habe ich einen zusätzlichen Spannungsvergleicher, und zwar den LM2903, genommen. Dieser vergleicht die Spannungen an den beiden Kondensatoren und ist an zwei Eingänge des Mikrocontrollers angeschlossen.
|
LM 2903
|
|
Temperatur-Meßvorsatz
|
Durch ein High an D3 wird der Kondensator geladen. Nach Low auf D3 entlädt er sich über den NTC. Der Eingangswiderstand des LM2903 ist hoch genug, so dass er keine Rolle spielt. Ist die Spannung am Kondensator auf unter die Hälfte gefallen, kann an D0 ein Low erkannt werden. Der Kondensator soll möglichst genau seinen Wert besitzen und auch auf lange Zeit behalten. Ich habe einen 5%igen Folienkondensator eingesetzt.
Vorüberlegungen zur Genauigkeit
Die Genauigkeit hängt von den verwendeten Bauteilen ab. Nun einige Überlegungen zur Ungenauigkeit des Thermometers:
Da ich das Thermometer durch Vergleich mit einem anderen Thermometer zwar eiche, aber mit zwei symmetrischen Schaltungen Innen- und Außentemperatur messen will, müssen die Teile möglichst die selben Werte besitzen. Der Kondensator entlädt sich über den NTC.
- Genauigkeit der NTCs: Im Elektronikhandel bekommt man keine unterschiedlich genauen bzw. speziell präzisen NTCs. Man sollte die tatsächlichen Werte durch Messen vergleichen.
- Genauigkeit der Kondensatoren: Es sollten auf keinen Fall Elektrolytkondensatoren eingesetzt werden, da diese ungenau sind (meist 20%) und altern. Spezielle Folienkondensatoren sind fast temperaturunabhängig und altern nicht. Die Genauigkeit beträgt 5%. Durch Messen oder Anschluss an denselben Teil der Temperaturelektonik nacheinander und anzeige der Zeitwerte durch das Programm kann man die Werte überprüfen. Evtl. kann man auch zusätzliche Kondensatoren mit kleinen Werten parallel schalten, um dieselben Werte zu erhalten.
- Entladung über LM 2903: Ein Teil der Ladung des Kondensators entlädt sich über den LM 2903. Der Eingangsleckstrom liegt bei typisch 25 nA, das sind 0,000000025 A. Ein 6 Volt geladener Kondensator bräuchte x Minuten, um sich auf 3 Volt zu entladen. Anders gesagt: Der Verlust am LM 2903 spielt keine Rolle.
- Widerstand des Kabels: Zum Außenfühler habe ich ein Kabel mit sehr dünnen Adern (0,08 mm2) genommen. Dieses besitzt einen Widerstand von ca. 230 Ohm pro km. Verwendet man 10 Meter, liegt der Widerstand somit bei ca. 2 Ohm. Verglichen mit dem Widerstand von 100 kOhm des NTC (bei starker Kälte noch > 1 kOhm) spielt er also keine Rolle.
- Transistor: Ein Transistor schaltet sehr schnell. Ein billiger BC558 z.B. bis 150 MHz, also mindestens Millionenfach schneller als die zu erwartende Meßzeit von > 100 ms. Da an AVR D3 der Pegel von VCC auf GND umschaltet, wird der Transistor somit perfekt schalten. Die Ausgangskapazität liegt im pF-Bereich, ist also auch zu vernachlässigen.
- Alles in allem sollte also die genutzte Genauigkeit (1 Grad bei der Anzeige) leicht erreicht werden können.
Eichen des Thermometers
Durch Auskommentieren einer Zeile im Assemblerprogramm erzeugt man eine Version des Programms, die die gemessenen Zeiten zum halben Entladen des Kondensators auf dem Display ausgibt. Am besten lötet man bereits jetzt den Außenfühler an das Kabel. Der NTC sollte mit einem Stück einer Plastiktüte und Klebeband wasserdicht gemacht werden (kann auch später im Betrieb nicht schaden, um vor Korrosion zu schützen).
Nun braucht man noch ein zweites Thermometer mit Außenfühler und nacheinander einige Gläser mit Wasser unterschieldicher Temperatur. Um kalte Temperaturen abzudecken, nimmt man Eiswasser. Nach dem Eintauchen der Fühler in das Wasser misst man einige Werte.
Aus den gemessenen Werten kam eine schöne exponentielle Kurve heraus:
Da für die Temperatur-Meßwerte nur jeweils ein Byte benutzt wird, fangen diese somit momentan erst bei -12°C an. Wenn es denn in diesem Winter mal kälter sein sollte, überlege ich mir, entweder zwei Byte pro Meßwert zu nehmen oder durch Anpassung der Wartezeit in der Zählschleife den Bereich anzupassen. Die Werte werden im EEPROM abgelegt. Die entsprechende Datei sieht dann so aus:
dcf77_ee.hex
:10000000FFFFFFFFFFFFFFFEF0E4D8CCC0B6ACA3BC
:100010009A91887F78726C67615C57534E4A46426A
:100020003F3C383533312E2C2A2826242221201E0D
:100030001D1B1A191817161514131211100F0E0084
:1000400000000000000000000000000000000000B0
:1000500000000000000000000000000000000000A0
:100060000000000000000000000000000000000090
:100070000000000000000000000000000000000080
:00000001FF