Temperaturmessung mit AVR-Microcontrollern: (2) Digitale Sensoren

Seitenübersicht



 www.schramm-software.de

Digital arbeitende Temperatursensoren

Ebenso einfach an einen Microcontroller anzuschließen sind Sensoren, die eine digitale Schnittstelle aufweisen - lediglich der Programmieraufwand ist evtl. höher als bei einer schlichten ADC-Abfrage. Da der Temperaturwert direkt als die letztlich benötigte Digitalzahl geliefert wird, entfallen alle Ungenauigkeiten und Unwägbarkeiten, die mit Übertragung und "später Umwandlung" eines analogen Signals verbunden sind. Sehr beliebt ist eine Klasse von Temperatursensoren, die je nach Hersteller und Messwertauflösung DS1820, DS18B20, DS18S20 oder ähnlich heißen. Es handelt sich hierbei um one wire devices, soll heißen Bauteile, die über nur einen Draht kommunizieren - und das sogar bidirektional, denn über diese Leitung fließen Daten in beide Richtungen; der Sensor tritt als Sender und Empfänger auf. Im folgenden nehmen wir uns beispielhaft den Sensor DS18B20 des Herstellers MAXIM (ehemals Dallas) vor. Der DS18B20 ermittelt den Temperaturwert im Bereich von -55 bis +125 °C mit einer Auflösung von 1/16 °C. Allerdings garantiert MAXIM nur eine Genauigkeit von einem halben Grad. Um die hohe Auflösung tatsächlich nutzen zu können, sollte daher eine Kalibrierung erfolgen (genaue Vergleichsmessungen mit einem geeichten Thermometer durchführen und z. B. Korrekturwerte im EEPROM des Microcontrollers ablegen, die dieser bei der Temperaturwertausgabe oder -weiterverarbeitung berücksichtigt).

Schaltbild der Testschaltung für den DS18B20
Schaltbild der Testschaltung, ATtiny13 mit DS18B20

Der Hardwareaufwand ist der gleiche wie bei Einsatz der oben beschriebenen analogen Sensoren - neben dem Sensor wird lediglich ein Widerstand benötigt, um den Sensor betreiben zu können. Bitte beachten Sie die farbig dargestellen Leitungen am VDD-Pin des DS18B20. Es wird entweder eine Verbindung zu PB3 (a) oder eine zu Masse (b) hergestellt. PB3 stellt während des Betriebs VDD (Batterie-Plus) zur Verfügung, d. h. dieser Sensor-Pin wird demnach wahlweise mit Plus oder Minus verbunden. Das mag eigenartig erscheinen - umso mehr, wenn man bedenkt, dass der Sensor im Falle b anscheinend gar nicht mehr mit Energie versorgt wird. Verfügt er über ein eingebautes Mini-Kraftwerk?

Natürlich nicht. Die unterschiedlichen Anschlussarten realisieren den Dreidraht- (a) bzw. Zweidrahtmodus (b) des Sensors. Im Zweidrahtmodus werden die beiden äußeren Anschlüsse des DS18B20 direkt miteinander verbunden, so dass eine sparsame zweiadrige Verkabelung mit dem Rest der Schaltung genügt. Da im inaktiven Zustand alle Ausgänge, die an die Datenleitung DQ angeschlossen sind, hochohmig sind, wird die Leitung über R1 als Pull-up-Widerstand auf VDD-Potential gezogen, und die Stromaufnahme des Sensors ist mit etwa 1,5 µA so gering, dass er sich problemlos über die Datenleitung versorgen kann ("parasitäre" Versorgung, auch Phantomspeisung genannt). Gleichzeitig lädt sich ein winziger Kondensator im Sensor auf, der während der kurzen Zeiten, in denen die Datenleitung auf Masse liegt (niemals länger als 0,5 ms am Stück), die Stromversorgung intern sicherstellt. Lediglich während der Temperaturmessung benötigt der DS18B20 für maximal 0,75 Sekunden einen deutlich höheren Strom von 1,5 mA. Damit die Versorgungsspannung nicht zusammenbricht, legt der Microcontroller als System-Master in dieser Zeit die Datenleitung über PB4 ausnahmsweise auf VDD-Pegel.

Was macht das Programm?
Nach dem Einschalten oder einem Controller-Reset (Massekontakt an PB5) lässt der Microcontroller den Sensor eine Temperaturmessung durchführen und gibt byteweise folgende Informationen über den Piezo-Piepser aus:

Anschließend schaltet der Controller den Sensor aus (PB3 auf Masse) und begibt sich in den Power-Down-Modus.

Die Sensoradresse sollte immer mit 40 beginnen. Darin drückt sich die "Familienzugehörigkeit" des DS18B20-Sensors aus. Die eigentliche, je Sensor unterschiedliche Adresse ist 6 Bytes lang (48 Bits). Als letztes Byte folgt die Prüfsumme, die ebenfalls in den Flashspeicher eingebrannt ist und auch zur Adressierung des Sensors benötigt wird.

Der Sensor-RAM-Inhalt stellt ein Sammelsurium unterschiedlicher Daten dar. Am wichtigsten sind die ersten beiden Bytes, B0 und B1. Sie enthalten die Temperatur in 16tel Grad Celsius in Zweierkomplementdarstellung. Im Falle einer Temperatur über dem Gefrierpunkt errechnet sich diese in °C als B0 * 16 + B1 / 16. Die übrigen Bytes geben die aktuelle Sensorkonfiguration und weitere Informationen wieder. Bitte schlagen Sie im Datenblatt des DS18B20 nach, um die Details zu erfahren.

Die beiden Datengruppen werden durch ein kurzes Blinken der LED getrennt, um die Orientierung zu erleichtern. Darüber hinaus zeigt die LED einen Übertragungsfehler an, der anhand einer nicht passenden Prüfsumme (CRC-Summe, das letzte Byte jeder Datengruppe) erkannt wird. Die LED leuchtet in diesem Fall während der Ausgabe der Daten, die vemutlich fehlerhaft sind.


Wenn Sie mit einem nicht zu hochohmigen Voltmeter, am besten einem Zeigerinstrument, die Spannung auf der Datenleitung (also an PB4 bzw. DQ) gegenüber Masse messen, können Sie das Geschehen beobachten, denn der Messgerät-Innenwiderstand lässt die nur über R1 bereitgestellte Spannung leicht einbrechen. In der Messphase mit VDD an PB4 steigt die Spannung daher ein wenig an. Um die übertragenen Daten "sehen" zu können, benötigen Sie ein Oszilloskop, am besten ein Speicheroszi, denn die GND-Signale haben eine Zeitdauer von wenig mehr als 1 µs (bspw. Bit-Leseanforderung) bis etwa 500 µs (Sensor-Reset), sind also viel zu kurz, als dass man mit einem Voltmeter etwas erkennen könnte.

Jeder DS18B20 wird bei der Herstellung mit einer individuellen, eindeutigen 64bit-Adresse versehen. Über diese Adresse, die der Master in einem Mehr-Sensor-System über ein durchdachtes Verfahren zunächst systematisch ermitteln muss, lässt sich jeder Sensor gezielt ansprechen. Daher ist es prinzipiell möglich, viele dieser Sensoren parallel auf eine Datenleitung zu schalten. Das hier verwendete einfache Programm beherrscht die Technik der Adressierung allerdings nicht, sondern verwendet spezielle Sensor-Kommandos, die alle vorhandenen Sensoren unabhängig von ihrer Adresse gleichzeitig ansprechen. Gedacht ist das für den 1-Sensor-Betrieb.

Aus dem unten herunterzuladenden Programm lässt sich entnehmen, wie die Datenkommunikation mit Sensoren des hier verwendeten Typs funktioniert. Wer sich über alle Möglichkeiten des DS18B20 informieren möchte, dem sei das Datenblatt des Herstellers MAXIM ans Herz gelegt. Wie üblich lässt es sich im Internet leicht aufspüren und herunterladen.

Download

Die Dateien sind für den ATtiny13 und eine Taktrate von 1,2 MHz ausgelegt. Anpassungen für einen anderen Controller und/oder eine andere Taktfrequenz sollten leicht möglich sein, da das Programm ausführlich kommentiert ist. Das Programm benötigt die in dieser Rubrik vorgestellten Makros.

Wenn Ihnen noch die nötigen Bauteile fehlen und Sie möglichst schnell loslegen wollen, werfen Sie einen Blick in unsere Bausatzrubrik. Dort finden Sie einen Bausatz Digitalthermometer. Dieser enthält einen DS18B20 sowie einen "randvoll" programmierten ATtiny13A und realisiert eine regelmäßige Temperaturausgabe. Zusätzliche Sensoren können angeschlossen werden; der Microcontroller ermittelt die Adressen und spricht, anders als das einfache Programm auf dieser Seite, jeden Sensor gezielt an.


Zurück zur Übersicht