Die Temperatur ist in vielen industriellen Prozessen ein wichtiger Steuerungsparameter. Auch zu Hause wird die Temperatur von Kühl- und Gefrierschrank, Heizung, Küchenherd und Klimaanlage überwacht und geregelt. Wetterstationen, Autos, Computer, Tablets und Smartphones kontrollieren ebenfalls die Temperatur. Die Temperatur ist wohl die am häufigsten erfasste physikalische Größe der Welt.

Sogar mein billiger Bluetooth-Lautsprecher warnt, wenn es ihm zu heiß wird (wie ich feststellen musste, als ich ihn einmal auf die Heizung gestellt hatte). Da die Menschheit so gerne die Temperatur misst, haben wir uns zur Entwicklung eines Geräts entschieden, das bis zu sechs Temperaturwerte erfassen kann. Das mag überdimensioniert erscheinen, aber für eine Prozesssteuerung können mehr Kanäle als nur einer oder zwei (innen/außen) erforderlich sein. Auch der Messbereich wurde mit -240 °C bis +850 °C sehr großzügig gewählt. Dieser Bereich wird von der Software beschränkt, die tatsächlichen Grenzen hängen von den verwendeten Sensoren ab.

Widerstandsthermometer

Zur Temperaturmessung werden Widerstandsthermometer in Form von Pt100-Temperaturfühlern verwendet. Widerstandsthermometer oder Resistance Temperature Detectors (RTD) bestehen aus einem Metalldraht mit einem bekannten Widerstands-/Temperaturverhältnis, der auf ein geeignetes Trägermaterial aufgewickelt ist. Typischerweise wird ein Platin-, Kupfer- oder Nickeldraht verwendet. Die Genauigkeit des Sensors hängt dabei von der Reinheit des Metalls ab. Platin hat das stabilste Widerstands-/Temperaturverhältnis über den größten Temperaturbereich.

Ein Pt100-Temperaturfühler ist also ein RTD aus Platindraht („Pt“ im Periodensystem). Der Wert „100“ besagt, dass sein Widerstand bei 0 °C 100 Ω beträgt. Es gibt auch andere Werte wie 500, 1000 oder sogar 2000. Pt100-Sensoren sind weit verbreitet und leicht zu beschaffen. Sie sind in verschiedenen Qualitätsstufen (Klassen) erhältlich, die den Preis, den Messbereich, die Genauigkeit und den Fehler bestimmen. Temperaturfühler besitzen auch eine unterschiedliche Anzahl von Anschlüssen; zusätzliche Anschlüsse werden verwendet, um den Widerstand der Anschlussdrähte und der Anschlüsse zu kompensieren. Der dadurch eingetragene Messfehler kann, da die Verkabelung mitunter ziemlich lang ausfällt, erheblich sein. Bei einem 2-Draht-Sensor ist eine Kompensation nicht möglich. Um zuverlässige und reproduzierbare Ergebnisse zu gewährleisten, haben wir uns für 3-Draht-RTDs entschieden. Ein Kompromiss, denn noch genauere 4-Draht-RTDs sind teurer und würden die Schaltung verkomplizieren.

Ein RTD ist kein Thermoelement!

Obwohl die Temperaturabhängigkeit des Widerstands von Metallen von Sir Humphrey Davy und die Thermoelektrizität von Thomas Johann Seebeck kurioserweise im gleichen Jahr 1821 entdeckt wurden, handelt es sich um zwei völlig unterschiedliche Effekte. Ein Thermoelement ist eine Verbindung von zwei verschiedenen Metallen, die durch den thermoelektrischen Effekt eine temperaturabhängige Spannung erzeugt. Daher benötigt ein Thermoelement für den Betrieb keine Stromquelle, während ein RTD eine Form der Anregung erfordert. Thermoelemente sind in der Regel weniger präzise als RTDs, aber preiswerter.

Linearität

