|
Ein
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.
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
-
- 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.
- Master sendet START-Bedingung
Erst SDA auf
low setzen, dann SCL. Damit sind die angeschlossenen Geräte
(unser LM75) lesebereit.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- Master sendet STOP-Bedingung
SCL auf high
setzen, dann SDA auf high setzen. Jetzt sind wir wieder
da, wo wir hergekommen sind.
- 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!
|