Ich versuche also, genaue Temperaturwerte von diesem TDK B57164K472J-Thermistor zu erhalten ...
Es ist in Reihe mit einem 1 K-Widerstand geschaltet und mit dem integrierten ADC eines ESP8266 verbunden.
Der Thermistor hat ein Beta von 3950 und das Datenblatt enthält eine Tabelle für Widerstände zwischen -55 und 150 ° C.
Bei meinem Versuch, die Genauigkeit zu erhöhen, berechne ich das Beta selbst für das Intervall, in dem sich der Widerstand des Thermistors befindet, unter Verwendung der folgenden Gleichung:
B = 1 / ( 1 / T1 - 1 / T2 ) log ( R1 / RR2 )
Dann versuche ich die Temperatur mit folgender Gleichung zu bestimmen:
T = T1 * B / log ( R1 / R2 ) / ( B / log ( R1 / R2 ) - T1 )
Der vollständige Code kann hier eingesehen werden: https://pastebin.com/ECQHruKN
Faktoren, die möglicherweise die Genauigkeit beeinflussen: Die Intervallspannungsreferenz des ESP zeigt 3,56 V an, sie soll 3,3 V betragen , und mein Multimeter zeigt 3,26 an.
Bei der Beschilderung bin ich mir nicht sicher, ob meine Begriffe positiv oder negativ sein sollen oder wann sie die anderen sein sollen.
Ich bin mir nicht sicher über meine Schaltung ... es ist einfach für mich zu lernen, aber ich habe komplexere Thermistorschaltungen gesehen, ich war mir nicht nur sicher, wie ich sie implementieren sollte, und noch weniger sicher, dass ich in der Lage sein würde um sie zu beheben.
Hilfe wäre sehr dankbar. Vielen Dank.
Schema
simulieren Sie diese Schaltung - Schema erstellt mit CircuitLab
quelle
Antworten:
Der ESP8266 ADC ist für Instrumentierungszwecke nicht wirklich gut. Ich glaube, es ist nicht sehr linear (insbesondere für Spannungen in der Nähe von 0 V) und die interne Referenzspannung kann +/- 10% oder eine schlechtere Toleranz sein - lose spezifiziert (ohne Genauigkeitsgrenzen, die ich sehen kann, eine Art "Bonus" -Funktionalität, die Sie haben sollte für ernsthafte Anwendungen nicht zu stark abhängen).
Sie haben auch einen ziemlich miesen NTC und führen aufgrund des geringen 1K-Widerstands (dh Selbsterhitzung) bei hohen Temperaturen viel Strom durch.
Die bevorzugte Methode für die Thermistormessung ist ratiometrisch, sodass die Referenzspannung aufgehoben wird. Der Espressif-Chip bringt jedoch nicht die Referenzspannung heraus. Außerdem enthalten viele Karten (ich schließe daraus, dass Ihre eine ist) einen Teiler am Eingang, der mindestens Ihren Eingang lädt etwas, vielleicht 220K / 100K für eine nominelle ~ 3,52V für 1024 zählt +/- was auch immer. 10 Bit sind für einen so großen Widerstandsbereich nicht zu viel.
Es gibt andere Möglichkeiten, einen Thermistorwiderstand zu messen, aber sie erfordern im Allgemeinen mehr Schaltungen, beispielsweise um den Widerstand in eine Frequenz umzuwandeln und zwischen einem Referenzwiderstand oder Widerständen und dem Thermistor umzuschalten.
Angesichts des riesigen Speichers im ESP8266 können Sie alle ausgefallenen Berechnungen vergessen und einfach eine einfache Nachschlagetabelle mit 1024 Einträgen erstellen, aber Sie müssten wahrscheinlich ein Kalibrierungs-Rig erstellen, um dies zu tun (zumindest eine programmierbare Spannung), um die zu löschen Fehler und der Chip ist nicht wirklich für eine bestimmte Genauigkeit oder Stabilität spezifiziert, daher würden die meisten von uns einen externen ADC oder eine andere Schaltung verwenden, damit die Genauigkeit und Stabilität zu Beginn eingebrannt wird.
quelle
Wenn Sie keine Temperaturreferenz von mehr als 1 ° C haben, würde ich nicht versuchen, eine höhere absolute Genauigkeit zu erzielen, als Sie sie mit Informationen zum Nenndatenblatt erhalten. Wenn Sie eine echte hochgenaue Temperaturreferenz benötigen, verwenden Sie ein Wärmepaar oder einen Platin-Temperatursensor (RTD).
Wenn Sie dies trotzdem versuchen möchten:
Erwägen Sie auch den Kauf eines besser spezifizierten NTC, um sich Zeit zu sparen. Sie können 2% Beta, 2% Resistance oder besser für nicht viel mehr als Ihre finden.
quelle
Wie genau sollen Ihre Messwerte sein? 0,1 Grad? 0,01 Grad?
Sie haben ein paar Probleme. Erstens ist Ihr ADC zunächst nicht sehr genau. Sie sollten auch versuchen, das Rauschen zu reduzieren, dem Ihr ADC derzeit ausgesetzt ist. MCUs erzeugen Rauschen. Wenn Sie nichts dagegen unternommen haben, ist Ihr ADC wahrscheinlich genug Rauschen ausgesetzt, um inkonsistente Ergebnisse zu erzielen.
Dann ist da noch der Thermistor, sie sind anfangs keine wirklich sehr genauen Geräte. Sie leiden zunächst unter Selbsterwärmung und dann ist da, wie stabil Ihre Eingabe ist.
Sie benötigen außerdem genaue Kalibrierungsdaten für Ihren Thermistor, da in einigen Fällen ein Unterschied von 5% zu den Datenblattwerten bestehen kann. Es ist jedoch nicht einfach, einen Messwert bei 25 Grad zu erhalten. Wie halten Sie den Sensor bei 25 Grad, während Sie ihn messen? Das Ablesen bei 100 Grad ist viel einfacher, kochendes Wasser muss bei 100 Grad sein (auf Meereshöhe werden die heißeren Teile zu Dampf). Sie können es also einfach in kochendes Wasser stecken.
Sobald Sie alle Ihre Schaltungsprobleme behoben haben, können Sie über Ihre Programmierung nachdenken. Thermistoren haben eine logarithmische Beziehung zur Temperatur zum Widerstand. Im Allgemeinen haben sie in einigen Temperaturbereichen eine bessere Genauigkeit. Der übliche Ansatz besteht darin, den spezifischen Temperaturbereich auszuwählen, an dem Sie interessiert sind (kleinerer Bereich bedeutet größere Genauigkeit), und dann Ihre Protokollfunktionen über diesen Bereich zu verwenden. Entweder erstellen Sie eine Nachschlagetabelle, oder wenn Sie einen ausreichend schnellen Chip haben, der nicht besonders beschäftigt ist, können Sie die eigentliche Berechnung im laufenden Betrieb durchführen.
Aber dann kommt dies auf die Genauigkeit Ihres ADC zurück. Wenn nur 1024 diskrete Werte erzeugt werden können, können Sie nur 1024 diskrete Temperaturen messen.
Wenn Sie sich nur darum kümmern, dass die Temperatur definitiv zwischen 35,0 und 35,5 liegt und Sie nur an Temperaturen zwischen -20 und 50 interessiert sind, dann wäre dies mit dem, was Sie haben, durchaus erreichbar. Wenn Sie jedoch eine größere Reichweite oder eine höhere Präzision wünschen, ist dies mit dem, was Sie verwenden, nicht wirklich möglich.
Um mehr Präzision zu erzielen, hätten Sie einen kleineren Bereich verwendet, und umgekehrt müssen Sie für einen größeren Bereich die Präzision reduzieren. Dann kann Ihr ADC irgendwann nicht mehr den Unterschied zwischen zwei Werten erkennen, da sonst das Rauschen es unmöglich macht, einen stabilen Messwert zu erhalten.
Ich empfehle dringend, diese Tabelle zu verwenden . Sie können mit den Werten spielen und sehen, wie hoch die Fehlergrenzen sein werden, und die empfohlenen Widerstandswerte für die Messung in einem bestimmten Temperaturbereich angeben.
quelle
boiling water has to be at 100 degrees
Nur auf Meereshöhe. Ich habe bei mir zu Hause bei 97CZusätzlich zu den anderen Kommentaren / Antworten, die Sie bisher erhalten haben, zeigt die Abbildung, die Sie Ihrem ursprünglichen Beitrag hinzugefügt haben, einen Konstruktionsfehler, der behoben werden muss. Wenn nach meinen Berechnungen die Nennspannung von VCC 3,3 V beträgt, gilt für Thermistortemperaturwerte von
Die entsprechenden nominalen Ausgangsspannungen V_OUT von Ihrer Schaltung sind
(nb V_OUT ist die Spannung, die an den ADC-Eingangspin angeschlossen ist.) Gemäß dem Datenblatt von Espressif für den ESP8266EX (S. 16):
Diese V_OUT-Spannungen sind also zu hoch und können möglicherweise den ADC-Eingang beschädigen.
FWIW, wenn Sie die Positionen von Widerstand und Thermistor vertauschen, so dass die Schaltungstopologie wird
Die resultierenden V_OUT-Nennspannungen, die an den ADC für die oben genannten Thermistortemperaturen angelegt werden, sind
das wäre okay Diese Topologie stellt auch sicher, dass V_OUT mit zunehmender Thermistortemperatur ansteigt UND die Auflösung im ungünstigsten Fall (ohne Berücksichtigung anderer Fehlerquellen - z. B. Komponententoleranzen) am Ende von -40 ° C etwa 0,5 ° C / Bit beträgt ist nicht zu schrecklich.
In den FAQ von Espressif für den ESP8266 (scrollen Sie nach unten zum Abschnitt " Peripheriegeräte ") wird der Punkt " Wofür soll ich den internen ADC verwenden? " Angegeben (Hervorhebung hinzugefügt).
Zusätzliche Überlegungen zu diesem Thema in Bezug auf Möglichkeiten zur Reduzierung der Fehler bei Ihren Messungen werden von den anderen Befragten in Ihrem Beitrag angesprochen - z. B. Verschärfung der Komponententoleranzen mithilfe einer ratiometrischen Messmethode (für die wahrscheinlich ein externer ADC-Chip erforderlich wäre mit mindestens zwei Eingängen zur Messung von VCC und V_OUT) usw.
Das FAQ-Thema mit dem Titel " Wie genau ist der interne ADC? " Heißt (Hervorhebung hinzugefügt):
Wenn der Wi-Fi-Sender HF-Energie heult, fügt die Leistung, die vom HF-Sender aus der Stromversorgung entnommen wird, und die vom HF-Sender + Antenne emittierte elektromagnetische Strahlung a) den Leistungsbussen der Platine (möglicherweise erhebliches) elektrisches Rauschen hinzu ( zB VCC-Spannungsabfall) und b) Ihren nahegelegenen Widerstand + Thermistor + Verbindungskabel. Beachten Sie, dass Ihre Komponentenleitungen und Anschlusskabel als Antennen fungieren und einen Teil der vom Wi-Fi-Sender abgegebenen HF-Energie empfangen. IOW, Spannungsabfälle des Leistungsbusses und unerwünschte Absorption von HF-Energie im Leistungsbus und in Ihren Komponenten sind weitere wichtige Rauschquellen, die verwaltet werden müssen, wenn Ihre Temperaturmessungen Reproduzierbarkeit, Präzision und Genauigkeit aufweisen sollen.
quelle
Wenn Sie einen zusätzlichen Analogeingangswiderstand haben, teilen Sie die Versorgungsspannung und messen Sie diese mit dem Analogeingang. Auf diese Weise können Sie Spannungsfehler und Drift kompensieren.
quelle
Sie haben bereits mehrere Antworten, die verschiedene Aspekte des Problems abdecken. In dieser Antwort werde ich versuchen, nur einen ganz bestimmten Teil der Frage abzudecken: Wie erhält man aus Kalibrierungsdaten ein genaues mathematisches Modell? Mit anderen Worten, wie ein Modell an die Daten angepasst wird.
Sie erwarten, dass die Widerstands-Temperatur-Beziehung folgende Form hat:
1 / T = a 0 + a 1 log ( R )
Dabei ist T die absolute Temperatur und R der Widerstand in Ohm. Als erstes würde ich 1 / T als Funktion von log ( R ) zeichnen, um zu sehen, ob die Beziehung tatsächlich linear ist. Ich habe das mit dem Datenarray aus Ihrem Lua-Code gemacht. Ich konnte sehen, dass es fast linear ist, aber es gibt eine leichte sichtbare Krümmung.
Um diese Krümmung zu berücksichtigen, habe ich ein Polynom zweiten Grades angepasst und eine nahezu perfekte Anpassung erhalten mit:
1 / T = a 0 + a 1 log ( R ) + a 2 log ( R ) 2
a 0 = 1,35715e-3 ± 2,464e-6 (0,1816%)
a 1 = 2,11435e-4 ± 5,886e-7 ( 0,2784%)
a 2 = 2,93419e-6 ± 3,324e-8 (1,133%)
Ich sage, die Passform ist „fast perfekt“, weil es keinen offensichtlichen Trend bei den Rückständen gibt, die wie Rundungsgeräusche aussehen. Dann können Sie die obige Formel anstelle der Tabelle verwenden, wenn dies für Sie bequemer ist. Alternativ können Sie die Anpassung über einen kleineren Temperaturbereich wiederholen, der Ihre beabsichtigte Verwendung des Thermistors besser widerspiegelt.
quelle
Nun, ich möchte mich bei allen bedanken, die versucht haben, mir bei meinem Problem zu helfen. Selbst wenn Ihre Eingabe das genaue Problem nicht genau festlegte, erlaubte es mir, das Brot zu betrachten und das Vertrauen in mich selbst in Richtung Mathematik wiederzugewinnen. Besondere Erwähnung verdient der freundliche Mann, der die ADC-Spezifikationen des ESP8266 nachgeschlagen hat, wo er nur <1 VDC ausgesetzt werden sollte.
Mein Thermistor der TDK 472-Serie ist anscheinend ein guter ... Einige Leute dachten, es sei kein guter Teil, aber er reagiert überraschend ... Mein einziger Kritikpunkt ist, dass die Beine leicht oxidieren, aber das ist etwas, das abgedeckt ist das Datenblatt ... Es soll gelötet und sowieso nicht gespielt werden ... Ich denke, es ist ein Qualitätsfaktor, aber vielleicht gibt es tatsächlich einen besseren da draußen ... Ich bin bisher nur damit zufrieden.
Das (Haupt-) Problem war die Steinhart-Hart-Gleichung.
In der Tat war meine Schaltung für die 1-V-Grenze des ADC nicht richtig verdrahtet, tatsächlich hätte meine Schaltung in Bezug auf den Temperaturbereich, dem sie ausgesetzt sein sollte, besser konstruiert sein können, aber meine Beta- und Temperaturgleichungen hatte ich einer Rechnerseite entnommen und hatten es nicht doppelt überprüft ... Bei der Überprüfung ähnelten sie überhaupt nicht den tatsächlichen Steinhart-Hart-Gleichungen ... Tatsächlich war meine Beta weit von der vom Hersteller bereitgestellten Beta entfernt, aber ich hatte keine Ich habe eine Vorstellung davon, wie stark es schwanken sollte oder was es darstellt, also habe ich das beim Betrachten meiner Variablen während des Debuggens nicht wirklich berücksichtigt. Die Gleichung lieferte zwar einigermaßen vernünftige, vielleicht plausible Temperaturen, und vielleicht ist es "eine" Thermistorgleichung, aber es ist nicht die Steinhart-Hart-Gleichung ...
Jetzt liegt mein Beta-Wert in der Nähe des vom Hersteller angegebenen Werts, aber ich stellte fest, dass diese Ergebnisse etwas ungenau waren ... Ich habe die Mathematik für die Koeffizienten A, B, C codiert und verwende diese jetzt, um die Temperatur zu ermitteln ...
Mein TDK-Thermistor reagiert sehr schnell, aufgrund seiner Wärmeübertragungsfähigkeit verliert er sehr schnell Wärme an die Umgebungsluft, wenn sich jemals jemand wundert ... Ich mag es jedenfalls ... Ich denke, es war ein guter Pfeilkauf 😊
Nochmals vielen Dank, dass Sie versucht haben, mir zu helfen, und dass Sie mir geholfen haben, auch wenn nicht für das, was ich gefragt hatte 🙂
Wenn Sie meinen aktualisierten Code sehen möchten, fragen Sie bitte, und ich werde eine aktualisierte Kopie veröffentlichen.
Nochmals: Vielen Dank an alle
quelle