Wichtig zu beachten ist, dass RTDs ein leicht nichtlineares Widerstands-Temperatur-Verhältnis aufweisen (Bild 1), so dass einige Berechnungen durchgeführt werden müssen, um ein korrektes Messergebnis zu erhalten. Lange wurde für Platin-RTDs die Callendar-Van Dusen-Gleichung verwendet, aber 1990 ersetzte das Comité International des Poids et Mesures sie durch ein Polynom 12. Ordnung, das über den Temperaturbereich von -259,35 °C bis 0 °C gültig ist, und ein Polynom 9. Ordnung für Temperaturen von 0 °C bis 961,78 °C. Da die Berechnung solcher Polynome eine Menge Rechenleistung erfordert und fehleranfällig ist, werden üblicherweise und auch von uns einfache Lookup-Tabellen verwendet.
 
Bild 1. Das Verhältnis (in blau) zwischen Widerstand und Temperatur eines Platindrahtes (Pt) ist nichtlinear. Das Ideal kann mit einer Lookup-Tabelle aus kurzen „geraden“ Segmenten der Kurve angenähert werden.

Howland-Strompumpe

Wie erwähnt, muss ein RTD mit einer konstanten Spannung oder einem Konstantstrom erregt werden. Wir haben eine Konstantstromquelle gewählt, da sie weniger Probleme mit langen Anschlussdrähten hervorruft. Die Spannung am Sensor hängt so nur vom Strom (und natürlich von der Temperatur) ab und nicht zusätzlich vom Widerstand der Anschlusskabel.
Bild 2. Die Howland-Strompumpe besitzt eine sehr
hohe Ausgangsimpedanz. Sie wird hier zur Anregung
eines 3-Draht-RTDs verwendet.

Konstantstromquellen-Entwürfe gibt es wie Sand am Meer, wobei für RTDs oft die sogenannte Howland-Strompumpe (Bild 2) verwendet wird. Diese Art von Quelle hat den Vorteil, dass sie im Vergleich zu anderen Schaltungen eine sehr hohe Ausgangsimpedanz aufweist und Strom sowohl liefern als auch aufnehmen kann (source und sink). Damit die Schaltung wie gewünscht funktioniert, sollten die Widerstände um den Operationsverstärker R1...R4 eine geringe Toleranz von 1 % oder besser aufweisen.

Wenn das Verhältnis R1/R2 gleich dem Verhältnis R3/R4 ist, dann ist der Ausgangsstrom gegeben durch:

IRTD = (V+ − V−) / R3 [A]




Kompensation der Anschlüsse

Bild 2 zeigt auch, wie die drei Anschlüsse des RTD mit der Stromquelle gekoppelt werden. Angenommen, die drei Anschlusskabel RW sind identisch und wir messen die Spannungen V und VRW (eigentlich muss es VRW heißen) bei einer sehr hohen Eingangsimpedanz (das heißt, es fließt kein nennenswerter Strom in Richtung V und VRW), dann berechnet sich die Spannung über dem RTD als:

VRTD = V − 2 VRW [V]

Damit ist die Theorie schon abgeschlossen, wir können mit dem Studium des „richtigen“ Schaltplans fortfahren.

Der Eingangsmultiplexer

 
Bild 3. Schaltung des Multi-Node-Temperaturloggers. Die analoge Eingangsstufe befindet sich auf der linken Seite, der digitale Teil auf der rechten.

Links in Bild 3 finden sich die Anschlüsse K3...K8 für die sechs RTD-Kanäle. Ein Anschluss jedes RTD ist mit Masse verbunden, die beiden anderen mit CMOS-Multiplexern des Typs 4051. IC7 leitet das Signal V aus Bild 2 an den Rest der Schaltung weiter, IC5 macht dasselbe für das Signal VRW. Der dritte Multiplexer IC9 arbeitet entgegengesetzt und verbindet den Ausgang der Stromquelle - aufgebaut um IC10 - mit dem ausgewählten RTD.

Jeder Multiplexer verfügt über acht Kanäle, von denen zwei für die Referenzsignale Vmin (GND) und Vmax (VR3) verwendet werden. Jetzt wird klar, warum es ausgerechnet sechs RTD-Kanäle gibt. Diese Referenzsignale folgen den gleichen Wegen wie die RTD-Signale. R3, ein hochgenauer 0,01-%-iger Widerstand, ist sogar in der Nähe der RTD-Anschlüsse montiert, um einen RTD so gut wie möglich nachzuahmen. Da die Werte dieser „nachgeahmten“ Signale bekannt sind, kann die Software die Digitalisierung kalibrieren und Fehler beseitigen, die durch den Multiplexer und die Stromquelle verursacht werden.

