Forum: Mikrocontroller und Digitale Elektronik Temperatursensor mit maximaler Genauigkeit auswerten


von Edgar T. (eddy95)


Lesenswert?

Hallo Leute,
ich stehe vor dem Problem den Sensor KTY 81-110 richtig auszuwerten.
Ich habe die Suchfunktion benutzt und mich zu Tode gegoogelt, finde aber 
nichts(zu mindest nichts was ich verstehe.)
Den KTY habe ich über eine Konstantstromquelle von 1mA am Analogen 
Eingang des Arduinos hängen, um den Spannungsabfall messen zu können. 
Habe das Programm jetzt auch soweit, dass ich den Widerstandswert des 
Sensors in einer Variable speichere. Somit könnte ich theoretisch durch 
die Kennlinie aus dem Datenblatt einen Temperaturwert ausrechnen. Jedoch 
brauche ich doch die Funktion dieser Linie. Weil sie nicht linear ist, 
kann ich die Funktion auch nicht selbst bilden, ich wüsste zumindest 
nicht wie.

Um mir helfen zu können, wollte ihr sicher wissen wie genau das sein 
muss.
Mit +/- 1°C wäre ich noch zufrieden, geht es aber genauer würde ich 
trotzdem gerne wissen wie.

Danke im Vorraus.

Ich hoffe ihr könnt mir helfen.
Lg

von Markus F. (mfro)


Lesenswert?

Edgard T. schrieb:
> Jedoch
> brauche ich doch die Funktion dieser Linie. Weil sie nicht linear ist,
> kann ich die Funktion auch nicht selbst bilden, ich wüsste zumindest
> nicht wie.
>
Am einfachsten speicherst Du die Tabelle aus dem Datenblatt in einem 
Array:
1
struct tab
2
{
3
    int res;
4
    int temp;
5
};
6
7
struct tab table[] =
8
{
9
    { 980, -55 },
10
    { 1030, -50 },
11
    ...
12
}; 
13
const int num_values = sizeof(table) / sizeof(table[0]);

Mit dem gemessenen Widerstandswert gehst Du dann in die Tabelle und 
interpolierst:
1
int temp(int res)
2
{
3
    int temp;
4
    int i = 0;
5
6
    do
7
    { 
8
        temp = table[i++].temp;
9
    } while (table[i].res < res);
10
11
    return temp;
12
}
(Fehlerbehandlung mußt Du selber machen)

> Um mir helfen zu können, wollte ihr sicher wissen wie genau das sein
> muss.
> Mit +/- 1°C wäre ich noch zufrieden,

Natürlich kannst Du zwischen den Werten auch interpolieren, aber wenn 
ich mir das Datenblatt so anschaue, kannst Du das auch bleiben lassen. 
Mit einem maximalen Fehler von mehr als 6K bei "typischen" Temperaturen 
wird das sowieso bloß eine grobe Schätzung.

Für +/- 1°C hast Du wohl das falsche Bauteil gewählt.

von Werner H. (pic16)


Lesenswert?


von asklrvyyh (Gast)


Lesenswert?

Markus F. schrieb:
> Mit einem maximalen Fehler von mehr als 6K bei "typischen" Temperaturen
> wird das sowieso bloß eine grobe Schätzung.
>
> Für +/- 1°C hast Du wohl das falsche Bauteil gewählt.

Der Fehler ist aber fuer das Bauteil systematisch, d.h. die Linie ist 
fuer das vorhandene Bauteil ein wenig nach oben oder unten verschoben.
Eine Kalibrierung bei einer bekannten Temperatur mit nachfolgender 
Beruecksichtigung in der Berechnung sollte das Ganze schon in den 
Bereich +/- 1°C bringen.

asklrvyyh

von Peter M. (r2d3)


Lesenswert?

Welche Extremtemperaturen können denn in Deiner Messung auftreten?

von Edgar T. (eddy95)


Lesenswert?

Vorerst danke für die schnellen Antworten.

Mit dem Link von Werner H. kann ich leider nichts anfangen.

