PT1000, einfache Auswertung mit AVR (ATmega328)

Gast #3941875
Lesenswert?

Für eine einfache Temperaturmessung mit einem PT1000 sind die angefügte 
Schaltung und das Programm gedacht. Durch einen präzisen 
Referenzwiderstand 1000 Ohm 0,1% kommt man ohne Abgleich aus, sofern 
Genauigkeit bzw. Auflösung > 1 °C liegen dürfen. Da mit ratiometrischer 
Messung gearbeitet wird, ist ein stabiler Wert der Referenzspannung 
nicht erforderlich.
Um einen Meßfehler durch Eigenerwärmung des PT1000 zu vermeiden, wird 
die Spannung an Vref nur bei Bedarf eingeschaltet; im einfachsten Fall 
schaltet der µC Vref am entsprechenden Pin ein. Selbst bei Belastung mit 
15 mA, was für insgesamt sechs PT1000 reichen würde, liegt die Spannung 
noch bei Vcc-0,2 V.  (PROFI_VERSION :-)
Wem das nicht geheuer ist, kann auch einen separaten Pin (hier PB.0) als 
Vref-Spannungsquelle verwenden.
Bei längeren Zuleitungen muß auch deren Widerstand beachtet werden; 
R_ZULEITUNG sollte von derzeit 0 auf den entsprechenden Wert korrigiert 
werden.

Auch wenn hier nur ein Kanal gezeigt wird, bei einem ATmega88/328 im 
DIL-28 Gehäuse können bis zu sechs PT1000 angeschlossen und ausgewertet 
werden: ADC0 – ADC5.

Die Schaltung läßt sich auch auf andere µC übertragen, bei denen Vref 
als separater Anschluß verfügbar ist. Andernfalls muß noch ein FET als 
zusätzlicher, niederohmiger Schalter ergänzt werden.
Wer eine bessere Auflösung benötigt, sollte einen ADC mit >= 12 Bit 
verwenden. Für größere Temperaturmeßbereiche ist es ferner ratsam, 
PT_FAKTOR anzupassen. Der hier verwendete Wert von 0,00385*1000 ist für 
–20 bis 100 °C brauchbar.

Nähere Kommentare befinden sich am Anfang des Programms; die eigentliche 
Messung/Auswertung findet sich ganz unten in main(). Ich hoffe, die 
Berechnung ist verständlich und stimmt auch ;-)
Angehängte Dateien:
Gast #3947850
Lesenswert?

Für Freunde der schnellen Programmierkunst noch die sehr übersichtliche 
Programmversion für einen Arduino Uno. Fast könnte man das gesamte 
Programm in einer Zeile schreiben, die Meßroutine ist aber als eigene 
Funktion formuliert, sodaß die Auswertung mehrerer Kanäle transparent 
ergänzt werden kann.

Über den 'Serial Monitor' können die Meßwerte direkt auf dem PC 
angezeigt werden.
Angehängte Dateien:
Gast #3947858
Lesenswert?

M. N. schrieb:
> Nähere Kommentare befinden sich am Anfang des Programms;

Auch, daß die Schaltung nicht funktioniert ?

Der VRef-Ausgang des AVR ist keineswegs mit 2k belastbar, ohne daß die 
Spannung ERHEBLICH einbricht, also eine erhebliche Differenz zwischen 
der internen Referenzspannung (auch wenn das 5V sein sollten) und der 
aussen an dem 1k Widerstand anliegenden Spannung und damit Messfehler.

Wenn man das so macht, MUSS an den Ausgang ein OpAmp als 
Spannungsbuffer, dann kann man auch die interne Referenz von 2.5 oder 
1.1V verwenden, insbesondere 1.1V der moderneren AVRs hätte einen später 
genannten Vorteil.

Besser geht es, wenn man 5V an AVCC anlegt und als Ref verwendet, aber 
dann liegen 2.5V am Pt1000 und damit eine hohe Verlustleitung die zu 
DEUTLICHEN Messwertabweichungen führt weil der Sensor einige Grad wärmer 
wird als die Umgebung.

Und wenn man dann 10k als Vorwiderstand verwendet, um die Spannung am 
Pt1000 im Rahmen zu halten, ruiniert einem das wieder die Auflösung, die 
eh schon nicht besonders gut ist.