Die Signale der Eingangsmultiplexer werden durch IC6 und IC8 jeweils um den Faktor 13 verstärkt. Das Signal V gelangt anschließend zum ADC-Eingang 3 (AIN0.3) des Mikrocontrollers, das Signal VRW zu AIN0.5.

Stromquelle, Teil zwei

Die Howland-Strompumpe besteht aus IC10 und den Widerständen R1, R20, R21 und R22. V+ aus unserer obigen Beschreibung ist mit Masse verbunden, so dass die Spannung 0 V beträgt. Die Spannungsreferenz IC11 erzeugt V- = -2,5 V. R21 entspricht R3 aus dem obigen Prinzipschaltbild. Der Ausgangsstrom ist:

(0 − −2.5) / 10.000 = +250 [µA].

Spannungsversorgung

Theoretisch könnte die Versorgungsspannung an K1 bis zu 15 VDC betragen, was jedoch die Low-Drop-Spannungsregler unnötig belasten würde. Die minimale Versorgungsspannung beträgt 7,5 VDC, der empfohlene Wert 9 VDC. Die Stromaufnahme liegt bei etwa 70 mA, einschließlich der 20 mA für die Hintergrundbeleuchtung des LCDs, die einen eingebauten Strombegrenzungswiderstand besitzt. IC1 reduziert die Versorgungsspannung auf 5 V für den größten Teil der Schaltung und IC2 auf 3,3 V für den Mikrocontroller IC4. Die analoge Eingangsstufe benötigt zusätzlich eine Versorgungsspannung von -5 V, für die die Ladungspumpe IC3 sorgt.

Altehrwürdig: der Mikrocontroller

In den letzten Jahren haben wir so viele arduino-uno-basierte Schaltungen vorgestellt, dass man schon glauben könnte, es gäbe nur einen einzigen Typ 8-Bit-Mikrocontroller. Mitnichten, diese Schaltung wird von einem aufgebohrten 8051 gesteuert! Bevor Sie sich jetzt angewidert abwenden, bedenken Sie, dass der fast 50 Jahre alte Controllertyp immer noch weit verbreitet ist. Zudem läuft hier eine moderne Fassung C8051F350 von Silicon Labs intern mit 49 MHz, die die meisten Befehle in einem Zyklus ausführt, was sie zu einem ziemlich schnellen Bauteil macht.

Der C8051F350 ist Mitglied einer vierköpfigen Familie, die sich nur durch Gehäusetyp und Auflösung des Analog-/Digitalwandlers unterscheiden. Der F350 ist der größte dieser Controller mit einem Sigma-Delta-ADC von 24 Bit Auflösung, acht dedizierten analogen Eingängen und 17 digitalen I/O-Pins. Der Controller ist stark analog-orientiert und weist integrierte digitale Filter und zwei 8-Bit-DACs auf. In diesem Projekt nutzen wir nicht alle seine Möglichkeiten (wann kommt das schon mal vor?), aber Sie sollten den Controller für zukünftige Projekte im Hinterkopf behalten!

Obwohl der C8051F350 mit 3,3 V betrieben wird, sind seine digitalen I/O-Pins 5-V-tolerant, so dass er gut mit der 5 V betriebenen Peripherieschaltung zusammenarbeiten kann. Beachten Sie die Pull-up-Widerstände R4...R8 und das Array RN1.

Ein Quarz oder ein anderer externer Taktgeber ist nicht erforderlich, da der Controller einen kalibrierten Oszillator integriert.

Vier Drucktaster S1...S4 und ein LCD-Display stellen das User-Interface dar. Der LCD-Kontrast lässt sich an P1 einstellen. Sollte beim ersten Einschalten das Display gar nichts anzeigen, drehen Sie erst einmal am Kontrast, bevor Sie in Panik verfallen!

Für die Kommunikation mit einem Computer können wir einen USB/TTL-Seriell-Wandler auf die Platine stecken (müssen wir aber nicht). Das Foto zeigt noch den guten alten FT232R-BoB aus dem Elektor-Shop, der mittlerweile durch den neuen FT231X-BoB (Nr. 180537-91) ersetzt wurde, welcher kompatibel zum De-facto-Standard für FTDI-USB/Seriell-Kabel ist. Sie können aber auch jede andere funktional gleichwertige Schnittstelle einsetzen.

