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
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.
Schau mal hier nach, ist zwar für PIC's, aber gut erklärt. http://images.google.de/imgres?imgurl=http://www.sprut.de/electronic/pic/projekte/thermo/termo.gif&imgrefurl=http://www.sprut.de/electronic/pic/projekte/thermo/thermo.htm&h=358&w=711&tbnid=3-5Fq3OYxGIsvM:&vet=1&tbnh=90&tbnw=179&docid=3VJeDA8fbObhpM&usg=__uJeYR1X95AwxTTFxr9Ju6Kw5q5A=&sa=X&ved=0ahUKEwj25MT2iZDRAhUNeFAKHUHICfMQ9QEIJTAA
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
Welche Extremtemperaturen können denn in Deiner Messung auftreten?
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
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?
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...
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
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.
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
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
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.
@ 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
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
@asklrvyyh Wie gesagt verwende ich eine Konstantstromquelle. Auf Seite 9 unter Fig.11 reden die von Konstantspannungsquellen. Lg
:
Bearbeitet durch User
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.
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.
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.
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!
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
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
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
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.
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?!
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
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
nehmt doch einfach einen pt100 oder pt1000 und fertig is der lack ...
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".
Ich wuerde auch gleich nen LMT70 nehmen. Damit bekommst Du relativ leicht eine Genauigkei weit unter 1 Grad.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.