Die Schaltung taugt so also nichts, selbst wenn die Grundidee, 
ratiometrisch mit Referenzwiderstand, ein bekannt guter Ansatz ist.
Gast #3947870
Lesenswert?

MaWin schrieb:
> Der VRef-Ausgang des AVR ist keineswegs mit 2k belastbar, ohne daß die
> Spannung ERHEBLICH einbricht,

Ach, das stimmt doch garnicht.
Wie geschrieben 'bricht' die Spannung an Vref bei Belastung mit 330 Ohm 
( ca. 15 mA) um lediglich 0,2 V ein. Völlig UNERHEBLICH!

Die Schaltung ist einfach genial und absolute Spitze, eben nur nicht von 
Dir ;-)
Gast #3947893
Lesenswert?

Bei 5 V. Daher die 15 mA über 330 Ohm.

Wegen der Mawinesen und brunnenden Falken nebst Gefolge hatte ich ja 
darauf hingewiesen, daß man auch einen Portpin als Spanungsquelle nehmen 
kann. Oder man nimmt einen ext. FET, der die Vref schaltet.
Steht alles oben!
Gast #3947969
Lesenswert?

m.n. schrieb:
> Wie geschrieben 'bricht' die Spannung an Vref bei Belastung mit 330 Ohm
> ( ca. 15 mA) um lediglich 0,2 V ein. Völlig UNERHEBLICH!

Ich habe noch einmal etwas genauer gemessen:
bei 15 mA sind es rund 100 mV.

Böse, wie ich bin, und auf die Gefahr hin, eines Tages im Jenseits 
völlig ohne Jungfrau auskommen zu müssen, habe ich den Lastwiderstand 
bei 5 V auf 100 Ohm gesenkt. Die Spannung an Vref bricht um 0,6 V ein. 
Bei den verbleibenden 4,4 V an 100 Ohm ergibt sich ein Strom von 44 mA, 
woraus der Ausgangswiderstand von Vref mit rund 14 Ohm abgeleitet werden 
kann.

Es gibt folglich keinen Grund, auf die oben gezeigte Sparschaltung zu 
verzichten, zumal dort nur 2,5 mA 'Laststrom' auftreten.
Gast #3948006
Lesenswert?

m.n. schrieb:
> Ich habe noch einmal etwas genauer gemessen:
> bei 15 mA sind es rund 100 mV.

Mal ist es ein kleiner m.n. mal ein Grosser, typisch wenn man mit seinen 
dutzenden Aliasnamen durcheinander kommt unter denen man hier schreibt.

Ein Pt1000 hat bei 0 GradC 1000 Ohm, bei 1 GradC 1003.9 Ohm. Am 
Spannungsteiler 5V mit 1k bilden sich 2.5 bzw. 2.505V, der D/A-Wandler 
kann das 1 GradC auflösen (0.00488V/Bit bei 5V Vref).

Wenn die Gesamtversorgungssspannung des Spannungsteilers jedoch schon um 
0.2V oder 0.1V von der positiven internen ARef des D/A-Wandlers 
abweicht, liegt die gemessene Temperatur bei -10 GradC.

Der Fehler ist also 10 mal grösser als die Auflösung, ein Messergebnis 
ist um 10 oder 20 GradC verfälscht, je nach aktueller Laune des 
Bahnwiderstandes des AVR zum ARef Ausgang.

Habt ihr alle in Rechnen in der Schule nicht aufgepasst ?
#3948045
Lesenswert?

Ich wollte mal wissen, wie groß die Werte des A/D Wandlers dann 
tatsächlich sind. Um 1 bis 2 digit wollen wir uns mal nicht streiten.
5V und 5V-100mV
0 Grad, 1 Grad, 20 Grad

Vorausgesetzt, das driftet nicht noch all zu sehr und man schränkt sich 
so in etwa auf diesen Bereich ein (weiss ja nicht, wofür "M. N. (msx)" 
es nutzen will), kann man den A/D Wert doch um die ca. "10" korrigieren 
und gut ists. Ist halt die "preisgünstig/dirty" Lösung.
Angehängte Dateien:
Gast #3948175
Lesenswert?