Softwaredetails

Als wir die Schaltung entwickelt und den Text dazu geschrieben haben, verteilten die Leute von Silicon Labs freundlicherweise noch kostenlose Lizenzen für Keil µVision5, so dass alle, die Software für die C8051-MCUs in C entwickelten, dies auch ziemlich komfortabel tun konnten. Wenn Sie eine solche Lizenz anfordern, scheint sie nur einen Monat gültig zu sein, aber sobald sie in der IDE installiert ist, wird sie zu einer dauerhaften Lizenz. Natürlich haben wir diesen Weg beschritten und alles lief gut - aber man weiß ja nie, wann sich die Dinge ändern. Sicherheitshalber haben wir unsere Software deshalb auf den Open-Source-Compiler SDCC für 8051- und PIC-Controller portiert.

SDCC arbeitet nicht projektorientiert und nutzt kein anderes GCC-basiertes Tool. Unser Projekt besteht daher nur aus einem Haufen von Dateien in einem Ordner und einer Batch-Datei zum Kompilieren.

Wie üblich beginnt das (sichtbare) C-Programm in der Funktion main. Zunächst wird darin der Watchdog-Timer ausgeschaltet. Sie können ihn jederzeit wieder einschalten, wenn Sie wollen. Beachten Sie, dass der Keil-Compiler dies schon im Runtime-Startupfile (CRT) erledigt, so dass Sie es gar nicht bemerken. So wie wir, wir mussten dies „auf die harte Tour“ herausfinden.

Nach der Initialisierung der Peripherie der MCU – Systemtakt-Timer 1 ms, UART läuft auf 9600 Baud und so weiter - führt das Programm eine Kalibrierung des ADC durch. Dies ist ein ziemlich nützliches Feature der MCU, da wir damit viele der Unvollkommenheiten des analogen Frontends beseitigen können. Nach der Kalibrierung ist Vmax - die Spannung über dem 0,01-%-igen Widerstand R3 - auf 0xffffff (24-Bit-Höchstwert) und Vmin (GND) auf 0 eingestellt. In der Software bleibt für uns nichts weiter zu korrigieren.

Ein Wort zum Sampling

Nach dieser Initialisierung dreht sich das Programm im Kreise, schaut, ob irgendeine Taste gedrückt wird und aktualisiert bei Bedarf die Anzeige. Einmal pro Sekunde wird ein Kanal gemessen, der Messwert in Grad Celsius oder Fahrenheit umgewandelt und ausgegeben. Eine Sekunde später wird der nächste Kanal aktualisiert. Im Hintergrund läuft der ADC mit fast 18,7 Hz. Diese recht hohe Geschwindigkeit ist aus zwei Gründen erforderlich. Um einen Fühler zu messen, müssen zwei Spannungen (V und VRW) umgewandelt werden, da der Spannungsabfall über den Anschlusskabeln kompensiert werden muss. Zweitens verfügt der ADC über ein eingebautes Tiefpassfilter, das dreimal abgetastet werden muss, um einen gültigen Ausgangswert zu berechnen. Es werden also pro RTD mindestens sechs Abtastungen vorgenommen, was 320 ms dauert. Durch die Messfrequenz von 1 Hz hat das System aber genügend Muße, um in aller Ruhe zu messen, zu filtern und zu berechnen.

Lookup-Tabelle

Die rohen Messwerte werden mit Hilfe einer Lookup-Tabelle in Temperaturwerte umgerechnet. Pt100-Konversionstabellen findet man reichlich im Internet; wir haben eine von -240 °C bis +850 °C mit einer Schrittweite von 10 Grad zusammengestellt. Unter -240 °C werden die Messungen immer ungenauer, so dass wir die Anzeige auf -260 °C begrenzt haben. Aus ähnlichen Gründen wurde die Obergrenze auf +850 °C festgelegt.

