Hi,
ich versuche gerade einen NTC Wasser Temperatur sensor zu kalibrieren.
Ich verwende einen 10Kohm Spannungsteiler, und lese die Werte über
analog pin des esp32.
Ich habe einen Referenz Thermometer genommen und ADC Werte zusammen mit
Temperaturwerten erfasst.
ADC;Temp
1613;19,25
1783;24,12
2304;38,7
2873;58,94
Leider scheint die Relation nicht linear, sondern irgendwie quadratisch
zu sein, was bei NTC tatsächlich stimmt.
Wie am besten bestimmt man die quadratische Formel, sie aus ADC Wert die
Temperatur berechnet?
Ich habe keine super große Ansprüche und mir ist bekannt, dass der ADC
im esp32 nicht besonders präzise ist, aber die Relation soll schon
einigermaßen stimmen...
Für diese Problematik gibts genau zwei Strategien:
a) Die einfache Variante: LookUp-Table. Also man speichert genau diese
Liste im Mikrocontroller, Zwischenwerte werden (linear) interpoliert.
b) Man findet die passende Formel per Regressions-Software (wählbar
linear, quadratisch, kubisch ...). Ich verwende dafür die Software SPSS
von IBM. Gibts bestimmt auch als Demoversion oder etwas Entsprechendes
aus dem Freeware-Bereich.
Frank E. schrieb:> Man findet die passende Formel per Regressions-Software (wählbar> linear, quadratisch, kubisch ...).
Eine Tabellenkalkulation wie Excel kann das auch:-)
Wenn man den verwendeten NTC kennt, gibt es auch noch einen dritten
Ansatz:
- Man nutzt eine lineare Korrektur für die Messwerte des ADC (wenn die
Abweichungen den linear sind). Evtl. kann man auch ganz darauf
verzichten.
- Aus der gemessenen (korrigierten) Spannung berechnet man den
Widerstand des NTC und mittels der Gegebenen Formel (z.B.
https://de.wikipedia.org/wiki/Hei%C3%9Fleiter) berechnet man die
Temperatur
Frank E. schrieb:> a) Die einfache Variante: LookUp-Table. Also man speichert genau diese> Liste im Mikrocontroller, Zwischenwerte werden (linear) interpoliert.>> b) Man findet die passende Formel per Regressions-Software (wählbar> linear, quadratisch, kubisch ...). Ich verwende dafür die Software SPSS> von IBM. Gibts bestimmt auch als Demoversion oder etwas Entsprechendes> aus dem Freeware-Bereich.
danke!
idealerweise möchte ich die Kalibirierung automatisieren und "nur" 3-4
Punkte kalibirieren, von daher a) lineare interpolation würde schon
gehen, würde aber unnötigerweise Ungenaigkeit in der Mitte zwischen der
Punkten reinbringen.
b) ist schon ein interressantere Idee, ich schaue mal, ob ich etwas
passendes in Python finde.
Irgend W. schrieb:> Eine Tabellenkalkulation wie Excel kann das auch:-)
Super cool! Die angegeben Formel schint schon einigermaßen zu stimmen.
Hast Du die durch ausprobieren gefunden, oder wie läuft es in Excel?
Mike R. schrieb:> Wenn man den verwendeten NTC kennt, gibt es auch noch einen dritten> Ansatz:
Ja, das habe ich mir auch angeschaut. Das lässt sich aber kaum (oder
schwieriger) automatisieren und da sind aber so viele zusätzliche
Konstante: 10Kohm resitor ist bei mir 0,98Kohm, Referent Spannung des
ESP32
Robert schrieb:> Wie am besten bestimmt man die quadratische Formel, sie aus ADC Wert die> Temperatur berechnet?
Schau einfach mal da: https://www.sebulli.com/ntc/index.php?lang=de
... mit C-Code-Generator.
Wenn deine Ansprüche nicht 'super' sein müssen, ist das keine schlechte
Lösung, zumal die Zahl der Stützstellen erweiterbar ist.
Bei Temperaturmessungen ist alles deutlich unter 1° meist eh Fahrkarte;
stell mal zwei käufliche Thermometer nebeneinander und vergleiche.
Selbst in einem erwärmten Wassertopf ist ohne ständiges Rühren die
Temperaturverteilung nicht besonders homogen.
Robert schrieb:> Leider scheint die Relation nicht linear, sondern irgendwie quadratisch> zu sein, was bei NTC tatsächlich stimmt.
Wohl wahr, das verrät dir schon die Steinhart-Hart-Gleichung.
https://de.wikipedia.org/wiki/Steinhart-Hart-Gleichung> Wie am besten bestimmt man die quadratische Formel, sie aus ADC Wert die> Temperatur berechnet?
z.B. mit LibreOffice oder Excel
Robert schrieb:> Ja, das habe ich mir auch angeschaut. Das lässt sich aber kaum (oder> schwieriger) automatisieren und da sind aber so viele zusätzliche> Konstante: 10Kohm resitor ist bei mir 0,98Kohm, Referent Spannung des> ESP32
In LibreOffice Calc kannst du die Werte mit dem Solver auch aus deinen
Messdaten bestimmen - einfach das Modell eingeben und den Solver die
Parameter aus der Abweichung zu deinen Messdaten bestimmen lassen.
Robert schrieb:> idealerweise möchte ich die Kalibirierung automatisieren und "nur" 3-4> Punkte kalibirieren, von daher a) lineare interpolation würde schon> gehen, würde aber unnötigerweise Ungenaigkeit in der Mitte zwischen der> Punkten reinbringen.
Hast Du dir schon mal überlegt, welche Genauigkeit du erreichen
willst/musst - und welche sinnvol ist?
Welchen Fehler erwartest Du über Sekundäreffekte, z.B. Alterung des
NTCs, Kalibrierfehler usw?
Willst du für jeden individuellen Sensor kalibrieren - oder reicht es
einen "typischen Sensor" anzunehmen?
Hast du schon mal überschlagen, welche Ungenauigkeiten Du dir über eine
Interpolation zwischen deinen Stützstellen einhandelst - und ob dieser
Fehler tolerierbar ist?
Das alles kann man mit Hilfe einer Tabellenkalkulation (z.B. Calc) sehr
einfach in Erfahrung bringen...
Robert schrieb:> Mike R. schrieb:>> Wenn man den verwendeten NTC kennt, gibt es auch noch einen dritten>> Ansatz:>> Ja, das habe ich mir auch angeschaut. Das lässt sich aber kaum (oder> schwieriger) automatisieren und da sind aber so viele zusätzliche> Konstante: 10Kohm resitor ist bei mir 0,98Kohm, Referent Spannung des> ESP32
Genau das würde ich aber so machen. Schreibe Dir die Funktion einmal
auf. Also eine Funktion, in die Du die Temperatur reinsteckst und dann
einen ADC Wert erhältst. So weißt Du dann auch wie viele unbekannte
diese Funktion hat und wie viele Stützstellen du brauchst. Das ist nicht
zwingend die Anzahl an Variablen aus der Formel, weil da einiges
rausfallen könnte. Bei einem Spannungsteiler ist es z.B. nicht relevant
wie groß R1 und R2 sind, sondern nur das Ratio der beiden ist eine
unbekannte (wenn er nicht belastet ist usw).
Wenn Du das hast, dann kannst Du entweder fitten oder Du könntest das
Gleichungssystem sogar direkt lösen.
Viele Grüße
Philipp
PS:
Robert schrieb:> Leider scheint die Relation nicht linear, sondern irgendwie quadratisch> zu sein, was bei NTC tatsächlich stimmt.>> Wie am besten bestimmt man die quadratische Formel, sie aus ADC Wert die> Temperatur berechnet?
Eben genauso, wie ich es oben beschrieben habe. Ich halte wenig davon
Datenpunkte erst mal in irgendwas zu fitten, nur weil es so aussieht,
aber das physikalische Modell gar nicht abbildet. Sowas kann einem
schnell auf die Füße fallen, wenn man seine Modellbildung mit
dummerweise unpassenden Daten gemacht hat.
Frank E. schrieb:> Man findet die passende Formel per Regressions-Software
das war ein super Hinweis!
ich habe schnell nach python quadratische regression gesucht und bin auf
diese Seite gestoßen:
https://statologie.de/quadratische-regression-python/
dann schnell das Program angepasst:
import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt
# Legende hinzufügen
analogval = [1613, 1783, 2304, 2873]
temp = [19.25, 24.12, 38.7, 58.94]
model = np.poly1d(np.polyfit(analogval, temp, 2))
# An das Streudiagramm angepasste Polynomlinie hinzufügen
polyline = np.linspace(1, 3000, 50)
plt.scatter(analogval, temp)
plt.plot(polyline, model(polyline))
print(model)
plt.show()
und es hat ein Diagramm und Formel "5.665e-06 x + 0.005863 x - 4.707"
ausgespuckt!
Dann es gleich ins Excel zur Vergleich eingegeben
"Temp
gemessen" ADC Wert "Temp
beechnet" Diff
19,25 1613 19,48904039 0,239040385
24,12 1783 23,75626819 -0,363731815
38,7 2304 38,87352864 0,17352864
58,94 2873 58,89703979 -0,042960215
ein Unterschied von 0,23 ist für mich super akzeptabel!
Danke für Eure Hinweise
Robert schrieb:> Dann es gleich ins Excel zur Vergleich eingegeben>> "Temp> gemessen" ADC Wert "Temp> beechnet" Diff> 19,25 1613 19,48904039 0,239040385> 24,12 1783 23,75626819 -0,363731815> 38,7 2304 38,87352864 0,17352864> 58,94 2873 58,89703979 -0,042960215>> ein Unterschied von 0,23 ist für mich super akzeptabel!
Du hast mit den gleichen Daten getestet, mit denen Du gefittet hast.
Wenn das daneben liegt wäre es ja auch schlimm.
Nimm mal einen weiteren Satz Messdaten auf (idealerweise an etwas
anderen Punkten) und schaue wie gut das mit dem Fit aus dem ersten
Datensatz passt.
Ob Formel oder Stuetzstellen ist auch eine Frage der Performance. Will
man sich Exponentiation und Logarithmus in float wirklich antun ? Wie
oft ? Allenfalls geht auch ein Mittelding, wie bei Powerup aus der
Formel, den Kalibrierdaten. und dem Temperaturbereich die Stuetzstellen
rechnen und nachher mit den Stuetzstellen weiterrechnen.
Allenfalls sollte man sich auch fragen, was man denn wozu genau braucht.
Meine Regler zB rechnen mit ADC Werten und nicht mit Temperaturen, die
Umrechnung auf Temperatur erfolgt nur fuer den Benutzer, wann der das
sehen moechte, zB ein Display update alle 400ms.
HildeK schrieb:> Bei Temperaturmessungen ist alles deutlich unter 1° meist eh Fahrkarte;> stell mal zwei käufliche Thermometer nebeneinander und vergleiche.
Gerade daher muss man sie leider selber bauen wenn man genauere
Temperaturen haben will, mit Pt1000 Klasse A oder TSIC506 oder einem
kalibrierten NTC.
Robert schrieb:> Wie am besten bestimmt man die quadratische Formel, sie aus ADC Wert die> Temperatur berechnet?
Die steht im Datenblatt deines NTC zusammen mit dessen B-Wert der in
sie einfliesst. Leider muss man dann noch den 10k Spannungsteiler
einrechnen, was bei mir zu Iteration führt.
https://dse-faq.elektronik-kompendium.de/dse-faq.htm#F.32http://www.afug-info.de/Download/tab/NTC/
Philipp C. schrieb:> Sowas kann einem schnell auf die Füße fallen, wenn man seine Modellbildung> mit dummerweise unpassenden Daten gemacht hat.
Die Daten werden schon passen, wenn die Messungen sauber gemacht sind.
Der Unsinn kann passieren, wenn das Modell nicht zum Problem passt
und/oder die Lage der Stützstellen zusammen mit (unvermeidlichen)
Messfehlern zu zu flachen Parameterabhängigkeiten führt. Da kann eine
Empfindlichkeitsbetrachtung oft nicht schaden.
Polynome sind so ein Beispiel, wo bei höherer Ordnung und einer geringen
Stützstellenanzahl zwischen den Stützstellen schnell Unfug entstehen
kann.
Bei manchen Anwendungen ist weniger absolute Genauigkeit, als
Stabilitaet und Reproduzierbarkeit gefragt. Meine Standard
Temperaturregler koennen auf 0.001K stabil regeln, die absolute
Genauigkeit liegt aber bei hoechstens 2 Grad. Bei diesen Anwenungen ist
ein Wert von 23.456 Grad fuer das Toilettenpapier, nicht relevant.
Wolfgang schrieb:> Die Daten werden schon passen, wenn die Messungen sauber gemacht sind.
Hier würde ich eher sage: Die Daten werden schon passen, wenn sich das
Modell ungefähr quadratisch verhält. Nur saubere Messdaten aufnehmen
nützt ja nichts, wenn das Modell falsch ist. Mit genug Freiheitsgraden
kriege ich meine Messdaten in alles reingefittet. Und die "Gegenprobe"
passt dann natürlich auch. Spannend wird es erst bei neuen Daten.
Ich will damit aber hier nun nicht sagen, dass der quadratische Fit
nicht passt.
Was ich aber nicht verstehe ist, warum sich der TO das nicht einfach mal
plottet. Er scheint ja mit Python usw. zurechtzukommen.
MaWin schrieb:> HildeK schrieb:>> Bei Temperaturmessungen ist alles deutlich unter 1° meist eh Fahrkarte;>> stell mal zwei käufliche Thermometer nebeneinander und vergleiche.>> Gerade daher muss man sie leider selber bauen wenn man genauere> Temperaturen haben will, mit Pt1000 Klasse A oder TSIC506 oder einem> kalibrierten NTC.
Ich meinte nicht nur den Sensortyp oder die Stabilität der Schaltung,
sondern eher die Problematik, dass in manchen Medien (Luft, Wasser) die
Temperaturverteilung meist inhomogen ist und das schon Ablagen bringt.
Hier ging es aber um NTC-Fühler und mein Link zu Sebulli liefert schon
ganz brauchbare Werte für das was ein NTC kann.
Der TO sagte ja:
Robert schrieb:> Ich habe keine super große Ansprüche
HildeK schrieb:> Der TO sagte ja:> Robert schrieb:>> Ich habe keine super große Ansprüche
An anderer Stelle schreibt der TO aber:
Robert schrieb:> lineare interpolation würde schon> gehen, würde aber unnötigerweise Ungenaigkeit in der Mitte zwischen der> Punkten reinbringen.
Wenn er es wirklich genauer haben will (sein Referenzthermometer löst
immerhin 1/100 K auf), sollte er vielleicht doch die vollständige
Steinhart-Hart-Gleichung zugrunde legen (vgl.
https://de.wikipedia.org/wiki/Steinhart-Hart-Gleichung):
Ev. kann er nur die Glieder in a0, a1, a3 berücksichtigen. Wäre aber zu
untersuchen. Doch ich vermute halt, er hat nicht viel Ahnung, was er da
überhaupt tut ...
Philipp C. schrieb:> Wolfgang schrieb:>> Die Daten werden schon passen, wenn die Messungen sauber gemacht sind.>> Hier würde ich eher sage: Die Daten werden schon passen, wenn sich das> Modell ungefähr quadratisch verhält.
Du verwechselst Ursache und Wirkung. An den Daten lässt sich wenig
ändern. Das Modell muss sich dem fügen. Nicht jeder Datensatz lässt sich
durch ein quadratisches Modell beschreiben. Guck dir die
Steinhart-Hart-Gleichung noch mal genauer an.
> Nur saubere Messdaten aufnehmen nützt ja nichts, wenn das Modell falsch ist.
Genau das meinte ich mit "Der Unsinn kann passieren, wenn das Modell
nicht zum Problem passt".
Wolfgang schrieb:>> Hier würde ich eher sage: Die Daten werden schon passen, wenn sich das>> Modell ungefähr quadratisch verhält.> Du verwechselst Ursache und Wirkung. An den Daten lässt sich wenig> ändern. Das Modell muss sich dem fügen. Nicht jeder Datensatz lässt sich> durch ein quadratisches Modell beschreiben. Guck dir die> Steinhart-Hart-Gleichung noch mal genauer an.
Ich bezog mich hier auf die Prüfung mit Daten die schon für den Fit
genutzt wurden.
Wenn die Messkette sich verhält wie die Gleichung gegen die gefittet
wurde, dann ist alles gut. Ansonsten ist kann es trotzdem total daneben
liegen.
Ich denke wir beide meinen das Gleiche.
Nun hat es mich doch interessiert und ich habe eben noch mal gespielt.
Ggf. habe ich aber auch irgendwo einen Fehler gemacht.
Zunächst die Steinhart-Hart Formel:
def ntc(R, A, B, C):
return 1/(A + B * np.log(R) + C * np.log(R)**3) - 273.15
NTC Widerstand mit den drei Koeffizienten gibt uns die Temperatur in °C
Nun die Daten von Robert um die NTC Widerstände bei den Temperaturen
auszurechnen:
meas = np.array([1613, 1783, 2304, 2873]) / 4095
temp = np.array([19.25, 24.12, 38.7, 58.94])
Rntc = (1-meas) * 10e3 / meas
array([15387.47675139, 12966.90970275, 7773.4375 , 4253.39366516])
Diese Daten habe ich dann in die Steinhart-Hart Formel gefittet um A, B
und C zu bestimmen:
fit = scipy.optimize.curve_fit(ntc, Rntc, temp, p0=[1e-03, 2e-04,
1e-07])[0]
array([-9.64222259e-05, 3.94199924e-04, -3.18715953e-07])
Zusätzlich habe ich den quadratischen Fit der hier vorgeschlagen wurde
wiederholt:
model = np.poly1d(np.polyfit(meas * 4095, temp, 2))
poly1d([ 5.66482342e-06, 5.86293885e-03, -4.70748428e+00])
Die ganzen Daten kann man nun plotten. In plot1.png sieht man in grün
die Messpunkte aus dem ersten Post. Orange ist die Steinhart-Hart Formel
gefittet mit dem Spannungsteiler. Blau ist der quadratische Fit.
plot2.png zeigt dann noch den Fehler zwischen Steinhart-Hart und
quadratischem Fit.
Robert schrieb:> Wie am besten bestimmt man die quadratische Formel, sie aus ADC Wert die> Temperatur berechnet?
2 Möglichkeiten:
Steinhart-Hart selber rechnen
oder rechnen lassen: http://afug-info.de/Download/tab/NTC/
@Philipp:
Die blaue (aus Punkten bestehende) Kurve krümmt sich am linken Ende
(gerade noch so erkennbar) nach oben hin weg --> es kann sich nicht um
ein Polynom vom Grad 2 handeln, wie von Dir ausgerechnet. Ist
wahrscheinlich eins vom Grad 3 aus einer Testrechnung davor. Ansonsten
aber "sauber abgeliefert"!
LostInMusic schrieb:> Die blaue (aus Punkten bestehende) Kurve krümmt sich am linken Ende> (gerade noch so erkennbar) nach oben hin weg --> es kann sich nicht um> ein Polynom vom Grad 2 handeln, wie von Dir ausgerechnet. Ist> wahrscheinlich eins vom Grad 3 aus einer Testrechnung davor. Ansonsten> aber "sauber abgeliefert"!
Schön, dass da jemand genau drauf schaut :) Vielen Dank für die Kritik!
Die blaue Kurve ist Steinhart-Hart. Ich habe das Bild noch mal mit
Legende angehängt und auch das Jupyter Notebook.
Robert schrieb:> Leider scheint die Relation nicht linear, sondern irgendwie quadratisch> zu sein, was bei NTC tatsächlich stimmt.>> Wie am besten bestimmt man die quadratische Formel, sie aus ADC Wert die> Temperatur berechnet?
Das geht recht einfach mit Excel. Wenn man damit ein Diagramm
zeichnet, kann man sich eine Näherungsformel n-ten Grades an-
zeigen lassen.
>Die blaue Kurve ist Steinhart-Hart.
Natürlich: Vertauschte Farben. Wer soll auch auf so was einfaches kommen
%-)
>Das geht recht einfach mit Excel.
Den quadratischen Fit könnte man sogar mit überschaubarem Aufwand selbst
programmieren, weil eine Polynomregression nur auf das Aufstellen und
Lösen eines linearen Gleichungssystems hinausläuft. Damit wäre die
Kalibrierung auch auf einem ATmega-Controller durchführbar. Der Fit der
Steinhart-Hart-Kurve nähme allerdings deutlich mehr Resourcen in
Anspruch.
LostInMusic schrieb:> Den quadratischen Fit könnte man sogar mit überschaubarem Aufwand selbst> programmieren, weil eine Polynomregression nur auf das Aufstellen und> Lösen eines linearen Gleichungssystems hinausläuft. Damit wäre die> Kalibrierung auch auf einem ATmega-Controller durchführbar. Der Fit der> Steinhart-Hart-Kurve nähme allerdings deutlich mehr Resourcen in> Anspruch.
Da heutzutage Speicher billig ist, lohnt sich dieser Aufwand m.E. nicht.
Man speichert eine Tabelle und interpoliert die Zwischenwerte.
Ich hab mir sowas mal einfach gemacht und die Messwerte nach
Steinhart-Hart auf 0,5°C genau in eine Lookup-Tabelle geschmissen,
fertig. Das erfordert zwar etwas Rechenzeit zum Durchlaufen der Tabelle,
aber wenn man auf einem 8 Bit AVR Controller eine komplexe Gleichung
lösen muss, um die Temperatur ohne Tabelle zu berechnen, bedeutet das
auch einigen Aufwand. Man kann die Tabellen-Lösung auch weiter
optimieren, etwa einen festen Vergleich voranstellen, wenn Messwert
größer als x, ignoriere die erste Hälfte der Tabelle.
Ben B. schrieb:> Ich hab mir sowas mal einfach gemacht und die Messwerte nach> Steinhart-Hart auf 0,5°C genau in eine Lookup-Tabelle geschmissen,> fertig. Das erfordert zwar etwas Rechenzeit zum Durchlaufen der Tabelle
Den Code kann man eigentlich recht schnell gestalten. Teuer ist nur die
Maultiplikation zum Errechnen von 'delta'. Die Interpolation sind gerade
mal 4 Zeilen C-Code.
Die Anzahl der Stützstellen (33), die Schiebeoperationen (>>6), die
Maske (0x003f) sowie die Division (/64) hängen eng zusammen. Näheres
siehe C-Code.
1
// ADC-Counts über Temperatur
2
intNTC_table[33]={
3
...
4
};
5
6
/**
7
* Konvertiert das ADC Ergebnis in einen Temperaturwert.
8
*
9
* Mit p1 und p2 wird die Stützstelle direkt vor und nach dem
10
* ADC Wert ermittelt. Zwischen beiden Stützstellen wird linear
11
* interpoliert.
12
* Der Code ist sehr klein und schnell. Es wird lediglich eine
13
* Ganzzahl-Multiplikation verwendet. Die Division kann vom
14
* Compiler durch eine Schiebeoperation ersetzt werden.
15
*/
16
17
intNTC_ADC2Temperature(unsignedintadc_value){
18
19
intp1,p2;
20
unsignedintdelta;
21
22
/* Stützpunkt vor und nach dem ADC Wert ermitteln. */
23
p1=NTC_table[(adc_value>>6)];
24
p2=NTC_table[(adc_value>>6)+1];
25
26
/* Zwischen beiden Punkten linear interpolieren. */
C ist kein besonders guter Maßstab für die Rechenzeit-Effizienz eines
Programms. Das Programm sieht in C nach deutlich weniger aus als der
Controller in Assembler bzw. Maschinencode je nach geforderter
Genauigkeit wirklich machen muss.
Ich messe mit NTCs nicht im 0.1K Bereich, für meine Zwecke tut es dieser
Ansatz hier über den B-Wert des NTCs.
NTC: 10K@25°C, Serienwiderstand 10K 0.1%.
Zum Vergleich hier ein beliebiger NTC mit B-Wert 3380K.
https://www.tme.eu/Document/9d2eb9f3eda897a378e818dbe183c915/NTCM-10K-B3380.pdf
49°C = 4222Ohm
Da ich oft eine 4,7V Z-Diode als billige "Referenz" missbrauche, messe
ich diese immer mit einem ADC Kanal gegen und gebe Uref mit in die
Berechnung.
Ahja, der "ln" in C heißt "log", dass kann verwirren.
VG Paul
Ben B. schrieb:> C ist kein besonders guter Maßstab für die Rechenzeit-Effizienz eines> Programms. Das Programm sieht in C nach deutlich weniger aus als der> Controller in Assembler bzw. Maschinencode je nach geforderter> Genauigkeit wirklich machen muss.
Da hast du gut aufgepasst! Und wenn man das in "double" rechen lässt,
dauert es noch viel, viel länger ...
Trotzdem, in erster Näherung - und wenn man bei einer Programmiersprache
bleibt (*) - lässt sich die Laufzeit anhand der 'teuren' Operationen
abschätzen. Und das ist hier nun mal die eine Multiplikation.
Die anderen Multiplikationen sind durch (>>6) ersetzt, die Division wird
der Compiler nach Möglichkeit nach (<<6) compilieren.
Wieso ist die aufgezeigte Implementation so billig? Im Endeffekt hängt
es an der Größe des Arrays - (2^n)+1 - hier also 33.
just my 2ct
(*) Die Diskussion, um wieviel handoptimierter Assembler gegenüber 'C'
schneller ist, kann führen wer will. Ich jedenfalls tu's nicht ...
Jester schrieb:> (*) Die Diskussion, um wieviel handoptimierter Assembler gegenüber 'C'> schneller ist, kann führen wer will. Ich jedenfalls tu's nicht ...
"Assembler" ist für die heutige Jugend wahrscheinlich genauso ein
Fremdwort wie "Funken".
Paul schrieb:> Da ich oft eine 4,7V Z-Diode als billige "Referenz" missbrauche, messe> ich diese immer mit einem ADC Kanal gegen und gebe Uref mit in die> Berechnung.
Misst man potentiometrisch, d.h. man versorgt den Teiler und Aref aus
der gleichen Quelle, kürzt sich der Einfluss der "Referenz" heraus,
ersichtlich, aus deiner Formel
Nur so schrieb:> Meinst du vielleicht "ratiometrisch"?
Du hast natürlich recht, danke für die Verbesserung!
Ich sollte mit dem Kopf besser bei der Sache sein ...
Noch eine Idee: Man bildet aus den Datenpaaren (theta, R_NTC) mit theta
als Celsius-Temperatur neue Datenpaare (1/T, ln(R_NTC/Ohm)) mit T als
Kelvin-Temperatur und benutzt diese für eine lineare Regression.
Das funktioniert, weil die Gleichung
(Steinhart-Hart verkürzt auf die ersten beiden Glieder) umgeformt werden
kann in
Das lässt sich abkürzen zu
wobei die Koeffizienten alpha und beta definiert sind als alpha = 1/TN -
1/B ln(RN/Ohm) und beta = 1/B.
Wie sich offenbart hängt hier die Variable y = 1/T linear von der
Variablen x = ln(RT/Ohm) ab:
Die Kalibrierungsaufgabe lässt sich also dadurch lösen, indem die
Koeffizienten alpha und beta durch eine simple lineare Regression
bestimmt werden. Hat man das erledigt, ergibt sich aus einem
NTC-Zahlenwert r (Einheit Ohm) der zugehörige Zahlenwert der
Celsius-Temperatur zu
Diese Lösung hat zwei gute Eigenschaften: Sie ist in jeder Hinsicht
anspruchslos und sie respektiert die Steinhart-Hart-Charakteristik, was
ein quadratischer Fit auf den Daten (theta, R_NTC) nicht täte.