Das mit dem interpolieren ist schon wesentlich interessanter für mich, 
aber wenn ich das richtig verstanden habe, zieht man beim interpolieren 
quasi einfach nur Geraden von Punkt a nach Punkt b. Somit wird das ganze 
doch wieder ungenau. Vor allem weil im Datenblatt die Werte der 
Temperaturen in 5er-Schritten angegeben ist. Somit ist es am Punkt a und 
b super genau aber dazwischen eben nicht.

Das mit der Fehlerbehebung (jedes bauteil hat abweichende Werte) bekomme 
ich schon hin wenn ich es mit Eiswasser kalibriere. Ist also mein 
kleinstes Problem.

Der Sensor wird in einem Temperaturbereich von 15°C bis 100°C betrieben, 
wobei er im Bereich von 70°C bis 80°C möglichst die höchste genauigkeit 
haben sollte. (Also keine einfachen Linien von Punkt A zu B)

Lg

von asklrvyyh (Gast)


Lesenswert?

Viel interessanter wird das hier:

http://www.sprut.de/electronic/temeratur/temp.htm#ptc

asklrvyyh

von Edgar T. (eddy95)


Lesenswert?

Bei den Links von Werner H. und asklrvyyh handelt es sich um eine andere 
Schaltung (ohne Konstantstromquelle). Ich habe mir sagen lassen genaue 
Messungen macht man mit Konstantstromquellen, also habe ich auch eine 
aufgebaut. Wenn ich aber auf die Links klicke lese ich da raus, dass ich 
zum Linearisieren des KTY eine Konstantspannung benötige. Wie soll das 
dann Funktionieren? Die Kennlinie des KTY ist doch trotzdem nicht Linear 
oder verstehe ich das alles falsch?

von c-hater (Gast)


Lesenswert?

Edgard T. schrieb:

> (Also keine einfachen Linien von Punkt A zu B)

Meine Fresse, du begreifst aber auch garnix. Es hängt doch nur von dem 
Aufwand ab, den du treibst, um die Tabelle mit den Stützpunkten zu 
ermitteln. Je mehr Werte diese Tabelle enthält, desto kürzer werden die 
interpolierten Geradenstücke.

Im Extremfall enthält die Tabelle sogar genau so viele Werte, wie dein 
AD-Wandler überhaupt nur zu liefern vermag, dann brauchst du garnicht 
mehr zu interpolieren...

von Edgar T. (eddy95)


Lesenswert?

c-hater schrieb:

> Meine Fresse, du begreifst aber auch garnix.