Natürlich liegen die meisten Rohwerte zwischen zwei Tabellenwerten, daher wird der Temperaturwert linear interpoliert. Wenn man genauere Konvertierungen wünscht, macht man die Schrittweite der Lookup-Tabelle kleiner. Das ist leicht möglich, solange die Tabelle in den (allerdings knapp bemessenen) Speicher passt. Wenn die Tabelle wirklich groß und unhandlich wird, sollten Sie vielleicht einen effizienteren Suchalgorithmus implementieren oder eine polynomiale Approximation verwenden.

Konstruktion

Auch wenn überwiegend SMDs verwendet werden, sollte die Bestückung der Platine nicht allzu schwierig sein. Beginnen Sie mit den flachen zweipoligen Bauteilen wie Widerständen und Keramikkondensatoren und fahren Sie dann mit den höheren fort. Nicht vergessen: die Orientierung der gepolten Bauteile wie Dioden und Elektrolytkondensatoren muss stimmen!

Empfehlenswert ist es, zuerst die Spannungsversorgung (D2, IC1 und IC2 und die umgebenden Kondensatoren) aufzubauen und zu testen, bevor man die anderen Bauteile montiert.

In der Eingangsstufe sollten alle Widerstände eine Toleranz von höchstens 1 % aufweisen, außer R3, der höchstens um 0,01 % vom Nennwert abweichen sollte. Die Qualität der Stromquelle steht und fällt mit der Toleranz von R1, R20, R21 und R22. Hier ist das Geld für Typen mit einer Toleranz von 0,1 % oder besser gut angelegt.

Wenn Sie die USB-Schnittstelle montieren möchten, sollten Sie für das darüber liegende Display extra hohe Buchsen-/Stiftleisten verwenden.

Laden der Firmware

Die Firmware wird über den Verbinder K2 in den Controller geladen. Die Pinbelegung von K2 entspricht dem offiziellen Silicon Labs 2-wire C2 Programming/Debugging Interface Standard, so dass man einfach und ohne Sorge jeden C2-kompatiblen Programmierer aufstecken kann. Weniger einfach ist es hingegen, einen solchen Programmer in die Finger zu bekommen. Deshalb haben wir uns einen eigenen gebastelt. Auf GitHub oder der Projektseite zu diesem Artikel können Sie kostenlos einen Arduino-Sketch herunterladen, der jedes Arduino-Uno-kompatible Board in einen C2-Programmer verwandelt. Die 5-V-toleranten Controllerpins erleichtern die Zusammenarbeit beider Systeme.

Verbinden Sie den Arduino-Pin A0 mit Pin 7 von K2 (C2CK), den Arduino-Pin A1 mit Pin 4 von K2 (C2D) und Arduino-GND mit Pin 2 von K2. Schließen Sie den Arduino am Computer an, bevor Sie den Temperaturmonitor mit Strom versorgen.

Ein Python-3-Skript, ebenfalls im Download enthalten, ermöglicht das Hochladen von Intel-HEX-Dateien auf den selbst gebauten Programmer. Dieses Skript benötigt die Bibliothek pySerial.

System im Einsatz

Es gibt zwei Firmware-Versionen für dieses Projekt, eine mit Debuggingoptionen (Suffix d) und eine mit weniger Optionen. Die wichtigsten Funktionen sind aber in beiden Fällen gleich.
  • MENU: Drücken Sie die Taste S1, um die Einstellungen einzugeben. Auf dieser Seite können Sie die Temperatureinheit zwischen Celsius und Fahrenheit umschalten, indem Sie erneut S1 drücken. Mit den Tasten DECR (S2) und INCR (S3) können Sie das Mess- beziehungsweise Aktualisierungsintervall der Anzeige von einer Sekunde bis zu einer Minute einstellen. Wenn Sie damit fertig sind, können Sie entweder SAVE (S4) drücken, um die neuen Einstellungen im nichtflüchtigen Speicher aufzubewahren oder nichts tun, bis die Seite „abgelaufen“ ist. Dann werden die neuen Einstellungen nur bis zur nächsten Änderung oder bis zum Abschalten verwendet.
  • SAVE: Drücken Sie die Taste S4, um das System neu zu kalibrieren.

