Go Down

Topic: kleine Probleme beim Auslesen eines PT100 -Messwandlers (Read 4200 times) previous topic - next topic

magictrips

Jun 30, 2016, 11:55 pm Last Edit: Jul 01, 2016, 07:31 am by uwefed Reason: add [CODE] TAGs </>
Hallo zusammen !

ich wollte euch um Hilfe bitten......

und zwar versuche ich grade einen Messwandler für ein PT100 von Pollin auszulsen.........

Man stellt den Messwandler mit Potis ein ....

Es gibt ein Nullabgleichswert (so 20-30mV).

Als Spannungsbereich habe ich 5000mV.

Als Temperaturbereich habe ich 0-400°C.

Ich würde die Formel aber gerne recht allgemein halten....

Es wird ein Mittelwert gebildet um das Messergebnis zu glätten...


bisher hab ich das hier, aber das is ja noch recht ungenau, da zB der Nullwertabgleich nicht berücksichtigt wird:

Code: [Select]
byte sensorPin = A1;
long  sensorValue;
unsigned int count = 100;
float voltage;
float temp_min = 0.0;
float temp_max = 400.0;
float temperature;


analogReference(DEFAULT);


sensorValue = analogRead(sensorPin);
Serial.println(sensorValue);

voltage = (sensorValue) * (5000.00 / 1024);
Serial.println(voltage);

temperature = temp_min + ((sensorValue) * (((temp_min * -1.00) + temp_max)/ 1024));

Serial.println(temperature);

Serial.println();



Hierbei ist auch ein Problem, das der Messwandler mir 19,03mV rausgibt......
beim Ardunio kommen sogar ca. 23mV an, aber messen tut er nur "2" als 2* (5000/1024) = 9,77mV.....
Da fehlen also ca. 10mV .......

Was ich auch noch nicht so ganz verstanden hab, ist diese Sache mit den 1024......

Der Arduino gibt ja ein Wert von 0-1023 raus, die Null wird ja "mitgezählt", als muss ich durch 1024 teilen, aber muss ich dann den Wert, den ich mit Analogread messe nicht mit 1 addieren, für die Null ?

Das mit dem " * -1.0" mache ich, falls die Minimaltemperatur negativ sein sollte.....


Ich habe mir jetzt außerdem folgenes überlegt:



Code: [Select]
// Heiztemperatur Messwert
const byte het_Pin = A1; // Pin für Temperatursensor
long het_count = 100; // Anzahl der Messungen um Mittelwert zu bilden
float het_voltage;
float het_zero_voltage = 19.06; // Spannung beim Nullabgleich in mV
float het_temp_min = 0.0; // unterer Temperaturbereich
float het_temp_max = 400.0; // oberer Temperaturbereich
long het_actual;


het_voltage = 0; // Wert zurücksetzen


for (int i=0; i < het_count; i++)
{
het_voltage = het_voltage + (((5000.00 / 1024) * analogRead(het_Pin)) - het_zero_voltage);  
}

het_voltage = (het_voltage / het_count);

float Temperature = het_temp_min + (het_voltage * (((het_temp_min * -1.0) + het_temp_max) / 5000.00));



// Temperatur = unterer Temperaturbereich (0°C) + (Mittelwert der anliegenden Spannung (ohne Nullabgleichsspannung) * Temperaturbereich / Spannungsbereich

klappt natürlich nicht, da der gemessene Wert ja bereits größer als der Nullabgleichswert ist.......


aber der Gedanke, den Nullabgleichswert abzuziehen ist schon richtig ?
Weil mein Messwandler hat bei 0°C (von mir festgelegte Mindesttemperatur) bzw einem PT100 Widerstand von 100Ohm ein Wert von 19,03mV am Ausgag......

Das Ganze läuft jetzt auch nur zum testen über den Ardunio Mega und kommt hinterher auf ein ATTiny mit einer externen Referenzspannung...

vielen Dank schonmal !

magictrips