MaWin schrieb:
> Habt ihr alle in Rechnen in der Schule nicht aufgepasst ?

Glücklicherweise habe ich in der Schule nicht nur Rechnen sondern auch 
Denken gelernt. Daher scheitert Deine Berechnung schon an der 
Plausibilitätsprüfung.

Herbert K. schrieb:
> Ich wollte mal wissen, wie groß die Werte des A/D Wandlers dann
> tatsächlich sind. Um 1 bis 2 digit wollen wir uns mal nicht streiten.
> 5V und 5V-100mV
> 0 Grad, 1 Grad, 20 Grad

Ich weiß nicht, was Deine Berechnung soll. Siehe: ratiometrische 
Messung.
Gast #3948195
Lesenswert?

MaWin schrieb:
> m.n. schrieb:
>> Ich weiß nicht, was Deine Berechnung soll.
>
> Irgendwie war das zu erwarten, du weisst ja auch nicht, wo das Problem
> bei deinem Bauvorschlag liegt.
>
> Selbst wenn Herbert dir deine 10 GradC Temperaturabweichung vorrechnet.

Ich schrieb doch: nicht Rechnen sondern Denken!
#3948227
Lesenswert?

10 Grad hab ich nicht geschrieben. Ich hab geschrieben, Wert "10" vom 
A/D Wandler.
Ich hab aber auch einen Fehler drin:
Bei (5V-100mV) ergeben sich Schritte von ca. 0,004785 V/Bit für den A/D 
Wandler.

Wenn ich keinen Denkfehler drin habe, ergibt sich für eine Temp. 
Änderung von 0 auf +20 GradC eine Wertänderung vom A/D Wandler von ca. 
"20".
Das wäre eine Auflösung von 1°C pro Bit. Ich denke, für so eine grobe 
Auflösung ist das ganze doch ok. Vorteil: Minimale Bauteilanzahl.

Ich denke, der Trick ist, die 1K/0,1% ins Verhältnis zum PT1000 zu 
setzen.
Der Spannungsteiler muß nur die gleiche VRef bekommen wie der A/D 
Wandler.
Wie hoch die tatsächlich ist, ist fast egal.

"rx = R_REF * wert / (ADC_MAX-wert);   // Widerstand ausrechnen"

Im Kopf vom C-SourceCode stehts ja im Prinzip drin. Muß man nur mal 
lesen und verstehen.
Gast #3948307
Lesenswert?

m.n. schrieb:
> Ich schrieb doch: nicht Rechnen sondern Denken!

Du meinst, du denkst, deine Schaltung würde funktionieren?

Herbert K. schrieb:
> Ich denke, der Trick ist, die 1K/0,1% ins Verhältnis zum PT1000 zu
> setzen.

Aref Ausgang ebenfalls messen, liegt ja unter ARef intern, und damit die 
ca. 10 korrigieren. Könnte helfen, bleibt die Eigenerwärmung bei 
625-facher Überlast als vorgesehen.
#3948339
Lesenswert?

Will man einen PT1000 ordentlich auswerten, dann kommt man um eine 
temperaturstabile Konstanstromquelle und eine Verstärkung (Anpassung) 
der Messpannung - je nach Messbereich - nicht herum.

Soll es nur "halbwegs genau" werden, ist der KTY - Fühler viel besser 
geeignet, weil er eine größere Widerstandsänderung hat.

Kennlinie berechnen und Kalibrieren muss man dann eh',
den teuren PT1000 - Fühler kann man sich dann auch sparen.
#3948355
Lesenswert?

Vergesst das mit meiner Berechnung was ich 7 Beiträge hoch geschrieben 
habe. Leider kann ich es nicht mehr editieren / löschen. Auch das mit 
dem Wert "10" korrigieren.

siehe 3 Beiträge hoch: ... der Trick ist das reine 
Widerstandsverhältnis.