Aus diesem Grund bin ich hier. (:

Schau oben in meiner Antwort dort steht klar und deutlich, dass das 
Datenblatt nur Werte in 5er-Schritten liefert. Woher soll ich also noch 
mehr Werte bekommen um diese Geraden Linien zu verkürzen?
Bin ich immernoch der blöde?
Mag sein, dann erklär es mir doch einfach.

: Bearbeitet durch User
von Peter M. (r2d3)


Lesenswert?

Till,

wenn Dir eine Tabellenkalkulation zur Verfügung steht, ist das ganz 
einfach.

Tippe den relevanten Teil der Tabelle in eine Tabellenkalkulation ein.
Lasse Dir ein Widerstands- /Temperaturdiagramm anzeigen.

Jetzt musst Du raten.
Wie ist er Zusammenhang? Linear? Exponentiell? Quadratisch?

Nehmen wir an, er sei quadratisch.

Wenn y die Temperatur ist und x der Widerstand, dann gilt:

y= a*x^2+ b*x + c

a,b und c sind Konstanten, die wir erraten müssen.

In Excel gibt es dazu eine bequeme Funktion namens Solver.
Der Solver rät für uns die richtigen Werte für a, b und c.

Jetzt brauchen wir nur noch ein Gütemaß, mit dem wir dem Solver 
mitteilen können, wie gut wir seine Schätzung finden.

Nehmen wir an, die Werte stehen in den Spalten A und B.
In den Zellen G1-G3 stehen die erratenen Werte des Solvers für a,b und 
c.

Mit diesen Werten a,b und c berechnen wir die Abweichung der 
interpolierten Temperatur durch die Funktion von der gegebenen Tabelle.
Dazu berechnen wir in Spalte C die theoretische Temperatur auf Basis von 
a,b und c.

Als Streuungsmaß nimmt man gerne die quadrierte Differenz pro 
Widerstand/ Temperatur-Pärchen aus der Tabelle. Die ganzen einzelnen 
Abweichungen summieren wir dann in einer Extrazelle auf.

Dem Solver müssen wir nun nur noch mitteilen:

Minimiere den Fehler (unsere Extrazelle) und variiere dabei die Zellen 
G1,G2 und G3.

Fertig.

Also wirklich ganz einfach!

Die Kalibration des Sensors an einem Punkt kannst Du realisieren, indem 
Du z.B. einen zusätzlichen Parameter "Offset" in Dein Programm einfügst, 
den Du so wählst, dass die theoretische Temperatur (der Funktionswert) 
plus Offset genau der realen Temperatur entsprichst.

von spess53 (Gast)


Lesenswert?

Hi

>Ich habe die Suchfunktion benutzt und mich zu Tode gegoogelt, finde aber
>nichts(zu mindest nichts was ich verstehe.)

Es gibt eine AppNote von NXP:

http://www.nxp.com/documents/other/SC17_GENERAL_TEMP_1996_3.pdf

MfG Spess

von Thomas S. (thomas55)


Lesenswert?

Hier gibt´s ne SW, die macht aus Deiner Kennlinie eine Funktion.

http://www.serialcominstruments.com/math.php

Genau was Du brauchst.

Gruß aus Spandau

von A. S. (Gast)


Lesenswert?

Statt nur interpolieren kannst Du auch zusätzlich von beiden Seiten 
exrrapolieren und den Mittelwert aller 3 bilden.

Oder analog einer linearen Regression die ausgleichskurve ermitteln.

von Edgar T. (eddy95)


Lesenswert?

@ Thomas55 Ich benutze eine ähnliche Software welche sich "Geogebra" 
nennt.
die spuckt mir dann diese Funktion aus:
f(x)=0,02x^5-0,24x^4+1,94x^3-8,81x^2+23,45x+815
ich wollte mir nicht antun diese Funktion mit dem Arduino auszuwerten, 
weil ich die Funktionen(Methoden) nicht kenne um mit Wurzeln und 
Quadranten zu rechnen.
Soviel auch zum Thema "Lienar, Quadratisch oder Exponentiell" @Peter M.

@spess53 Die Datei kenne ich bereits. Hilft mir komischer weise nicht 
weiter.

Lg

: Bearbeitet durch User
von asklrvyyh (Gast)


Lesenswert?

Edgar T. schrieb:
> @spess53 Die Datei kenne ich bereits. Hilft mir komischer weise nicht
> weiter.

Naja, auf Seite 9 unter der Fig.11 ist das doch prima beschrieben.

asklrvyyh

von Edgar T. (eddy95)


Lesenswert?

@asklrvyyh Wie gesagt verwende ich eine Konstantstromquelle. Auf Seite 9 
unter  Fig.11 reden die von Konstantspannungsquellen.

Lg

: Bearbeitet durch User
von Peter M. (r2d3)


Lesenswert?

Edgard T. schrieb:
> Bei den Links von Werner H. und asklrvyyh handelt es sich um eine andere
> Schaltung (ohne Konstantstromquelle). Ich habe mir sagen lassen genaue
> Messungen macht man mit Konstantstromquellen, also habe ich auch eine
> aufgebaut.

Es gibt schaltungstechnisch verschiedene Wege zum Ziel.

> Wenn ich aber auf die Links klicke lese ich da raus, dass ich
> zum Linearisieren des KTY eine Konstantspannung benötige. Wie soll das
> dann Funktionieren?

Du misst den Widerstand indirekt über die abgelesene Spannung über dem 
KTY.
Du kennst Die Betriebsspannung Ub von 5Volt.
Diese fällt über KTY und Vorwiderstand ab.
Die Spannung über dem Vorwiderstand beträgt  genau 5V - Ukty.
Den Sprut'sche Vorwiderstand beträgt 2700 Ohm.

Der Strom in der Schaltung beträgt I = (5V - Ukty) / 2700 Ohm.
Der Widerstand des KTY beträgt dann genau Ukty / I.

Wenn Du den obigen Zusammenhang weiterverwendest, kannst Du eine 
theoretische Tabelle zwischen Temperatur und Ablesespannung am KTY 
erstellen. Diese Tabelle sieht viel linearer aus, als die 
Ausgangstabelle im Datenblatt, die den theoretischen Zusammenhang 
zwischen Temperatur und Widerstand beschreibt.

Dank der Rechenkünste eines Mikroprozessors ist es aber letzten Endes 
egal, wie der Zusammenhang zwischen Eingangs- und Ausgangsgröße ist.

> Die Kennlinie des KTY ist doch trotzdem nicht Linear
> oder verstehe ich das alles falsch?

Richtig. Die Kennlinie des KTY ist nicht linear. In der Sprut'schen 
Schaltungsversion wird der Zusammenhang zwischen Temperatur und 
abgelesener Messspannung etwas linearer, aber eben nicht komplett 
linear.

von hp-freund (Gast)


Lesenswert?

Edgar T. schrieb:
> f(x)=0,02x^5-0,24x^4+1,94x^3-8,81x^2+23,45x+815
> ich wollte mir nicht antun diese Funktion mit dem Arduino auszuwerten,

Also ist das wohl das aktuelle Problem.

von Edgar T. (eddy95)


Lesenswert?

Peter M. schrieb:
> Es gibt schaltungstechnisch verschiedene Wege zum Ziel.

Und ich bin auf der Suche nach dem Weg zum Ziel mit einer 
Konstantstromquelle, weil die Platine halt eben schon gefertigt wurde 
und ich ungern wieder umbauen möchte. Ich bitte diesbezüglich also um 
Verständnis.

Und zum Rest der Antwort: Das hat mir zwar erklärt was die dort auf 
sprut.de erklären wollten, hilft mir leider in meiner Situation auch 
nicht weiter.

Wenn das wirklich der einzige Weg ist die Kennlinie zu linearisieren und 
es keine Möglichkeit gibt eine ordentliche Funktion aus der Kennlinie zu 
bilden, dann bleibt mir wohl nichts anderes übrig als zu interpolieren 
und mich mit ungefähren Werten zufrieden zu geben.


Danke trotzdem an alle.

von Peter M. (r2d3)


Lesenswert?

Edgar T. schrieb:
> f(x)=0,02x^5-0,24x^4+1,94x^3-8,81x^2+23,45x+815
> ich wollte mir nicht antun diese Funktion mit dem Arduino auszuwerten,
> weil ich die Funktionen(Methoden) nicht kenne um mit Wurzeln und
> Quadranten zu rechnen.

Wo sind hier Wurzeln?
Die obige Funktion ist ein Polynom fünften Grades.
Du kannst statt x^5 auch x*x*x*x*x rechnen.

Wenn Dir die lineare Interpolation zwischen zwei benachbarten 
Stützstellen wie oben angedeutet zu ungenau ist, kommst Du an den von 
mir beschriebenen Verfahren zum "curve fitting" nicht vorbei.

Deine Software macht inhaltlich dasselbe wie ich, sie benutzt aber 6 
Konstanten. Damit kann die Kennwerttabelle noch treffsicherer 
beschrieben werden.

Das Lesen einer Dokumentation zu Thema Multiplikation und Potenzen auf 
dem Arduino kann man Dir aber nicht abnehmen!

von Peter M. (r2d3)


Lesenswert?

Edgar T. schrieb:
> Wenn das wirklich der einzige Weg ist die Kennlinie zu linearisieren und
> es keine Möglichkeit gibt eine ordentliche Funktion aus der Kennlinie zu
> bilden, dann bleibt mir wohl nichts anderes übrig als zu interpolieren
> und mich mit ungefähren Werten zufrieden zu geben.

Genau das nötige Verfahren habe ich Dir oben beschrieben.
Offensichtlich hast Du auch eine Extrasoftware, die genau das macht.
Du musst diese Funktion nun lediglich auch im Arduino programmieren!!!

Mehr Hilfe geht nicht.

> ich wollte mir nicht antun diese Funktion mit dem Arduino auszuwerten,
> weil ich die Funktionen(Methoden) nicht kenne um mit Wurzeln und

Mit der Haltung wirst Du nichts gebacken kriegen und kein Forum auf der 
Welt wird Dir weiterhelfen können.
Ich brauch' jetzt ob Deines "nicht antun" dringend eine Tränenvase.

Dabei sah' das anfangs doch ziemlich vielversprechend mit Dir aus:

Jemand der ein Problem beschreiben kann und sogar die deutsche 
Schriftsprache beherrscht.

: Bearbeitet durch User
von Edgar T. (eddy95)


Lesenswert?

Peter M. schrieb:
>> ich wollte mir nicht antun diese Funktion mit dem Arduino auszuwerten,
>> weil ich die Funktionen(Methoden) nicht kenne um mit Wurzeln und
>
> Mit der Haltung wirst Du nichts gebacken kriegen und kein Forum auf der
> Welt wird Dir weiterhelfen können.


Das Problem dabei ist nicht, dass ich keine Lust habe es zu machen, 
sondern gehe ich einfach nicht davon aus, dass die Funktion, die meine 
Software ausspuckt, stimmt. Komplizierter Satzbau, sorry. :D

Im Anhand ist die Kennliene zu sehen. Hält man ein lineal dran mekrt man 
schnell, dass die Funktion eine Art S-Kurve ist. Somit wäre das auch 
geklärt.
Habe ja mit dem ersten Post auch geschrieben, dass mir die Funktion der 
Kennlinie nicht bekannt ist.

Lg

von asklrvyyh (Gast)


Lesenswert?

Edgar T. schrieb:
> Und ich bin auf der Suche nach dem Weg zum Ziel mit einer
> Konstantstromquelle, weil die Platine halt eben schon gefertigt wurde
> und ich ungern wieder umbauen möchte. Ich bitte diesbezüglich also um
> Verständnis.

Anstelle einer Konstantstromquelle einen Widerstand einzubauen, duerfte 
minimaler Aufwand sein, die liegt auch zwischen Ub und Sensor.

Viel Spass noch.

asklrvyyh

von Edgar T. (eddy95)


Angehängte Dateien:

Lesenswert?

Anhang hat gefehlt. Sorry.

von Peter M. (r2d3)


Lesenswert?

Edgar T. schrieb:
> Das Problem dabei ist nicht, dass ich keine Lust habe es zu machen,
> sondern gehe ich einfach nicht davon aus, dass die Funktion, die meine
> Software ausspuckt, stimmt.

Ich befürchte, Du hast nicht verstanden, was Du da eigentlich machst.

Um Deine Funktion, die Deine Software ausspuckt zu überprüfen,
nimmst Du die Wertetabelle, mit der Du Deine Software gefüttert hast und 
rechnest für jeden Widerstand die Temperatur aus, die sich aus der 
Anwendung der Funktion ergibt.
Diese errechnete Temperatur vergleichst Du mit der Tabellentemperatur im 
Datenblatt.

Das Alles ist in weniger als fünf Minuten mit einer Tabellenkalkulation, 
wie Excel oder LibreOffice überprüft.

von Peter M. (r2d3)


Lesenswert?

Edgar T. schrieb:
> Anhang hat gefehlt. Sorry.

Deine interpolierte Funktion kann nur dort gut sein, wo Du Stützstellen 
zugeliefert hast. In dem von Dir genannten Bereich von 15 bis 100 Grad 
scheint es doch zu passen?!

von Jörg R. (solar77)


Lesenswert?

Edgar T. schrieb:
> Mit +/- 1°C wäre ich noch zufrieden, geht es aber genauer würde ich
> trotzdem gerne wissen wie.

Musst Du den KTY verwenden? Nimm doch einen 18B20. Den liest Du digital 
aus und die Genauigkeit beträgt +/- 0,5%.


Edgar T. schrieb:
> Der Sensor wird in einem Temperaturbereich von 15°C bis 100°C betrieben,
> wobei er im Bereich von 70°C bis 80°C möglichst die höchste genauigkeit
> haben sollte. (Also keine einfachen Linien von Punkt A zu B)

Diese Anforderungen erfüllt der 18B20.

: Bearbeitet durch User
von Werner H. (pic16)


Lesenswert?

Jörg R. schrieb:
> die Genauigkeit beträgt +/- 0,5%

Nö, +/- 0,5°C

von Jörg R. (solar77)


Lesenswert?

Werner H. schrieb:
> Jörg R. schrieb:
>> die Genauigkeit beträgt +/- 0,5%
>
> Nö, +/- 0,5°C

Oh, stimmt. Da habe ich nicht richtig gelesen.
Im Bereich von 70°C - 80°C liegt er zwar unter 1%. Allerdings steigt die 
Prozentzahl mit abnehmender Temperatur deutlich.

Sorry für die Empfehlung? Der 18B20 geht dann leider nicht.

: Bearbeitet durch User
von guest (Gast)


Lesenswert?

nehmt doch einfach einen pt100 oder pt1000 und fertig is der lack ...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Peter M. schrieb:
>> ich wollte mir nicht antun diese Funktion mit dem Arduino auszuwerten
> Wo sind hier Wurzeln?
> Die obige Funktion ist ein Polynom fünften Grades
Wer auf einem uC eine simple Temperatur über ein Polynom fünfter Ordnung 
mit float berechnen will, hat 2 Sachen grundlegend nicht verstanden:
1. das ist die sicherste Art, Rechenleistung zu verbrauchen und den uC 
"langsam" zu machen.
2. Der Datentyp float mit seinen lächerlichen 6 signifikanten Stellen 
hat gar nicht die Genauigkeit für eine fehlerfreie Berechnung.

>> weil ich die Funktionen(Methoden) nicht kenne um mit Wurzeln und
>> Quadranten zu rechnen.
Der diesmal Problem entgegenwirkende Prozess heißt "Lernen".

von Mark W. (kram) Benutzerseite


Lesenswert?

Ich wuerde auch gleich nen LMT70 nehmen. Damit bekommst Du relativ 
leicht eine Genauigkei weit unter 1 Grad.

von X. O. (overflow)


Lesenswert?

Am Besten du beginnst erstmal damit die Messung über lineare 
Interpolation mit Hilfe einer groben Look-Up Table umzusetzen. So wie 
von Markus beschrieben.
In einem zweiten Schritt kannst dann noch eine genau Kalibrierung in 
deinem Arbeitspunkt durchführen und  beliebig viele Stützstellen 
einfügen.

von Peter M. (r2d3)


Lesenswert?

Lothar M. schrieb:
> Peter M. schrieb:
>>> ich wollte mir nicht antun diese Funktion mit dem Arduino auszuwerten
>> Wo sind hier Wurzeln?
>> Die obige Funktion ist ein Polynom fünften Grades
> Wer auf einem uC eine simple Temperatur über ein Polynom fünfter Ordnung
> mit float berechnen will, hat 2 Sachen grundlegend nicht verstanden:
> 1. das ist die sicherste Art, Rechenleistung zu verbrauchen und den uC
> "langsam" zu machen.

Ich hatte dem Fadenstarter eine Parabelfunktion empfohlen.
Ich habe keine Ahnung, wie zeitaufwendig die Berechnung von Float-Zahlen 
auf dem Arduino ist. Ob das zu langsam ist, hängt ja von der Anwendung 
ab.

Alternativ kann Edgar auch stückweise linear zwischen den Stützstellen 
der Datenblattkurve interpolieren, oder je nach Speicherverfügbarkeit 
mit einem Kurvenfit weiter Zwischenwerte berechnen und dazwischen 
interpolieren.

> 2. Der Datentyp float mit seinen lächerlichen 6 signifikanten Stellen
> hat gar nicht die Genauigkeit für eine fehlerfreie Berechnung.
>

Kommt drauf an, wie man rechnet!
Die Kurve ist ja relativ linear.
Ein Polynom zweiten Grades wird hier vermutlich schon ausreichen.

Hier meine Koeffzienten:

2  -3,41116E-05
1  0,198596666
0  -139,707645

Damit gibt es fast die gewünschte Genauigkeit. Nur 100 Grad werden 1,007 
Grad zu niedrig angezeigt.

Stückweise linear zu rechnen ist aber die genauere Lösung, wenn noch 
Speicherplatz verfügbar ist.

: Bearbeitet durch User
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.