^

 Temperatur-Sensor selbstgebaut

 


E
in Temperatursensor mit integriertem AD-Wandler:

     
    Wie messen wir mit möglichst geringem Aufwand Temperaturen mit dem PC? Bisher hätten wir einen temperaturabhängigen Widerstand als Spannnungsteiler an einen AD-Wandler angeschlossen. Das ist aufwändig und muss geeicht und linearisiert werden.
     
    Inzwischen beglücken uns die Halbleiter-Hersteller mit Sensoren, in die der AD-Wandler schon integriert ist. Sowas können wir fast ohne zusätzliche Beschaltung am PC zum Laufen überreden.
     
    Auf dieser Seite wollen wir uns mit dem LM75 von National Semiconductor beschäftigen. Der Sensor kann Temperaturen von -55°C bis +125°C bei einer Auflösung von 0,5°C messen. Der interne AD-Wandler benötigt etwas Zeit, ca. 10 Messungen pro Sekunde sind erreichbar. Es gibt eine 3,3V und eine 5V Version. Beide dürfen bei 3,0 - 5,5V betrieben werden. Die Typenbezeichnung gibt lediglich an, bei welcher Versorgungsspannung die Temperatur genau ausgegeben wird. Ich habe die 3,3V Version gewählt. Viele Schnittstellen geben nicht mehr Spannung ab und falls doch, ist es leichter die Spannung zu verringen, als sie zu vergrößern.
     
    Der Datentransfer geschieht über das I²C-Bus Protokoll. Das erzeugen wir softwaremäßig mit zwei Ausgängen und einem Eingang der parallelen Schnittstelle.
     
    • Keine separate Stromversorgung erforderlich.
    • Aufbau mit nur vier Bauteilen.
    • Materialwert gut 5 Euro.

    Haftung:

    Wie immer: Alles, was nach diesen Veröffentlichungen nachgebaut wird, geschieht auf eigene Gefahr!

     
    Schaltungsbeschreibung:
     
    Das IC erhält seine Versorgungsspannung (+Vs) aus einem Datenausgang (hier Datenausgang 7 auf Pin 9) der parallelen Schnittstelle. R1 soll den Strom im Falle eines Kurzschlusses auf unschädliche Werte begrenzen. Außerdem haben wir mit der Dimensionierung von R1 die Möglichkeit, die Versorgungsspannung auf die gewünschten 3,3 V einzustellen.
     
    Über die bidirektionale Datenleitung (SDA = Serial Data) wird auf dem I²C-Bus gelesen und geschrieben. Mittels Pin 14 der parallelen Schnittstelle (AUTO FEED) schreibt unser PC auf den Bus. Die Daten vom IC werden über Pin 10 (ACKNOWLEDGE) in den PC gelesen. Beim I²C-Bus ist die Datenleitung permanent mit einem pull-up Widerstand nach +5V gezogen. Ein angeschlossener Baustein (Slave, unser LM75) sendet Daten, indem er die Leitung SDA nach Masse zieht (=logisch 0) oder eben nicht (=logisch 1).  Die pull-up - Spannung erzeugen wir, indem wir den Ausgang AUTO FEED auf +5V setzen, bevor der Slave Daten sendet. Einige Schnittstellen sind so niederohmig, dass es dem LM75 nicht gelingt, SDA völlig nach Masse zu ziehen. R2 unterstützt hierbei soweit, dass es funktioniert.
     
    Der Ausgang STROBE (Pin 1) des Parallelports gibt den Takt (SCL = Serial Clock) auf den I²C-Bus. Achtung: Alle Pin-Angaben beziehen sich auf den 25-Pol SUB-D Stecker, nicht auf den 36-Pol Centronics.
     
    Der Kondensator dient der Entstörung. Ohne ihn weichen die Messwerte um 3 - 5 °C nach oben ab.
     
    Je nachdem, wie wir A0-A2 entweder mit Masse oder mit +Vs verbinden, können wir die Adresse des ICs im Bus festlegen. Mit den drei Anschlüssen sind 8 verschiedene LM75 ansprechbar. Hier sind alle Pins mit Masse verbunden, die 3 Adressbits müssen dementsprechend auf 0 gesetzt werden.
     
    Den Schaltausgang (O.S.) benutzen wir hier nicht.
     
    Vom Stecker zum LM75 sind vier Kabel erforderlich (SDA, SCL, +Vs, GND).
     
    Bauteileliste mit Conrad-Bestellnummern:
     

    Bauteil

    Beschreibung

    Best-Nr

    Preis in € 

    IC

    LM75 CIM-3, 3,3 V

    16 58 83

    3,55

    R1

    Widerstand 0,6 W, 1%, 2,2 KOhm

    41 82 93

    -,11

    R2

    Widerstand 0,6 W, 1%, 330 Ohm

    41 81 96

    -,11

    C1

    Keramik-Vielschicht-Kondensator 0,1 µF

    45 30 99

    -,26

    Stecker

    SUB-D Stiftleiste 25-Pol

    74 16 71

    -,59

     "

    SUB-D Steckergehäuse 25-Pol

    71 12 92

    -,77

    Gesamtpreis

    5,39

     
    Aufbau:
     
    Eine Platine ist eigentlich nicht erforderlich. Die Widerstände löten wir direkt am SUB-D Stecker an. Der Kondensator muss möglichst nahe an das IC! Das IC ist nur als SMD-Typ erhältlich. Zum Testen habe ich eine Lochrasterplatine mit "Beinen" versehen und darauf das IC gelötet. Die ganze Einheit konnte ich dann zum Testen in ein Steckboard einfügen.
     
    Prüfung:
     
    Für die ersten Versuche sollte der PC mit reinem DOS laufen, um Einflüsse von Windows auszuschließen. Wenn Windows 9x läuft, klicken wir Start - Beenden... - Im MS-DOS-Modus neu starten. Dann starten wir LM75-I2C.EXE. Erst wenn alles fehlerfrei läuft, können wir es im DOS-Fenster probieren.  Mit WinNT, Win2000, WinXP und Linux geht es garnicht, weil keine Portzugriffe zugelassen werden. Hier hilft eine DOS-Bootdisk (Download hier).
     
    Das Programm sollte jetzt die Temperatur anzeigen. Bei Zimmertemperatur genügt es, mit dem Finger auf das IC zu tippen, um die Temperatur steigen zu lassen. Arbeitet die Schaltung nicht, wird -0,5 °C angezeigt (beide Datenbytes auf 255). In diesem Fall erstmal den Schaltungsaufbau genau kontrollieren, danach messen:
     
    Ist das Programm gestartet, müssen an Pin 8 des LM75 3 - 5 Volt anliegen, idealerweise 3,3V. Ist die Spannung zu klein, R1 verringern, ist sie zu hoch, R1 vergrößern. Auf SDA und SCL können wir schwankende Werte messen, weil dort die Spannung impulsweise anliegt. Mit einem einfachen piezokeramischen Schallwandler ohne Elektronik (z.B Conrad 75 16 59, € 1,51) können wir die Impulse hörbar machen. Ein sehr nützliches Utensil zur Fehleranalyse!
     
    Bekannte Macken:
     
    Werden Temperatursprünge von 31,5 °C zu 63,5 °C angezeigt (meist nur bei lm75-i2c.bas), kann es helfen R2 zu vergrößern (z.B. auf 10 kOhm). Ich vermute, dass der LM75 es in diesen Fällen nicht schafft, den Pegel an SDA wieder auf LOW zu ziehen, wenn er einmal auf HIGH war.
     
    Programmierung:
     
    Wer verstehen will, wie der LM75 programmiert wird, sollte sich das Datenblatt (Download im pdf-Format) zu Gemüte führen. Dort ist das Datenprotokoll ausführlich beschrieben. In LM75-I2C.BAS werden wir die dort verwendeten Begriffe wiederfinden. Ich habe den Quelltext ausführlich kommentiert. Wie wir die benötigten Pegel PC-seitig an der Schnittstelle erzeugen, steht im Schnittstellen-Tutorial.
     
    Auf die Möglichkeiten, den LM75 zu konfigurieren, habe ich in den Beispielprogrammen verzichtet. Das ist nur dann erforderlich, wenn wir den LM75 als autarken Regler mittels des Steuerausgangs (O.S.) verwenden wollen. Ein Nachteil dabei ist, dass er alle Einstellungen verliert, sobald die Versorgungsspannung fehlt. Das Beispielprogramm LM75-I2C.BAS enthält alle Befehlssequenzen des I²C-Bus in separaten Unterprogrammen. Wir können uns zusätzliche I²C-Sequenzen leicht zusammenstellen.
     
    Auf der Datenleitung SDA bedeutet ein high-Pegel (ca. 3-5V) eine logische 1 (Bitwert=1) ein low-Pegel (ca. 0V) eine logische Null (Bitwert=0). Der Pegel auf SDA wird geändert, während die Taktleitung SCL low ist. SDA wird gelesen, während SCL high ist. Der Master (=PC) steuert SCL und SDA. Bevor der Slave sendet, müssen wir SDA auf high setzen. Der Slave sendet seine Daten (-Bits) ja, indem er SDA auf Masse zieht oder high lässt.  Übrigens: Der Dateneingang an Pin 10 der seriellen Schnittstelle heißt zwar ebenfalls ACKNOWLEDGE, das hat aber erstmal nichts mit der Funktion ACKNOWLEDGE des I²C-Bus zu tun. Im Folgenden ist beschrieben was passieren muss, um einen vollständigen Temperaturwert zu lesen
     
    1. Master sendet STOP-Bedingung
      SCL auf high setzen, dann SDA auf high setzen. Beim ersten Durchlauf hat STOP den Sinn, eine definierte Ausgangssituation zu erzeugen.
    2. Master sendet START-Bedingung
      Erst SDA auf low setzen, dann SCL. Damit sind die angeschlossenen Geräte (unser LM75) lesebereit.
    3. Master sendet Adress-Byte
      Das Byte muss in unserem Fall binär so aussehen: 1001 0001. 1001 ist der unveränderliche erste Teil der Adresse jedes LM75. Die folgenden drei Bits bestimmen wir damit, wie wir die Leitungen A0/A1/A2 verbunden haben. Laut Schaltplan sind alle mit Masse verbunden, deshalb sind drei Nullen erforderlich.  Mit dem letzten Bit, sagen wir dem Slave, ob wir anschließend lesen oder schreiben wollen. Wir wollen vom Slave lesen, also ist der Bitwert 1.
      Das erste Bit gibt der Master sofort auf den Bus, indem er die SDA auf high setzt. Dann geht SCL auf high, anschließend auf low und das nächste Bit kann übertragen werden. Das ganze wiederholt sich insgesamt acht mal.
    4. Slave sendet ACKNOWLEDGE
      Nachdem der Master SCL ein weiteres mal auf high gesetzt, hat können wir der Pegel von SDA lesen. Hat der Slave SDA auf low gezogen, hat er damit den Empfang des Bytes quittiert (bleibt die Leitung high, wird in LM75-I2C.BAS eine Variable hochgezählt und angezeigt). Abschließend setzt der Master SCL wieder auf low.
    5. Slave sendet das erste Datenbyte
      Dazu folgt acht mal: SCL auf high setzen, SDA lesen (wenn high, Bitwert addieren), dann SCL wieder auf low setzen. Das erste Bit hat den Wert 128, das zweite 64, das dritte 32 usw.
    6. Master sendet ACKNOWLEDGE
      SDA auf low, dann SCL auf high, anschließend SCL wieder auf low. Damit quittiert der Master das Datenbyte und signalisiert Bereitschaft für ein weiteres Byte.
    7. Slave sendet das zweite Datenbyte
      Hier passiert dasselbe wie unter 5. Wir benötigen jedoch nur das erste (höchstwertige) Bit. Diese stellt den 0,5°C-Anteil dar. Die restlichen 7 Bits sind ohne Bedeutung.
    8. Master sendet NO ACKNOWLEDGE
      SDA auf high, SCL auf high, anschließend auf low. Das bedeutet, dass der Master das Byte empfangen hat, jedoch keine weiteren Daten wünscht.
    9. Master sendet STOP-Bedingung
      SCL auf high setzen, dann SDA auf high setzen. Jetzt sind wir wieder da, wo wir hergekommen sind.
    •  
    • Die Beispielprogramme:
    •  
    • Die *.bas Quelltexte sind für die DOS-Basic-Versionen QBasic/Quick-Basic 4.5/Basic PDS/VBDos geeignet, mit geringen Modifikationen (DIM ..) auch für Power-Basic. Sie sind als Anregungen für eigene Projekte zu verstehen. Wer das Ganze für andere Betriebssysteme umsetzen will (Windows, Linux), kann den Quelltext anpassen. Zum Problem, wie man Ports unter den verschiedenen Windows-Versionen und -Programmiersprachen anpricht, gibts bei win32bit.htm einige Hinweise.
    •  
    LM75-I2C.BAS
    Angezeigt werden Temperatur, beide Datenbytes, Anzahl der mittels Acknowledge vom LM75 ausgegebenen Fehler und die Messfrequenz. Alle I²C Befehlssequenzen sind in separate Unterprogramme/Funktionen unterteilt. Die Bits werden durch bitweise OR/AND - Verknüpfungen gesetzt/gelöscht. CPU-unabhängige Warteprozeduren sollen das richtige Timing auch auf neuesten PCs sicherstellen.
    LM75-I2C.EXE
    Gebrauchsfertiges Compilat von LM75-I2C.BAS.
    LM75-MIN.BAS
    Hier habe ich versucht, die Generierung eines Messwertes in eine einzige Funktion zu integrieren. Einfach Funktion aufrufen, und wir erhalten einen Messwert in °C. Ohne Warteprozeduren, dehalb für sehr schnelle PCs ggf. ungeeignet. In die Schnittstellen-Register werden absolute Werte geben. Angezeigt wird nur der Messwert in °C.
    Alle drei zum Download als ZIP-Archiv.
     
    T-LOG 1.3   >27.10.05 Programmfehler von Version 1.1/1.2 behoben<
    Mit ein paar kleinen Änderungen am Quelltext habe ich meinen grafischen Datenlogger zum Grafischen-Langzeit-Temperaturlogger umgestrickt. Es wird die Funktion aus LM75-MIN.BAS verwendet. Eine Dokumentation ist nicht dabei. Bedienung und Aussehen sind identisch mit G-Log 1.33.
     
    Fremdprogramme :
     
    Sven Kalow hat die Schaltung unter C# angesteuert. Auf seiner Homepage gibt es ein fertiges Programm und den Quelltext.
     
    Mehr Informationen:
     
     
    Viel Erfolg beim Nachbau!


Zur Startseite

 

Haftungsausschluss    Datenschutzerklärung    Impressum

© Frank Steinberg