Die Debug-Firmware besitzt diese zusätzlichen Funktionen:

  • DECR: Wenn Sie die Taste S2 während der Inbetriebnahme drücken und gedrückt halten, bis die Splash-Screens durchlaufen sind, wird die ADC-Kalibrierung beim Start übersprungen. Verwenden Sie SAVE (S4), um zu einem beliebigen Zeitpunkt zu kalibrieren.
  • DECR und INCR: Durch gleichzeitiges Drücken der Tasten S2 und S3 wird die Debug-Seite geöffnet, der Sie die rohen 16-Bit-ADC-Werte (Signale V/RTD und VRW/Wire) entnehmen können. Durch Drücken von INCR wird der nächste Kanal ausgewählt. Drücken Sie SAVE (S4), um in den Normalmodus zurückzukehren.

Datenlogging

Stecken Sie BOB1 auf das Board (oder verwenden Sie einen anderen USB-Seriell-Konverter mit FTDI-kompatiblen Anschlüssen) und verbinden Sie den Konverter mit einem freien USB-Anschluss an einem PC. Der PC sollte BOB1 als serielle Schnittstelle erkennen. Starten Sie ein Terminalprogramm und konfigurieren Sie es für 9600 Baud, acht Datenbits, keine Parität und ein Stoppbit (9600n81). Sobald das Board unter Spannung steht, sendet es kommagetrennte Werte (CSV) im „menschenlesbaren“ ASCII-Format. Die meisten Terminalprogramme für die serielle Schnittstelle können Daten auch in einer Datei aufzeichnen, um sie zum Beispiel in einer Tabellenkalkulation weiter zu verarbeiten. Voilà, so einfach geht das Datenloggen!
 
Projektinformation
Tags: 8051, Temperaturmessung, Widerstandsthermometer
Preis: etwa 50 €
Level: Fortgeschrittene
Tools: Lötkolben, C2-Programmer (siehe Text)
Zeitbedarf: etwa 4 Stunden
 
Technische Daten
* 6 Kanäle für Pt100-RTD
* Messbereich: −240 °C bis +850 °C
* 8051-MCU
* 2-zeiliges alphanumerisches Display
* Serielle Ausgangsdaten im CSV-Format
 
Im Elektor-Shop
 

Stückliste


Widerstände:
alle 0805, 1 %
R4,R5,R6,R7,R8 = 10 k
R1,R20,R21,R22 = 10 k, 0,1 %
R2,R14 = 10 Ω
R3 = 470 Ω, 0,01 %
R9,R10,R11,R12,R13,R15,R17,R18,R23 = 1 k
R16,R19 = 12 k
P1 = Trimmpoti 10 k
RN1 = Widerstandsnetzwerk, 6 × 10 k
 
Kondensatoren:
(0805)
C1,C19 = 1 µ
C2,C5,C9,C14,C16,C28 = 10 µ, 16 V, Case-A
C3,C4,C6,C8,C10,C11,C12,C17,C20,C21,C22,C24,C25,C26,C27,C29,C30,C31,C32,C33,C34,C35,C36,C38,C39,C40,C41 = 100 n
C7 = 47 µ, 25 V, Durchmesser 6,3 mm
C13,C15 = 100 µ, 16 V, Case-C
C18,C23,C37 = 1 n
 
Halbleiter:
D1,D2 = MBR140SFT1G
IC1 = LD1117DT50TR
IC2 = LD1117DT33TR
IC3 = TC7660EOA
IC4 = C8051F350-GQ, LQFP32
IC5,IC7,IC9 = 4051, SOIC16
IC6,IC8,IC10 = OP07CD
IC11 = LM336M-2.5
 
Außerdem:
K1 = 2-polige Platinenanschlussklemme, Raster 3,5 mm
K2 = 2x5-polige Stiftleiste, Raster 2,54 mm
K3...K8 = 3-polige Platinenanschlussklemme, Raster 3,5 mm
LCD1 = Alphanumerisches LCD, 2 Zeilen, 16 Zeichen, 5 V, mit Hintergrundbeleuchtung
S1...S4 = Tastschalter, 6 × 6,2 mm2, SMD
BOB1 = USB/Serial-BOB mit passenden Anschlüssen
1x16-polige Buchsenleiste/Stiftleiste, Raster 2,54 mm für LCD1
Platine Elektor 130548-1
 
(180118​)
 
Wollen Sie weitere ElektorLabs-Artikel lesen? Jetzt Elektor-Mitglied werden!