@MaWin: Ob es einen Einfluß von ARef Intern/Extern direkt auf ARef vom 
A/D Wandler gibt, müsste man mal ermitteln.... vielleicht gibt es gar 
keinen, denn man kann ja auch ARef extern anschließen und diese 
"Leitung" müßte ja intern direkt auf den A/D Wandler gehen. Ein evt. 
Innenwiderstand kommt vielleicht aus der internen VRef 
Stabilisierungschaltung Schaltung und dem internen MUXer für VRef. Ist 
aber nur eine Vermutung von mir.
Gast #3948359
Lesenswert?

Herbert K. schrieb:
> Ich hab aber auch einen Fehler drin:
> Bei (5V-100mV) ergeben sich Schritte von ca. 0,004785 V/Bit für den A/D
> Wandler.

Genau, dann stimmt das Verhältnis wieder!

> Wenn ich keinen Denkfehler drin habe, ergibt sich für eine Temp.
> Änderung von 0 auf +20 GradC eine Wertänderung vom A/D Wandler von ca.
> "20".
> Das wäre eine Auflösung von 1°C pro Bit. Ich denke, für so eine grobe
> Auflösung ist das ganze doch ok. Vorteil: Minimale Bauteilanzahl.

Mehr wurde nicht versprochen, eher etwas weniger.
Andere Sensoren liefern zwar feinere Auflösungen, bekommen aber ihr 
Probleme bei sehr hohen Temperaturen und müssen in der Regel abgeglichen 
werden.

> Ich denke, der Trick ist, die 1K/0,1% ins Verhältnis zum PT1000 zu
> setzen.
> Der Spannungsteiler muß nur die gleiche VRef bekommen wie der A/D
> Wandler.
> Wie hoch die tatsächlich ist, ist fast egal.
>
> "rx = R_REF * wert / (ADC_MAX-wert);   // Widerstand ausrechnen"
>
> Im Kopf vom C-SourceCode stehts ja im Prinzip drin. Muß man nur mal
> lesen und verstehen.

Danke, daß Du es gemacht hast ;-)

Mit dem Teiler 1 k und PT1000 messe ich hier eine Raumtemperatur von 
21°C. Belaste ich Vref mit zusätzlichen 330 Ohm steigt der Strom aus 
Vref von 2,5 auf 17,5 mA. Die errechnete Temperatur sinkt auf 20°C, ohne 
daß auf die GND-Leitung auf dem Board geachtet wurde. Das Ergebnis ist 
voll im Rahmen von Auflösung und Genauigkeit.
Gast #3948415
Lesenswert?

Atmel: "Note that VREF is a high impedance source, and only a capacitive 
load should be connected in a system."

Vielleicht sollte man einfach vref per RR-Opamp puffern. Wobei dann die 
Frage bleibt: wie schalt ich den Meßstrom aus? Besonders bei mehreren 
Kanälen.
Gast #3952042
Lesenswert?

Abschließend noch ein Programm, welches einen PT1000 Widerstand im 
Bereich –100 -> +850 °C auswertet. Die Berechnung findet hier nicht mehr 
mit einem konstanten Faktor statt, sondern anhand von zwei Tabellen. 
Eine Tabelle rx_tab[] enthält die Widerstandswerte und die andere 
grad_tab[] den dazugehörigen Temperaturwert im Abstand von typ. 50 K.

Wiederum ist es eine .ino-Datei (läßt sich mit Arduino IDE oder einem 
Texteditor öffnen), bei der die lineare Interpolation hoffentlich gut 
nachvollziehbar ist.

Der eff. Meßbereich ist gerade bei hohen Temperaturen vom Aufbau und vom 
verwendeten Sensor abhängig. Ein kostengünstiger Sensor (< 2 Euro) ist 
z.B. hier zu finden: 
http://www.reichelt.de/PCA-1-1505-10/3/index.html?&ACTION=3&LA=446&ARTICLE=85054&artnr=PCA+1.1505+10&SEARCH=platin

Zur Abwechselung wird hier PortB.0 als Spannungsquelle von VREF 
geschaltet.
Wie erwähnt würde ein 12-Bit ADC eine bessere Auflösung bieten. 
Vielleicht benutzt Jemand ATXmega, die intern 12-Bit ADCs aufweisen, und 
stellt sein Programm hier zur Verfügung.
Angehängte Dateien:
#4002281
Lesenswert?

