Forum: Mikrocontroller und Digitale Elektronik PT1000 Widerstandsermittlung über ADC


von Marco K. (Gast)


Lesenswert?

Hallo Leute,

ich habe in ein paar älteren Unterlagen folgende Formel zur Bestimmung 
des Widerstandwertes eines PT1000 am ADC eines Mikrocontrollers 
gefunden.

Die Auflösung des ADC ist z.B. 1024.

Folgende Formel wird dort genannt.
1
R(T) = R * ((ADCwert/1024) + 0,5) / (0,5 - (ADCwert/1024))

Zur Verdeutlichung noch die folgende Schaltskizze.

Eigentlich ist es eine Messbrücke mit 3x 1000 Ohm Widerständen und dem 
PT1000, die Spannung welche am ADC anliegt ist die Ausgangsspannung 
eines Subtrahierverstärkers, entspricht also quasi der Diagonalspannung.

Ich habe die Skizze also stark vereinfacht.
1
----------Uref
2
 |
3
 |
4
 |
5
 -
6
| | 1000 Ohm = R
7
| |
8
 -
9
 |
10
 | ---- ADC Eingang
11
 |
12
 -
13
| |  PT1000 => R(T)
14
| |
15
 -
16
 |
17
 |
18
 |
19
------- GND
Meine Frage ist nun wie man auf diese Formel kommt, stehe leider auf dem 
Schlauch und komme nicht weiter.

Marco

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Marco K. schrieb:

> Meine Frage ist nun wie man auf diese Formel kommt, stehe leider auf dem
> Schlauch und komme nicht weiter.
>

Die beiden Widerstände bilden einen Spannungsteiler.
Kennt man die Eingangsspannung des Spannungsteilers (bei dir URef) und 
die Werte der beiden Widerstände, dann kann man die Spannung am Ausgang 
des Spannungsteilers (bei dir ist das die Spannung, die dann zum ADC 
geht) berechnen.

Bei dir ist die Situation umgekehrt.
Du kennst von einem Widerstand nicht den Wert.
Du kannst aber die Ausgangsspannung des Spannungsteilers messen. Daraus 
lässt sich dann über die entsprechend umgestellte Spannungsteilerformel 
der fehlende Wert des Widerstandes errechnen.

Der Rest ist dann  nur noch: die Umrechnung vom ADC Wert in eine 
Spannung ebenfalls formelmässig ausdrücken, alles in eine gemeinsame 
Formel zusammenfassen, vereinfachen, Brüche kürzen, etc. bis du 
irgendwann bei der angegegebenen Formel (hoffentlich) landest.

: Bearbeitet durch User
von Frager (Gast)


Lesenswert?

Marco K. schrieb:
> Folgende Formel wird dort genannt.
>
> R(T) = R * ((ADCwert/1024) + 0,5) / (0,5 - (ADCwert/1024))

Kann ich nicht glauben. Wenn der ADCwert = 512 ist, kommt eine Teilung 
durch Null heraus, wenn er größer als 512 ist, gibt es negative 
Widerstandswerte.
Beides kann nicht sein.

von Marco K. (Gast)


Angehängte Dateien:

Lesenswert?

Frager schrieb:
> Kann ich nicht glauben. Wenn der ADCwert = 512 ist, kommt eine Teilung
> durch Null heraus, wenn er größer als 512 ist, gibt es negative
> Widerstandswerte.
> Beides kann nicht sein.

Ihr habt natürlich recht das war mein Fehler, die Vereinfachung die ich 
vorgenommen habe ist nicht gültig.

Anbei nun die unvereinfachte Schaltung.

R4 ist der PT1000.
Die 2,5V mit welcher die Brücke gespeist wird sind auch die 
Referenzspannung für den ADC.
In der Formel ist auch die Verstärkung des Subtrahierverstärkers noch 
mit drin. Die beträgt in meiner Zeichnung G=10.

R(T) = R * ((ADCwert/(1024*G)) + 0,5) / (0,5 - (ADCwert/(1024*G)))

Über die normale Spannungsteiler Gleichungen bin ich nicht auf diese 
Gleichung gekommen.
Woher kommen die 0,5?

Danke

von Pandur S. (jetztnicht)


Lesenswert?

Die obere Schaltung ist besser. Nur ein einzelner Widerstand zum PT1000 
als Spannungsteiler. Gespiesen von der ADC Referenz.
Die Gleichungen sind wirklich trivial. Von der Spannung her rechnet man 
auf den Widerstand zurueck.

ADC : = R/(R+R(T)) fuer R(T) unten und R oben.

ADC ist das Verhaeltnis 0..1, unterteilt in 2^16 oder so.

Umdrehen auf R(T) := R/ADC - R

Und vom Widerstand auf die Temperatur mit der inversen formel des 
PT1000.

von Mario EDUARDO (Gast)


Lesenswert?

Ist eh klar, daß 2.5V dividiert durch 2kOhm = 1.25 mA sind!
Und das bei einem PT1000 mit empfohlenen wenigen 100yA!
Ist die Referenzspannung der Brücke eh getaktet?
Um welche Genauigkeit geht es da? Und welchen Temperaturbereich?
1 Grad oder schlechter ??

Mario

von Marco K. (Gast)


Lesenswert?

Gespeist wird das ganze über eine Kombination aus Spannungsreferenz 4040 
und einem Impedanzwandler. Die Referenzspannung ist nicht getaktet, 
allerdings werden dauernd mehrere PT1000 über Analogschalter zu- bzw. 
abgeschaltet(mehrere Kanäle an einem ADC Eigangspin)
Die Eigenerwärmung wirkt sich also nicht so stark aus. Genauigkeit 
sollte etwa +-0,5 Grad oder besser erreichen. Temperaturbereich etwa 5 
bis 140°C.

Für mich ist diese Gleichung leider nicht trivial.

Gruß

von Mario EDUARDO (Gast)


Lesenswert?

Hast du bei mehreren Kanälen schon mal einen AD7714 oder 7794  überlegt?
Die können mit einem simplen Spannungsteiler und einem ad780 locker 5 
Kanäle, und diese Genauigkeit mit links. Externer Aufwand eine 780 o.ä. 
und ein Widerstand pro Kanal.

lg Mario

von Marco K. (Gast)


Lesenswert?

Mario EDUARDO schrieb:
> Hast du bei mehreren Kanälen schon mal einen AD7714 oder 7794
> überlegt?
> Die können mit einem simplen Spannungsteiler und einem ad780 locker 5
> Kanäle, und diese Genauigkeit mit links. Externer Aufwand eine 780 o.ä.
> und ein Widerstand pro Kanal.

Danke, den werde ich mir mal ansehen.

Wäre trotzdem nett wenn jemand etwas zur Gleichung für die oben stehende 
Schaltung sagen könnte.

Danke

von Oldie (Gast)


Lesenswert?

Grundsätzlich ist es Quatsch, für so eine R-Vergleichsmessung
eine externe Referenz zu bemühen! In einer (richtigen) Berechnung
kürzt sich die Referenzspannung heraus!

Viel wichtiger ist es, einen temperaturstabilen
Vergleichswiderstand zu wählen!

von Marco K. (Gast)


Lesenswert?

Die drei Brückenwiderstände sollen übrigens 0,1 prozentige sein.
Die Referenzspannung kommt in der Formel nicht vor.

Oldie schrieb:
> In einer (richtigen) Berechnung
> kürzt sich die Referenzspannung heraus!

Ich wäre Dir dankbar wenn Du mir diese richtige Berechnung zeigen 
könntest.

Danke

von Mario EDUARDO (Gast)


Lesenswert?

Ich nehme an, du willst die Brückenspannung wissen:

Die Spannungen verhalten sich wie die Widerstände:

Linke Seite:
Uref / U2 = (R1+R2)/R2  umforman nach U2
U2 = (Uref*R2)/(R1+R2)

Rechte Seite:
Uref / U4 = (R3+R4)/R4  umforman nach U4
U4 = (Uref*R4)/(R3+R4)

Die Differenz bilden:
U2-U4 = (Uref*R2)/(R1+R2) - (Uref*R4)/(R3+R4)

Werte einsetzen:
R2=RTD, R1=R3=R4=1kOhm

U2-U4 = (Uref*RTD)/(1000+RTD) - (Uref*1000)/(1000+1000)
U2-U4 = (Uref*RTD)/(1000+RTD) - (Uref/2)

Hoffe, ich hab mich nicht vertan ...
lg, Mario

von Marco K. (Gast)


Lesenswert?

Die allgemeine Gleichung zum Spannungsteiler inkl. Herleitung welche wie 
von Mario schon genannnt zu Ud = U0 * ( (R2*R3 - R1*R4) / ((R1+R2) * 
(R3*R4)) ) führt ist mir bekannt.

R(T) = R4 ist der PT1000.

Nach R4 aufgelöst erhalte ich.

R4 = -( (R3*(Ud*(R1+R2) - U0*R2)) / (Ud*(R1+R2)+U0*R1) )

Oder wenn R1 = R2 = R3 = 1000 = R

R(T) = R4 = ( R*(U0-2*Ud) / (2*Ud+U0) )

Ud wäre dabei negativ da die Zeichnung oben ungünstig war.

Wie komme ich aber dann auf diese Gleichung??

R(T) = R * ((ADCwert/(1024)) + 0,5) / (0,5 - (ADCwert/(1024)))

Danke

von Achim S. (Gast)


Lesenswert?

die Rechnung von Mario passt schon mal. Diese Differenzspannung wird 
ungefähr um den Faktor G verstärkt:

U_ADC = G U_Ref (RTD/(R0+RTD)-1/2)

Wenn der ADC die selbe Referenzspannung verwendet wie die Brücke, dann 
gilt

U_ADC = ADCWert/1024*U_Ref

beide gleichsetzen, dabei kürzt sich U_Ref

ADCWert/1024 = G (RTD/(R0+RTD)-1/2)

Durch G dividieren und das 1/2 mit + auf die andere Seite

ADCWert/(1024 G) + 1/2 = RTD/(R0+RTD)

die linke Seite kürze ich ab jetzt mit (...) ab.

(...) (R0+RTD) = RTD

Ausmultiplizieren:

(...) R0 + (...)RTD = RTD

(...) R0 = RTD (1- (...))

aus 1-(...) wird (1/2-ADCWert/(1024 G))

das musst du noch durchdividieren, dann bist du bei deiner Formel.

von Oldie (Gast)


Lesenswert?

Macht es doch nicht so kompliziert!

Nimm einfach die Versorgungsspannung U+ des µC als
Ref-Spannung für den internen ADC und als Speisespannung
für einen Spannungsteiler aus festem Vorwiderstand Rv und
dem Pt1000.

Durch diesen Spannungsteiler fließt ein Strom
I = U+ / (Rv + Rt)

An diesen Widerständen fällt jeweils eine Spannung ab:

Am Vorwiderstand:   Uv = Rv * I
Am Pt1000:    Ut = Rt * I

Beide Gleichungen nach I aufgelöst:

I = Uv / Rv
I = Ut / Rt

also: Uv / Rv = Ut / Rt

nach Rt aufgelöst:

Rt = Rv * Ut / Uv

ADC_max  = U+           der Max-Wert des ADC = z.B. 1024
ADC_mess = Ut           der vom ADC an Rt gemessene Wert
ADC_max-ADC_mess = Uv   der sich für Rv ergebende ADC-Wert


Also: Rt = Rv * ADC_mess / (ADC_max - ADC_mess)
      =========================================

von торфкопф (Gast)


Lesenswert?

Mit einem 10 Bit ADC muss man uebrigens gar nicht erst beginnen.

von Marco K. (Gast)


Lesenswert?

Danke Achim S für die Herleitung. Jetzt ist mir klar wie die Gleichung 
zustande kommt.

Mario hatte weiter oben angemerkt dass diese Schaltung nicht zu 
gebrauchen wäre falls die Versorgungsspannung der Brücke nicht getaktet 
wäre, da der Strom in der Brücke um über den Faktor 10 zu hoch wäre.

Welche PT1000 Schaltung wäre dann empfehlenswert wenn ich nur einen 
einzigen PT1000 am ADC hätte?

Einfach nur den PT1000 und einen ausreichend großen Vorwiderstand?
Wenn ich Versorgungsspannung des Mikrocontroller als Uref nutzen würde, 
also die 3,3V dann bräuchte ich um die 100µA zu erreichen ja einen 
Vorwiderstand von etwa 32k Ohm?

Gruß

von Harald W. (wilhelms)


Lesenswert?

Marco K. schrieb:

> Welche PT1000 Schaltung wäre dann empfehlenswert wenn ich nur einen
> einzigen PT1000 am ADC hätte?

Schaltungen für PT-Sensoren sind immer aufwändiger, da diese
nur eine Wertänderung von 0,4% je Grad haben. Andere Sensoren
sind da deutlich steiler. Wenn Du sowieso einen µC hast, wäre
ein Sensor mit Digitalausgang sicherlich einfacher.

von Achim S. (Gast)


Lesenswert?

Marco K. schrieb:
> Einfach nur den PT1000 und einen ausreichend großen Vorwiderstand?

Dann kommt es tatsächlich auf den ADC und die gewünschte 
Temperaturauflösung an. Rechne dir aus, welche Temperaturänderung du 
brauchst, damit der ADC um einen Wert weitergeht.

Bei Oldies Vorschlag (1k Vorwiderstand, hoher Strom) und einem 10bit ADC 
wären es ziemlich genau 1°, bei deiner Brückenschaltung mit 
Nachverstärkung wären es 0,1°.

Bei einem einfachen Spannungsteiler mit 32k wären es über 270° - da 
kommst du um eine Nachverstärkung und/oder einen höher auflösenden ADC 
nicht rum.

Harald W. schrieb:
> Andere Sensoren
> sind da deutlich steiler.

das stimmt. Wenn du nur in einem kleinen Temperaturbereich messen 
willst, dann nimm dir einen integrierten Sensor wie z.B. LM35 - sehr 
viel einfacher auszuwerten als Pt1000.

von Marco K. (Gast)


Lesenswert?

Leider ist der PT1000 schon in dem Teil welches ich vermessen möchte 
drin, also da kann ich nichts machen.
Als Mikrcontroller wollte ich einen STM32 verwenden, da habe ich 12Bit 
ADCs also 4096 Abstufungen.
Eine Temperatur Auflösung zwischen 0,1 und 0,5° wäre nicht schlecht.

von Mario EDUARDO (Gast)


Lesenswert?

Ich hoffe, ich kann in Kürze und Präzision erklären, warum ich nichts 
von diesen (durchaus mathematisch richtigen) Überlegungen mit "ich hab 
eh 1024 oder 2048 Werte" halte:

Diese 10 bzw 12 Bit Wandler bzw diese Überlegung setzt voraus, daß 0 
Grad Temperatur genau 0 Volt bzw dem Registerwert 0x00 entsprechen und 
die maximal zu messende Temperatur dem maximalen Registerwert 
entsprechen.
Dies bekommst du NUR dadurch hin, daß du mit einer externen Beschaltung 
die Meßwerte so hintrimmst. Jede externe Beschaltung kostet prinzipiell 
Qualität bzw Genauigkeit.

Du nimmst also einen Genauigkeitsverlust hin, um mit 12 Bit 
durchzukommen !!

Bei einem 7714 hast du 5 pseudoratiometrische Kanäle.
Einen 780 o.ä. brauchst du sowieso, da das Meßergebnis von der Qualität 
der Refernzspannung abhängt (Genauigkeit und Rauschen).

Ich habe - ganz simpel - pro Kanal einmal 10kOhm nach oben gegen 2.5 
Volt genommen, und den PT1000 nach unten. Das ist einfach. Hat aber 
sicher den Nachteil, daß das bzgl 0.1 Grad Genauigkeit hart an der 
Grenze ist, und die Steilheit mager ist. Ich messe bei Kaffeemschinen 
auch im Bereich 0-130 Grad, wirklich wichtig ist bei mir der Bereich 
85-110 Grad, und da kann man ja die Werte mit einem genauen Meßgerät ja 
nachmessen.

Wenn du die Sache lege Artis machen willst, worst du um einen 7793 bzw 
7794 mit einer ratimetrischen Messung nicht rum kommen.

Die 10 bzw 12 Bit taugen, um die Temperatur auf einem Kühlkörper zu 
messen und dann den Lüfter einzuschalten ... ;-)