#1
Jul 01, 2016, 12:12 am Last Edit: Jul 01, 2016, 12:13 am by magictrips
Kann man da vielleicht was mit Pull-Ups (intern) anfangen ?

Das ganze ist übrigends erstmal nur "provisorisch" und ich würde es gerne später durch ein genaueren Messwandler ersetzen, der vielleicht den Wert direkt per I2C rausgibt......
aber trotzdem wärs schön, wenn ich den ans laufen bekommen würde (:

Da wäre noch eine weitere Frage......

gibts eine Möglichkeit zu erkennen, ob der Sensor angeschlossen ist ? (idealerweise ohne weitere Pins zu nutzen)....


und noch eine Frage (;
Ich würde gerne Temperaturen bis ca. 250°C (wenns geht auch bis 400°C) messen....
momentan habe ich den Rauchgasfühler von Pollin, der ist eigentlcih ziemlich gut, aber leider zu dick......
der Sensor soll zwischen ein Topf und eien Herdplatte oder ein Heizpilz und ein Rundkolben und sollte deswegen so dünn, wie möglich sein.....
ich hab auch einzelte PT100 hier, die sehr flach sind.......
ich hatte überlegt, die zB in ein dünnes Glasrohr zu tun oder den so "lose" zu verwenden, nur wüßte ich nicht, wie ich die blanken "Beinchen" isolieren kann, da Schrumpfschlauch ja nur bis 150-200°C aushält.......


DrDiettrich

Bitte Code in code tags </> posten.

Welcher Spannungsbereich entspricht Deinen Vorgaben?

Der 10 Bit ADC kann seinen Spannungsbereich nur in 1024 Schritte unterteilen, bei 0-400°C wäre das bestenfalls auf 0,4° genau, wenn der volle Umfang der Referenzspannung ausgenutzt wird. Liefert der Sensor weniger als 5V Vollausschlag, und hat auch noch einen nennenswerten Offset, wird die Auflösung entsprechend geringer.

Die Genauigkeit hängt auch von der Referenzspannung ab, die bei 5V (Vcc) ja nach gesamtem Stromverbrauch schwanken kann. Es könnte hilfreich sein, stattdessen die eingebaute 1,1V Referenz zu verwenden (siehe analogReference).

Die Rechnung mit /1024 ist schon richtig, 0-1023 sind 1024 Schritte. Der ADC kann aber nur maximal 1023 liefern, so daß die volle Spannung (wäre 1024) schon knapp außerhalb des Meßbereichs liegt.


Bei PT100 Messungen würde ich ein entsprechend empfindliches und stabiles Modul verwenden, das die Temperatur digital liefert, statt mit Spannungen im Millivoltbereich in eigenen Schaltungen zu experimentieren. Kommt auf die gewünschte Genauigkeit, Kosten usw. an...

magictrips

Danke für die Antwort !

Aber so ganz verstehe ich deine Antwort nicht....

"Welcher Spannungsbereich entspricht Deinen Vorgaben?"

Das is halt die Frage......

Es gibt ein Nullabgleichswert (so 20-30mV).

Als Spannungsbereich habe ich 5000mV.

Als Temperaturbereich habe ich 0-400°C.

Also vermute ich mal, da die 20-30mV (in meinem Fall 19,03mV) 0°C entsprechen hab ich als Spannungsbereich 19,03mV - 5000mV, für 0-400°C oder ?

aber messen tut er nur "2" also 2* (5000/1024) = 9,77mV.....
Da fehlen also ca. 10mV .......


Die Genauigkeit von 0,4°C reicht in dem Fall erstmal.
Mit dem digitalen Messwandler hast du natürlich recht und das ist für die Zukunft auch angedacht...


Aber Frage ist, warum der Arduino die anliegenden 19,03mV nicht richtig messen kann.....

DrDiettrich

Die Festellung des Spannungsbereichs ist doch ziemlich einfach: Den Sensor auf 0° (Eiswasser) bzw. etwa 100° (kochendes Wasser) bringen, und die Spannungen messen. Der Wert bei 0° gibt den Offset. Dann den 100° Wert auf den Maximalwert (150° bzw. 400°) hochrechnen.

Bei 10mV können Masse-Ströme, Brumm oder Einstreuungen die Meßwerte verfälschen, und auch interne Störungen (siehe "ADC Noise Canceler" Modus).

Da sich Temperaturen meist relativ langsam ändern, kann man einen RC Tiefpaß in den Analog-Eingang legen, und mehrmals messen und mitteln. Eine abgeschirmte Zuleitung empfiehlt sich sowieso.

Dann sollten Masse-Ströme ausgeschlossen werden. Dazu die Meßleitung an den Gnd des Sensor-Moduls anklemmen, so daß (theoretisch) 0 herauskommen sollte. Falls nicht, ist die Masseleitung zum Sensor zu lang und/oder zu dünn. Notfalls kann dieser Wert laufend gemessen und als Offset vom Meßwert des Sensors abgezogen werden.


magictrips

Das mit dem Eiswasser und kochenden Wasser hab ich auch gelesen.
Ich hab den aber wie in der Anleitung kalibriert...
mit genauen Widerständen bzw Spindelpotis für die jeweilige Temperatur....

aber darum gehts doch eigentlich nicht !?

Der Messwandler gibt mir 19,03mV für 0°C raus und 4960mV (eigentlich 5000mV) für 400°C.
Das scheint ja zu stimmen bzw stehts auch so in der Anleitung....

https://www.pollin.de/shop/downloads/D810272B.PDF

Problem ist jetzt aber, das ich diese 19,03mV, die auch am Arduinoeingang ankommen, nicht mit dem Arduino messen kann....

ich habs jetzt mal mit diesem simplen Code probiert:

analogReference(EXTERNAL); -> liegen genau 5002mV an.

sensorValue = analogRead(sensorPin);
Serial.println(sensorValue);

voltage = (sensorValue) * (5000 / 1024);
Serial.println(voltage);


Der Arduino misst mir nur "1", bzw 4mV
Aber er müßte doch für 19,03mV 3 oder 4 rausgeben....

Und für 4960mV misst er nur "1016" bzw 4064mV.

mehrmals messen und mitteln tu ich doch:
"Es wird ein Mittelwert gebildet um das Messergebnis zu glätten..."

aber alles weitere spielt ja erstmal keine Rolle, der Arduino misst ja schon falsch, dadurch wird alles weitere ja auch "falsch"

DrDiettrich

Der Messwandler gibt mir 19,03mV für 0°C raus und 4960mV (eigentlich 5000mV) für 400°C.
Das scheint ja zu stimmen bzw stehts auch so in der Anleitung....
Genau das hat mir bislang gefehlt. Hast Du die Spannung für 0° wirklich nachgemessen, am Controller Chip? Mit einem Scope?
Quote
beim Ardunio kommen sogar ca. 23mV an, aber messen tut er nur "2" als 2* (5000/1024) = 9,77mV.....
Wenn Du da ganz sicher bist, nimm mal einen anderen Arduino.

Quote
Der Arduino misst mir nur "1", bzw 4mV
Aber er müßte doch für 19,03mV 3 oder 4 rausgeben....

Und für 4960mV misst er nur "1016" bzw 4064mV.
Bei solchen Abweichungen ist eine Ferndiagnose unmöglich, Du mußt schon selbst herausfinden, woher die kommen. Und ohne Scope sehe ich da auch keine Möglichkeit für eine handfeste Analyse.

magictrips

Danke, für die Antwort !

Also ein Oszilloskop hab ich leider nicht.....
nur ein recht genaues Multimeter (mit USB-Anschluss).....

ich habe das jetzt erstmal nur auf die Spannung reduziert......

Am Arduino kommen 4960mV an....

Am ARef liegen 5000mV.....

Wenn ich das jetzt richtig verstanden habe, geht der Arduino hin und teilt ARef / 1024 (0-1023)...
und vergleicht dann mit der Spannung, die an Analog In anliegt...

Ich habe mal genau ARef angelegt, da hat er auch 1023 gemessen....

Und 0V müßten doch für den Arduino 0 Ticks sein ?

Wenn ich jetzt also den Spannungsbereich 0-5000mV durch 0-1023 teile hab ich eine Spannung von ca. 4,89mV pro Tick.
Dem nach müßte er bei 4960mV am ARef 1015 Ticks rausgeben.

Tut er auch !


Und für zB 19,5mV müßte der 3-4 Ticks rausgeben, gibt aber nur 1 raus.

Naja, aber ich hab jetzt mal die Map-Funktion verwendet:
voltage = map(sensorValue, 1, 1023, 19 , 5000);

Und damit ists einigermaßen genau. Danke !

Serenifly

Quote
Wenn ich das jetzt richtig verstanden habe, geht der Arduino hin und teilt ARef / 1024 (0-1023)...
und vergleicht dann mit der Spannung, die an Analog In anliegt
Wenn man es genau nimmt macht er das:

http://www.vias.org/mikroelektronik/adc_succapprox.html
http://www.itwissen.info/definition/lexikon/successive-approximation-register-SAR-SAR-Verfahren.html

magictrips

ich hätte da noch zwei weitere Fragen, bei denen ich hoffe, das ihr mir da helfen könnt........

und zwar hab ich gelesen, das die interne Referenzspannung etwas ungenau sein soll........

das wäre natürlich nicht so toll.......

gibts eine Möglichkeit, die im Sketch zu messen und dann den Fehler rauszurechnen ?


Die nächste Frage wäre:

Ich brauche ein recht genauen ADC........

mit min. 16Bit und wenn es geht per I2C

Ich kenne mich jetzt nicht sooo genau damit aus, aber ich möchte den nutzen um später einen(bzw 5) PT100 auszulesen (in 4-Draht-Schaltung ?) mit einer Auflösung von 0,01°C (bei 0-450°C) und einer sehr hohen Genauigkeit....

Wenn ich das richtig verstanden habe, hängt die Genauigkeit auch vom PT100 ab !?

Die Schaltung, die ich damit aufbaue soll es nur möglich machen, möglichst genau zu messen....
So in die Richtung: schließt man ein sehr genauen PT100 an, is halt auch das Ergebnis genauer.... schließt man ein etwas ungenaueren an, ist das Ergebnis halt auch ungenauer......

könntet ihr mir da was empfehlen ?

DrDiettrich

Für so genaue Messungen würde ich ein handelsübliches Meßmodul vorschlagen. Beim Eigenbau kämpft man vermutlich mehr mit der Temperaturdrift, Rauschen etc. der Stromquelle, des Verstärkers und ADC, als mit den Werten des Sensors.

Der eingebaute ADC kann mit der ebenfalls eingebauten 1,1V Referenz betrieben werden, siehe analogReference(). Messen kann man die Referenzspannung nur mit externen Meßgeräten, sonst kriegt man nur raus daß AREF=AREF ist.

Für genaue Messung kommt man um einen 4-Leiter Anschluß nicht herum, und um eine stabile Stromquelle. Anschlußfertige Module sind erhältlich, mindestens mit SPI Interface, suche z.B. "PT100 Arduino".

Genaueres hängt von Deinen Ansprüchen und Geldbeutel ab, nach oben offen ;-)

SkobyMobil

#11
Jul 11, 2016, 11:12 am Last Edit: Jul 11, 2016, 12:24 pm by SkobyMobil
Hallo,
was für einen PT100 hast Du gekauft? (Klasse A oder B), einen 0815, oder einen abgeglichenen?
Hole Dir mal das Datenblatt hoch. Das Ding hat eine Widerstandskennlinie. Da kannst
Du dann mal schauen, was „Du unter genau" haben möchtest.

Bei z.B. 20°C sind das 108,18Ω und bei 21°C sind das 107,79Ω.
Das ist eine Differenz von 0,39Ω. Bei 1°C!

Jetzt weißt Du, mit was Du da überhaupt versuchst zu rechnen. Die EiswasserMethode würde
ich nicht anwenden. Da sollte der PT100 bei 0°C 100Ω haben.
Ich würde immer die Tabelle als Vergleich/Referenz nutzen.
Jetzt muss Du nur einmal schauen, was denn dieser Messwandler Dir übergibt.
Wenn Du für den keine Referenz hast, und nach "geheimen" Formeln die Werte berechnest, dann
läuft Dir das aus dem Ruder. Mein Tip, PT100 in die Tonne! Was "Leichtest" suchen.
Gruß und Spaß dabei
Andreas

Hier mal ne´Tabelle,
ich weiß aber nicht, ob die für Deinen gültig sein kann.
die zweite Maus bekommt den Speck...

uwefed

#12
Jul 11, 2016, 12:13 pm Last Edit: Jul 11, 2016, 11:06 pm by uwefed Reason: Zahlenverdreher korrigiert.
Die Rechnung mit /1024 ist schon richtig, 0-1023 sind 1024 Schritte. Der ADC kann aber nur maximal 1023 liefern, so daß die volle Spannung (wäre 1024) schon knapp außerhalb des Meßbereichs liegt.
Nein ist nicht richtig.

bei 5,000V REF
0V entspricht 0 ADC
5,000V entspricht 1203 ADC. 1023 ADC

also ist der Referenzwert durch 1023 zu teilen.

Der Fehler ist aber sehr klein sodaß er praktisch meist nichts ausmacht.

Grüße Uwe

magictrips

Danke für die Antworten !

also zu der Refernzspannung....
das mit den 1,1V verstehe ich nicht so ganz, dafür würde ich doch dann noch ein Spannungsteiler brauchen oder nicht ? also für das was auf AnalogIn anliegt ?
Meine Sensoren bzw Module geben mir 0-5V raus.....

Jetzt ist aber der AREF Pin (bei zwei ATTinys) belegt und ich hab gelesen, das analogReference(DEFAULT) der VCC entspricht aber bis zu 10% abweichen kann.....

Ich denk mal meine Spannungsquelle liefert mir so ziemlich genau 5000mV.....


zu dem PT100 hab ich noch das gefunden:
http://www.mikrocontroller.net/topic/103177

scheint ja nicht leicht zu sein, das recht genau/hochauflösend hinzubekommen....

brauche theoretisch halt 0,01°C bei 0-450°C .....

an fertigen Modulen hab ich nur das gefunden:
https://hallard.me/max31865

kostet aber auch schon 20€ pro PT100 und hat "nur" 0,03125 °C und eine Genauigkeit von 0,5°C.....

das wäre aber schonmal nahe dran....

was sagt mir denn die Genauigkeit ?

Das das Messergebnis um bis zu 0,5°C abweichen kann....

Heißt das so viel, wie das, wenn ich zB 100°C messe ich 100°C habe und bei 400°C sinds dann tatsächlich 400,5°C ?

Oder ist die Abweichung linear ? also 100°C = 100,5°C und 400°C = 400,5°C - weil dann könnte man die doch "rauskalibrieren" ?


DrDiettrich

Bitte nicht schon wieder, diese Diskussion hatten wir grade eben in einem englischen Thread :-(

bei 5,000V REF
0V entspricht 0 ADC
5,000V entspricht 1203 ADC.

also ist der Referenzwert durch 1023 zu teilen.

Lies mal das Datenblatt zu "ADC Accuracy Definitions". AREF wird in 1024 Schritte (steps) unterteilt, die von 0-1023 durchnumeriert sind. AREF ist also durch 1024 zu dividieren. Bezogen auf AREF reicht step #0 von 0 bis1/1024, und step #1023 von 1023/1024 bis 1.

Go Up