C-Source Generator für NTC-LookUp Tabellen



Spannungsteiler NTC Spannungsteiler NTC
Widerstand NTC
Pullup-Widerstand
Beta-Wert NTC
ADC-Auflösung (8/10/12 Bit)
Sourcedatei AVR
32 Stützpunkte
Generierter C-Code
Virtueller live ADC-Wert

ADC-Wert interpolierte Temperatur: -- °C


Zuordnung ADC-Werte zu Temperatur
Erklärung NTC, Benutzung des Generators


Leider haben NTC-Widerstände / -sensoren eine nichtlineare Kennline, weshalb es auf den ersten Blick schwierig erscheint, einen Widerstandswert einer korrekten Temperatur zuzuordnen. Eine an sich genaue, allerdings auwändige Methode, ist, Werte Temperatur zu Widerstand aus dem Datenblatt (das es hoffentlich gibt) in eine LoopUp-Tabelle einzutragen und die Werte dazwischen zu interpolieren (was einiges an Arbeit bedeutet).

Eine andere Möglichkeit besteht darin, die Temperatur über die sogenannte Steinhart-Hart-Gleichung zu bestimmen. Hierfür müssen jedoch die Daten im Datenblatt enthalten sein. Zudem ist es sehr resourcenfressend, einen ln(wert) Algorithmus auf einem Mikrocontroller auszuführen.

Zudem sind für viele sehr preisgünstige (billige) Sensoren die von Steinhart-Hart benötigten Werte nicht verfügbar, es wird hier nur ein sogenannter B(25/80) oder auch Beta Wert angegeben.

B(25/80) ist ein Materialkonstantenwert, der zwischen den Widerstandswerten des NTC-Sensors bei 25°C und 80°C Gültigkeit hat. Ein gängiger Wert für einen 10k NTC-Widerstand ist bspw. 3950 (das muß aber nicht immer so sein, ein Blick ins Datenblatt oder auch die Angabe beim Einkauf ist hier hilfreich). Die Formel zum Umrechnen des aktuellen Widerstandwertes eines NTC in eine Temperatur ist:


Hierbei gilt: Ein Spannungsteiler, bestehend aus einem NTC und einem PullUp-Widerstand, erzeugt hier eine von der Temperatur abhängige Spannung. Der LookUp-Table-Generator erzeugt ein C-Array, welches Widerstandswerte zu Temperaturen zuordnet. Hierbei wird die obige Formel für den B(25/80) Wert sowie einer Spannungsteilerformel berücksichtigt. Der Spannungsteiler ist an die Betriebsspannung Vcc des Mikrocontroller angeschlossen und der Mikrocontroller muß die Betriebsspannung als Referenzspannung für den ADC verwenden. Der Ausgang des Spannungsteilers wird an den ADC-Eingang des Controllers angeschlossen.

Je nach Auflösung des ADC können hier jetzt Digitalwerte von 0..255 (8-Bit), 1023 (10-Bit) oder 4195 (12-Bit) je nach Temperatur gemessen werden. Dieser ADC-Wert kann der, vom Generator erzeugten Funktion   int ntc_gettemp(uint16_t adc_value)   als Funktionsargument übergeben werden. Die Funktion sucht jetzt die Tabelle ab, interpoliert die Temperatur zwischen 2 Stützpunkten (16 oder 32 Stützpunkte) und gibt die Temperatur in Zehntelgrad als Funktionsargument zurück. Das Diagramm zeigt an, wo sich die Temperaturstützpunkte befinden zwischen denen eine Interpolation stattfindet. Zwischen 2 Stützpunkten wird angenommen, dass die Funktion linear ist.

Bei Benutzung dieser Seite müssen also nur die Angaben zum Nennwiderstand des NTC (Widerstandswert, den dieser in aller Regel bei 25°C hat), der PullUp-Widerstand und der B(25/80) Wert, sowie die Auflösung des ADC eingegeben werden. AVR-Controller und CH32V003 haben einen integrierten 10-Bit ADC, während STM32 Controller in aller Regel 12-Bit verwenden. Desweiteren kann gewählt werden, ob 32 Stützpunkte in das Array eingehen, oder nur 16. Mit 32 Stützpunkten wird die Interpolation in der Tabelle genauer und somit die ausgegebene Temperatur.

Ein Klick auf   Generate   erzeugt die C-Source Datei, ein Klick auf   Copy to Clipboard   kopiert den Quellcode, der in einer Sourcedatei mittels STRG-V eingefügt werden kann.

Eine Besonderheit liegt bei AVR-Controller vor. Arrays können (sollen) im Flash gespeichert werden, damit diese, so sie nur gelesen werden, den Ram-Speicher nicht unnötig belasten (bei der Ausgabe erkennbar am Zusatz   progmem   ). Bei Benutzung eines AVR muß hier   #include <avr/pgmspace.h>   in der Sourcedatei des Programms mit eingefügt werden.

Mit einer Eingabe bei   Virtueller live ADC-Wert   kann getestet werden, welcher ADC-Wert welcher Temperatur entspricht.


Trivia:   Diese Seite hier ist aus einem C-Programm ntctable.c , dass ich in 2014 für die Linux-Console geschrieben (und 2019 erweitert). Dem dieser Seite zugrunde liegende JavaScript Code sieht man seinen Ursprung deutlich an. Nachdem ich dieses C-Programm im Forum www.mikrocontroller.net vorgestellt hatte, ließ man mich wissen, dass es einen solchen Generator bereits als Online-Version unter www.sebulli.com/ntc/ gibt.

Natürlich kommt der Generator hier zum selben Ergebnis wie diese Seite hier auch, obwohl das JavaScript Programm zum Generieren des Arrays ein anderes ist (liegt doch die selbe Formel für den B(25/80) Wert zugrunde). Bei der Funktion des Interpolierens ist der erstellte Code identisch, allerdings kommt man beim Optimieren dieser einfachen linearen Interpolation schnell zu diesem Ergebnis.

Die Seite von sebulli wird dann interessant, wenn anstelle eines PullUp-Widerstands ein PullDown-Widerstand verwendet werden soll. sebulli kann hierfür - im Gegensatz zu dieser Seite - auch eine LookUp-Table und eine Interpolation generieren.