Axel R. schrieb:
> Westawegen ich hier gelesen hab (google).
> Kann man an die Vref 2x470 (von)ohm nach unten in Reihe gegen GND
> anschliessen, um am ADC0 halbe Vref "abzugreifen"?

Wenn man den PT1000 nicht an Masse- sondern an Vcc-Potential hängt 
könnte man durch herabsetzen der Vref auf VCC halte durchaus einen 
offset erzeugen. Leider bringt einem das nicht viel weil der 
Wertebereich dann nur verschoben aber noch nicht ausgedehnt (verstärkt) 
ist.
#4002330
Lesenswert?

Was bei der Messung in solchen Temperaturbereichen auch interessant ist: 
Wie verbindet man den Sensor dann am geschicktesten mit der Schaltung? 
Löten fällt weg, das schmilzt nur. Also Crimptechnik, nur welche 
Quetschverbinder nimmt man? Und welche Litzen die entsprechend bis 
200..300..500° Temperaturfest sind? (Wohl etwas mit einer Ummantelung 
aus Glasfasergewebe?)
Gast #4002370
Lesenswert?

Paul H. schrieb:
> Wie verbindet man den Sensor dann am geschicktesten mit der Schaltung?
> Löten fällt weg, das schmilzt nur.

Löten geht, wenn man den Anschlußdraht auf voller Länge beibehält. Die 
Drähte sind dünn und die übertragene Ernergie reicht nicht mehr aus, die 
Lötstellen zum schmelzen zu bringen.
Wenn es richtig gut sein soll, wird man wohl einen fertig 
konfektionierten, gekapselten Sensor verwenden müssen.

Aus Jux habe ich habe ich einen Sensor über ein brennendes Streichholz 
gehalten. > 600 °C war die Anzeige, habe das 'böse' Spiel aber gleich 
wieder beendet. Danach wurden wieder 22 °C Raumtemperatur angezeigt: 
keine Hysterese!
Anders herum habe ich ihn mit Kältespray besprüht: -53 °C war das 
Minimum; hätte nicht gedacht, daß es so kalt wird. Ein KTY81 kam nur 
leicht unter -20 °C und braucht deutlich länger zum Abkühlen. 
Offensichtlich führen die Zuleitungen zuviel Wärme über die 
Anschlußdrähte nach.
Gast #6244990
Lesenswert?

Hallo,

ich muss leider nochmal diesen alten Thread rausholen und zwar wie 
berechne ich den Faktor bei meinem Sensor (-40 bis 250 Grad) wenn ich 
einen Arbeitsbereich von 10-250 Grad(um genauer zu werden) haben möchte?
Gast #6245106
Lesenswert?

Meinst Du PT_FAKTOR im allerersten Programm? Das ist eine Konstante des 
Sensors. Alternativ kannst Du den Temperaturwert über eine Tabelle 
errechnen, wie es hier gemacht wurde.

Um eine höhere Auflösung im eingegrenzten Bereich zu bekommen, muß man 
einen OPV verwenden, der das Signal so skaliert, daß der ADC optimal 
genutzt wird. (Irgendwo hatte ich ein Beispiel dafür; müßte ich mal 
suchen).
Gast #6245347
Lesenswert?

MaWins gibt es hier ja wie Sand am Meer.

Ich kann nichts dafür, daß Dein Kindergarten heute geschlossen hat.
Wenn Du mal erwachsen bist, kannst Du vielleicht lesen und dann die 
Zusammenhänge verstehen.
Gast #6246428
Lesenswert?

m.n. schrieb:
> Wenn Du mal erwachsen bist, kannst Du vielleicht lesen und dann die
> Zusammenhänge verstehen

Ich sehe, dass du selbst nach 5 Jahren deine eigenen massiven Fehler 
nicht erkennst, also dumm bleibst weil vollkommen lernresistent und 
selbstüberheblich.

Schade um die vertane Zeit dir was beibringen zu wollen, aber damit 
wenigstens andere Leute nicht auf deinen abstrusen Humbug (von denen es 
mehr gibt, wie LEDs ohne Vorwiderstand direkt an IC Ausgänge die keine 
Konstantstromquellen sind) reinfallen:

http://dse-faq.elektronik-kompendium.de/dse-faq.htm#F.32

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren