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
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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/
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.
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.
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 | 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 | };
|
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
Hier taucht nur das Verhältnis
auf, aber niemals der Wert einer Einzelspannung.
Jester schrieb: > Misst man potentiometrisch ... Meinst du vielleicht "ratiometrisch"? https://de.wikipedia.org/wiki/Potentiometrie
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.
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.