Forum: Mikrocontroller und Digitale Elektronik NTC auto kalibrierung - Matheformel


von Robert (Gast)


Lesenswert?

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...

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

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.

von Irgend W. (Firma: egal) (irgendwer)


Angehängte Dateien:

Lesenswert?

Frank E. schrieb:
> Man findet die passende Formel per Regressions-Software (wählbar
> linear, quadratisch, kubisch ...).

Eine Tabellenkalkulation wie Excel kann das auch:-)

von Mike R. (thesealion)


Lesenswert?

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

: Bearbeitet durch User
von Robert (Gast)


Lesenswert?

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

von HildeK (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von Jester (Gast)


Lesenswert?

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...

von Philipp C. (e61_phil) Benutzerseite


Lesenswert?

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.

: Bearbeitet durch User
von Robert (Gast)


Angehängte Dateien:

Lesenswert?

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

von Philipp C. (e61_phil) Benutzerseite


Lesenswert?

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.

von Purzel H. (hacky)


Lesenswert?

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.

: Bearbeitet durch User
von MaWin (Gast)


Lesenswert?

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.32

http://www.afug-info.de/Download/tab/NTC/

von Wolfgang (Gast)


Lesenswert?

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.

von Purzel H. (hacky)


Lesenswert?

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.

von Philipp C. (e61_phil) Benutzerseite


Lesenswert?

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.

von HildeK (Gast)


Lesenswert?

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

von Jester (Gast)


Lesenswert?

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 ...

von Wolfgang (Gast)


Lesenswert?

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".

von Philipp C. (e61_phil) Benutzerseite


Lesenswert?

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.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Die uralte Siemens Appnote zur Linearisierung von NTCs:
https://www.tdk-electronics.tdk.com/download/188296/5608e4b12153bb12af2808fbedc5a55b/pdf-applicationnotes.pdf

Damals wurde das noch nicht hochtheoretisch erklärt oder gar simuliert, 
ein Widerstand parallel zum NTC musste reichen. Krumm ist die Kurve 
immer noch.

von Philipp C. (e61_phil) Benutzerseite


Angehängte Dateien:

Lesenswert?

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.

von 5V Netzteil (Gast)


Lesenswert?

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/

von LostInMusic (Gast)


Lesenswert?

@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"!

von Philipp C. (e61_phil) Benutzerseite


Angehängte Dateien:

Lesenswert?

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.

von Harald W. (wilhelms)


Lesenswert?

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.

von LostInMusic (Gast)


Lesenswert?

>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.

von jkjkjk (Gast)


Lesenswert?

Gibt von der NIST Tabellen und Formeln.

von Harald W. (wilhelms)


Lesenswert?

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.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

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.

von Jester (Gast)


Lesenswert?

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
int NTC_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
int NTC_ADC2Temperature(unsigned int adc_value){
18
 
19
  int p1, p2;
20
  unsigned int delta;
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. */
27
28
  delta = (p1-p2) * (adc_value & 0x003f);
29
  return p1 - delta / 64;
30
};

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

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.

von Paul (Gast)


Lesenswert?

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

von Jester (Gast)


Lesenswert?

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 ...

von Harald W. (wilhelms)


Lesenswert?

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".

von Jester (Gast)


Lesenswert?

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

Hier taucht nur das Verhältnis
auf, aber niemals der Wert einer Einzelspannung.

von Nur so (Gast)


Lesenswert?

Jester schrieb:
> Misst man potentiometrisch ...

Meinst du vielleicht "ratiometrisch"?
https://de.wikipedia.org/wiki/Potentiometrie

von Jester (Gast)


Lesenswert?

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 ...

von LostInMusic (Gast)


Lesenswert?

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.

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.