Mario

von m.n. (Gast)


Lesenswert?

Die Formel hatte Dir ja schon Oldie geliefert. Hier findest Du sie noch 
einmal für einen Kanal. 
Beitrag "Re: PT1000, einfache Auswertung mit AVR (ATmega328)"

Wenn Du mehr Kanäle brauchst, ginge es so: 
Beitrag "Temperatursensor KTY81 am ATmega328 (Arduino UNO), 1-6 Kanäle"
Vielleicht kannst Du die getaktete Messung ja mit Deinem STM32 umsetzen. 
Mit einem 12 Bit ADC sollten die 0,5 °C Auflösung erreicht werden.

Abschließend noch ein Programm mit Tabellen für PT1000 und KTY81: 
http://www.mino-elektronik.de/7-Segment-Variationen/LCD.htm#lcd7

von Oldie (Gast)


Angehängte Dateien:

Lesenswert?

Um mich in die Pt1000-Auswertung mit einem µC und eingebautem,
oder externem ADC einzuarbeiten habe ich mir mal eine Tabelle
(Excel/open Office Calc) aufgebaut.

Sie geht natürlich von einer ratiometrischen Messung
aus, um mich nicht mit Offset-Drift und anderen Fehlerquellen
von Referenzspannungen und Operationsverstärkern rumzuärgern.

Für die Genauigkeit und Stabilität der Messergebnisse ist dann
nur noch der Pt1000, der Vergleichswiderstand Rv, der ADC und die
saubere Berechnung der Temperatur aus den Pt1000-Parametern (das
geht auch mit angemessener Ganzzahlrechnung!) verantwortlich.

Die Ergebnisse für verschiedene Vorwiderstände Rv und ADC-
Auflösungen sind in der Grafik zu sehen.

Fazit:
Für Rv = 1000 Ohm, dem Rth des Pt1000 bei 0 °C
bekomme ich eine gute Auflösung für Temperaturen unter 0 °C,
die sich bei höheren Temperaturen schnell verschechtert.

Für Rv = 3900 Ohm, dem Rth des Pt1000 bei 850 °C
bekomme ich eine bessere Auflösung für Temperaturen oberhalb
von 100 °C, während sie bei tieferen Temperaturen nicht mehr
ganz so gut ist.

Für einen Rv > 3900 Ohm (hier: 10 kOhm), wird die Auflösung in
allen Temperaturbereichen nur noch schlechter.

Obere 3 Bilder:
Mit einem 10-Bit-ADC lässt sich mit Rv = 1000 Ohm nur unterhalb
von 0 °C die Temperatur auf +/-1 °C auflösen.

Die 3 Bilder darunter:
Sie zeigen, dass ein 12-Bit-ADC mit Rv = 3900 Ohm schon
Temperaturen bis 150 °C auf +/-0,5 °C auflösen kann.
(mit Rv = 1000 Ohm bis 200 °C) Darüber wird es bald ungenau.

Die unteren 3 Bilder:
Für die Auflösung von +/-0,1 °C ist schon ein 15-, oder
16-Bit-ADC erforderlich.

von m.n. (Gast)


Lesenswert?

Marco K. schrieb:
> Genauigkeit
> sollte etwa +-0,5 Grad oder besser erreichen. Temperaturbereich etwa 5
> bis 140°C.

Marco K. schrieb:
> Als Mikrcontroller wollte ich einen STM32 verwenden, da habe ich 12Bit
> ADCs also 4096 Abstufungen.
> Eine Temperatur Auflösung zwischen 0,1 und 0,5° wäre nicht schlecht.

Bitte unterscheide zwischen Auflösung und Genauigkeit. Aber wie Du 
selber zeigst, sind 0,5 °C mit einem 12 Bit ADC im gewünschten Bereich 
zu erreichen.

Oldie schrieb:
> saubere Berechnung der Temperatur aus den Pt1000-Parametern (das
> geht auch mit angemessener Ganzzahlrechnung!) verantwortlich.

Bei einem STM32 nimm einfach float oder auch double; die Mikrosekunde 
sollte doch als 'Phasenverschiebung' zwischen zwei Messungen nicht 
stören ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.