Ein in Bastlerkreisen sehr beliebter Temperatursensor ist der LM75. Ein Grund mehr, sich einmal mit ihm auseinander zu setzen :-)
Die Kommunikation findet hier über ein I²C (TWI) Interface statt. Die Messwertausgabe erfolgt demzufolge digital. Analog zu den meisten auf dem Markt erhältlichen digitalen Temperatursensoren bringt auch der LM75 einfache Thermostatfähigkeiten mit sich, auf die ich aber nicht näher eingehen werde.
Als "Warnung" möchte ich noch vorweg schicken, dass dieser Sensor nur als SOP verfügbar ist, also das einfach Löten auf Lochraster wie bei DIP entfällt. Man kann sich allerdings entweder selbst eine Platine machen oder entsprechende Adapterplatinen verwenden. Mit dem Löten wird es dann zwar bereits etwas heikler, doch mit ruhiger Hand und etwas Übung sollte diese Aufgabe zu meistern sein.
Zu den Anschlüssen:
Wer schon mit dem I²C Bus gearbeitet hat, weiß, dass SCL und SDA der
Kommunikation dienen. Auf die beiden Pins zur Spannungsversorgung (3-5,5V) muss
ich nicht näher eingehen. A0:2 sind Adresspins, mit denen die Adresse des
Sensors variiert werden kann (Pins auf H- oder L-Pegel legen). Es können so
maximal 2^3 = 8 Sensoren am Bus betrieben werden. Die restlichen 5 Adressbits
sind vom Hersteller vorgegeben. Pin 3 dient zum signalisieren einer detektierten
Übertemperatur. Diese kann programmiert werden.
Es sollte wie immer ein 100nF Kerko zwischen Betriebsspannung und Masse
angebracht werden, das ganze möglichst nahe am IC.
Die Adresse:
1 | 0 | 0 | 1 | A2 | A1 | A0 | R/W |
Die Temperatur des Sensors wird durch ein 9 Bit langes Zweierkomplementwort repräsentiert.
Der LM75 hat insgesamt 4 Register, von denen hier aber nur eins von Belang sein soll: das Temperaturregister. Um lediglich eine Temperatur auszulesen kann ein Zugriff auf das enthaltene Konfigurationsregister entfallen. Zusätzlich existiert noch ein Zeigerregister, welches festlegt, welches der 4 Register angesprochen wird.
Zur Kommunikation:
Sie startet wie immer beim I²C-Bus mit einem
START. Danach folgt die Adresse des Slave. Nun muss ein Byte gesendet werden,
welches dem Zeigerregister mitteilt, auf welches Register zugegriffen werden
soll. Der Zeiger auf das entsprechende Register wird intern gespeichert, so dass
man nicht jedes mal neu das Temperaturregister auswählen muss, auf welches man
zweifelsohne am häufigsten zugreifen wird. Für das Temperaturregister muss als
Pointerbyte (Zeigerbyte) 0x00 gesendet werden, für das Konfigurationsregister
0x01. Musste das Zeigerbyte gesetzt werden, so muss nach dem Beschreiben des
Pointerregisters ein REPEATED START ausgeführt werden. Danach muss die Adresse
des Sensors erneut gesendet werden. Dann kann auf die einzelnen Register
zugegriffen werden. Steht der Zeiger bereits auf dem richtigen Register, so
reicht ein normaler START gefolgt von der Adresse. Da der das Pointerregister
nach dem Power-On automatisch auf das Temperaturregister zeigt, bleibt dem
Anwender, der nur an der Temperatur interessiert ist, die obige Prozedur
erspart.
Um die Temperatur zu erhalten, müssen Lesezyklen erzeugt werden. Dann müssen
zwei Bytes ausgelesen werden, von denen der Master das erste mit ACK zu
bestätigen hat. Die Temperatur wird mit dem MSB (most significant bit) voran
übertragen.
Der Sensor braucht für eine Temperaturkonvertierung 100ms. Diese führt er selbständig aus, es sei denn man versetzt ihn in den hier nicht weiter erklärten Energiesparmodus. Man sollte das nur nach dem Einschalten beachten, da der Inhalt des Temperaturregisters in den ersten 100ms alles andere als die richtige Temperatur enthält.
Wer bereits mit dem TWI des ATMega gearbeitet hat, dem dürfte das Verstehen der von mir bereits gestellten rudimentären Routinen keine Probleme bereiten. Den Anfänger möchte ich hiermit vorerst auf die Rubrik TWI verweisen, um auch ihm Gelegenheit zur Erleuchtung zu geben :-)
Der Download kann entweder hier oder unter Programme erfolgen. Da der Sensor nur alle 100ms einen neuen Messwert zur Verfügung stellt, sollte man ihn mit einer Frequenz kleiner 10Hz abfragen. Ansonsten bricht er ständig die aktuelle Messung ab, gibt den alten Wert aus und startet eine erneute Messung. Wenn er diese wieder nicht beenden kann, bleibt man auf Dauer immer bei einer Temperatur. Deshalb habe ich im Projekt einen Timer verwendet, der den Sensor zweimal in der Sekunde abfragt und die Daten wie fast immer auf ein LCD ausgibt.