Both sides previous revisionPrevious revisionNext revision | Previous revision |
de:examples:sensor:thermistor [2010/11/10 00:24] – Wember | de:examples:sensor:thermistor [2020/07/20 09:00] (current) – external edit 127.0.0.1 |
---|
====== Thermistor ====== | ====== Thermistor ====== |
| |
//Necessary knowledge: [HW] [[en:hardware:homelab:sensor]], [HW] [[en:hardware:homelab:lcd]], [ELC] [[en:electronics:voltage_divider]], [AVR] [[en:avr:adc]], [LIB] [[en:software:homelab:library:adc]], [LIB] [[en:software:homelab:library:module:lcd_alphanumeric]], [LIB] [[en:software:homelab:library:module:sensor]]// | //Notwendiges Wissen: [HW] [[en:hardware:homelab:sensor]], [HW] [[en:hardware:homelab:lcd]], [ELC] [[en:electronics:voltage_divider]], [AVR] [[en:avr:adc]], [LIB] [[en:software:homelab:library:adc]], [LIB] [[en:software:homelab:library:module:lcd_alphanumeric]], [LIB] [[en:software:homelab:library:module:sensor]]// |
| |
===== Theorie ===== | ===== Theorie ===== |
| |
[{{ :examples:sensor:thermistor:sensor_thermistor_ntc_picture.jpg?80|NTC thermistor}}] | [{{ :examples:sensor:thermistor:sensor_thermistor_ntc_picture.jpg?80|NTC Thermistor}}] |
| |
Ein Thermistor ist ein Typ von Widerstand, dessen Widerstand sich mit der Temperatur verändert. Es gibt zwei Typen von Thermistoren: Welche mit positiven Temperaturkoeffizieten und welche mit negativen Temperaturkoeffizieten. Der Widerstand von Thermistoren mit positiven Koeffizienten steigt wenn die Temperatur steigt und bei den Negativen steigt der Widerstand wenn die Temperatur fällt. | Ein Thermistor ist temperaturabhängiger Widerstand. Es gibt Thermistoren mit positiven und mit negativen Temperaturkoeffizienten. Der Widerstand von Thermistoren mit positiven Koeffizienten nimmt mit steigender Temperatur zu, bei Thermistoren mit negativen Koeffizienten steigt er mit sinkender Temperatur. Die dazugehörigen Abkürzungen sind PTC(//positive temperature coefficient//) und NTC (//negative temperature coefficient//). |
Die dazugehörigen Abkürzungen sind PTC(//positive temperature coefficient//) und NTC (//negative temperature coefficient//). | |
| |
Die Abhängigkeit des Thermistorwiderstands ist nicht linear von der Temperatur abhängig und dies verkompliziert die Benutzung. Für genaue Temperaturmessungen wird die Steinhart-Hart exponentielle Gleichung dritter Ordnung genutzt, da der Thermistorwiderstand in kleinen Temperaturbereichen linear ist. Die folgende vereinfachte Steinhart-Hartgleichung mit B-Parameter existiert für NTC Thermistoren: | Die Temperaturabhängigkeit des Widerstands verläuft nicht linear zu der Temperatur, was die Nutzung erschwert. Für genaue Temperaturmessungen bei größeren Temperaturschwankungen wird die exponentielle Steinhart-Hart Gleichung dritter Ordnung genutzt, da der Thermistorwiderstand nur innerhalb kleiner Temperaturbereiche linear ist. Für NTC Thermistoren gibts es folgende vereinfachte Steinhart-Hart-Gleichung mit dem Parameter B: |
| |
{{:examples:sensor:thermistor:sensor_ntc_equation.png?130|The relation between temperature and resistance of a NTC thermistor.}} | {{:examples:sensor:thermistor:sensor_ntc_equation.png?130|The relation between temperature and resistance of a NTC thermistor.}} |
| |
where:\\ | mit:\\ |
* T<sub>0</sub> - nominal temperature, usually 25 °C.\\ | * T<sub>0</sub> - nominale Temperatur, normalerweise 25 °C.\\ |
* R<sub>0</sub> - resistance at nominal temperature.\\ | * R<sub>0</sub> - Widerstand bei nominaler Temperatur.\\ |
* B - parameter B. | * B - Parameter B. |
| |
Parameter B ist ein Koeffizient, welcher normalerweise im Datenblatt des Thermistors enthalten ist. Aber er ist nur konstant in bestimmten Temperaturbereichen, z.B. in Bereichen von 25-50 °C oder 25-85 °C. Wenn der gemessene Temperaturbereich größer ist, sollte das Datenblatt des Thermistors zu Rate gezogen werden. | Der Parameter B ist ein Koeffizient, welcher normalerweise im Datenblatt des Thermistors vorgegeben ist. Aber er ist nur in bestimmten Temperaturbereichen ausreichend konstant, z.B. in Bereichen zwischen 25 und 50 °C oder zwischen 25 und 85 °C. Wenn der gemessene Temperaturbereich größer ist, sollte das Datenblatt des Thermistors zu Rate gezogen werden um die Gleichung zu erhalten. |
| |
Normalerweise wird ein Spannungsteiler benutzt um den Widerstand eines Thermistors zu messen, wobei ein Widerstand mit dem Thermistor ausgetauscht wird und die Inputspannung konstant ist. | Normalerweise wird ein Spannungsteiler genutzt, um den Widerstand eines Thermistors zu messen. Dabei wird ein Widerstand durch einen Thermistor ausgetauscht wird und die Inputspannung ist konstant. Es wird die Outputspannung des Spannungsteilers gemessen, welche sich in Abhängigkeit der Widerstandsänderung des Thermistors verändert. Wenn Spannung anliegt, fließt Strom durch den Thermistor, wodurch sich dieser bedingt durch den Thermistorwiderstand aufheizt und damit den Widerstand verändert. Der durch das Aufheizen entstehende Fehler kann berechnet werden, jedoch ist es einfacher einen Thermistor zu nutzen, welcher einen hohen Widerstand hat und sich nicht so viel aufheizt. |
Die Outputspannung des Spannungsteilers wird gemessen, welche sich je nach Widerstand des Thermistors ändert. Wenn Spannung anliegt, fließt Strom durch den Thermistor, welcher sich durch den Widerstand aufheizt und der Widerstand verändert sich. Den Fehler durch das Aufheizen kann man ausrechnen, jedoch ist es einfacher einen Thermistor zu nutzen, welcher einen hohen Widerstand hat und sich nicht so viel aufheizt. | |
| |
Mit begrenzten Ressourcen und weniger Anspruch auf Genauigkeit, werden vorberechnte Tabellen für die Temperaturen genutzt. Normalerweise haben die Tabellen Temperaturbereiche und die entsprechenden Werte an Widerstand, Spannung und ADC enthalten. Alle exponentiellen Berechnungen sind schon gemacht und der Nutzer muss nur noch die entsprechende Reihe finden und die Werte auslesen. | Bei begrenzten Ressourcen und geringerem Anspruch auf Genauigkeit, werden zuvor errechnete Diagramme und Tabellen für die Temperaturen genutzt. Normalerweise enthalten die Tabellen Temperaturbereiche und die entsprechenden Werte für Widerstand, Spannung und ADC. Alle exponentiellen Berechnungen wurden bereits durchgeführt sodass der Nutzer nur noch die entsprechende Reihe finden und die Werte auslesen muss. |
| |
===== Übung ===== | ===== Übung ===== |
| |
Das Sensormodul des HomeLab ist mit einem NTC Thermistor mit 10 kΩ nominellen Widerstand ausgestattet. Bei Temperaturen von 25-50 °C ist der Parameter B des Widerstands 3900. | Das Sensormodul des HomeLab enthält einen NTC Thermistor mit nominellem Widerstand von 10 kΩ. Bei Temperaturen von 25 bis 50 °C ist der Parameter B des Widerstands 3900. |
Ein Pin des Thermistors ist an die 5+V Betriebsspannungs angeschlossen der Andere an Kanal 2 (Pin PF2) Ein typischer 10 kΩ Widerstand ist auch am gleichen Pin des Microcontrollers und an die Erde angeschlossen, zusammen mit dem Thermistor entsteht so ein Spannungsteiler. Da wir mit ein NTC Thermistor arbeiten, wo der Widerstand sinkt wenn die Temperatur steigt, wird die Outputspannung bei steigender Temperatur höher. | Ein Pin des Thermistors ist an die +5 V Betriebsspannung angeschlossen der andere an Kanal 2 (Pin PF2). Ein typischer 10 kΩ Widerstand ist auch am gleichen Pin des Mikrocontrollers und an die Masse angeschlossen. So entsteht zusammen mit dem Thermistor ein Spannungsteiler. Da hier ein NTC Thermistor genutzt wird, bei welchem der Widerstand sinkt wenn die Temperatur steigt, wird die Outputspannung des Spannungsteilers bei steigender Temperatur höher. |
| |
Wenn man den AVR nutzt, ist es praktisch eine Tabelle zu mit den Werten der Temperaturen und des ADC zu nutzen um die korrekte Temperatur zu finden. Es ist klug für jeden °C Temperatur des Messbereiches den entsprechenden Wert des ADC raus zu suchen, da eine Tabelle zu groß auf Grund der 10 Bit ADC Werte wird. Es wird empfohlen ein Tabellenkalkulationsprogramm (MS Excel, Openoffice Calc, etc.) zu nutzen um die Tabelle zu erstellen. | Während der Nutzung des AVR ist es nützlich, eine Tabelle mit den Temperaturwerten und den Werten des ADC zu verwenden, um die korrekte Temperatur zu finden. Es ist sinnvoll, für jede Gradzahl der gewünschten Temperaturstufe des Messbereichs den korrespondierenden ADC Wert aus der Tabelle herauszusuchen, da die Tabelle aufgrund der 10 Bit ADC Werte sehr groß sein wird. Es wird empfohlen, ein Tabellenkalkulationsprogramm (MS Excel, Openoffice Calc, etc.) zur Erstellung der Tabelle zu nutzen. Die //Steinhart-Hart// Gleichung, welche für den NTC angepasst wurde, gibt den zur entsprechenden Temperatur korrespondierenden Widerstand aus. Abgeleitet aus dem Widerstand, ist es möglich die Outputspannung des Spannungsteilers zu berechnen und daraus den Wert des ADC. Berechnete Werte können wie folgt in das Programm eingefügt werden: |
Die //Steinhart-Hart// Formel welche für den NTC angepasst wurde, gibt den Widerstand bei entsprechender Temperatur aus. Abgeleitet aus dem Widerstand, ist es möglich die Outputspannung des Spannungsteilers zu berechnen und daraus den Wert des ADC. | |
Berechnete Werte können wie folgt ins Programm eingefügt werden: | |
| |
<code c> | <code c> |
// | // |
// Table for converting temperature values to ADC values. | // Tabelle zur Konvertierung von Temperaturwerten ind ADC Werte. |
// Every element of the array marks one Celsius degree. | // Jedes Element des Arrays kennzeichnet ein Grad Celsius. |
// Elements begin from -20 degree and end at 100 degree. | // Die Elemente beginnen bei -20 Grad und enden bei 100 Grad. |
// There are 121 elements in the array. | // Ein Array enthält 121 Elemente. |
// | // |
const signed short min_temp = -20; | const signed short min_temp = -20; |
</code> | </code> |
| |
Following algorithm may be used to find the temperature which corresponds to the parameters of the ADC: | Folgender Algorithmus kann genutzt werden um die mit den ADC Parametern korrespondierende Temperatur zu finden: |
| |
<code c> | <code c> |
// | // |
// Converting the ADC values to Celsius degrees: | // Konvertierung der ACD Werte in Grad Celsius: |
// | // |
signed short thermistor_calculate_celsius(unsigned short adc_value) | signed short thermistor_calculate_celsius(unsigned short adc_value) |
signed short celsius; | signed short celsius; |
| |
// Covering the table backwards: | // Tabelle von hinten beginnend durchgehen: |
for (celsius = max_temp - min_temp; celsius >= 0; celsius--) | for (celsius = max_temp - min_temp; celsius >= 0; celsius--) |
{ | { |
// If the value in the table is the same or higher than measured | // Ist der Wert aus der Tabelle gleich oder höher dem gemessenen |
// value, then the temperature is at least as high as the temperature | // Wert, ist die Temperatur mindestens so hoch wie die mit dem Element |
// corresponding to the element. | // korrespondierende Temperatur. |
if (adc_value >= conversion_table[celsius])) | if (adc_value >= conversion_table[celsius])) |
{ | { |
// Since the table begins with 0 but values of the elements from -20, | // Da die Tabelle mit 0 beginnt, die Werte der Elemente jedoch mit -20, |
// the value must be shifted. | // muss der Wert geshiftet werden. |
return celsius + min_temp; | return celsius + min_temp; |
} | } |
} | } |
| |
// If the value was not found the minimal temperature is returned. | // Wurde der Wert nicht gefunden, wird die minimale Temperaur ausgegeben. |
return min_temp; | return min_temp; |
} | } |
</code> | </code> |
Der Algorithmus sucht den Bereich aus der Tabelle in dem der ACD Wert liegt und, und nimmt die niedrigere Nummer dieses Bereiches. Die Ranknummer markiert die Gradzahl und beim addieren der primären Temperatur wird eine Genauigkeit von 1°C erreicht. | |
| |
Diese Umrechnungstabelle und Funktion sind schon in der HomeLab Library, daher gibt es keine Grund diese für diese Aufgabe zu erstellen. In der Library heisst die Umrechnungsfunktion //thermistor_calculate_celsius//. Es muss bedacht werden, dass die Funktion nur richtig ist, wenn sie mit dem Thermistor des Sensormoduls von HomeLab genutzt wird. Wenn man andere Thermistoren nutzt muss eine entsprechende Umrechnungstabelle erstellt werden und eine komplexere Funktion verwendet werden, welche im Handbuch der Library beschrieben wird. | Der Algorithmus sucht den Bereich aus der Tabelle in dem der ACD Wert liegt und wählt die niedrigere Nummer dieses Bereiches. Die Ranknummer markiert die Gradzahl und durch das Addieren der anfänglichen Temperatur wird eine Genauigkeit von 1°C erreicht. |
Das Beispielprogramm dieser Übung ist ein Thermometer, welches Temperatur in °C Misst und sie auf dem Alphabetischen LCD ausgibt. | |
| Umrechnungstabelle und Funktion sind schon in der HomeLab Bibliothek enthalten, sie müssen somit nicht extra für diese Aufgabe erstellt werden. In der Bibliothek heißt die Umrechnungsfunktion //thermistor_calculate_celsius//. Hierbei muss beachtet werden, dass die Funktion nur korrekt ist, wenn sie mit dem Thermistor des Sensormoduls aus dem HomeLab verwendet wird. Werden andere Thermistoren genutzt, muss eine entsprechende Umrechnungstabelle erstellt und eine komplexere Funktion verwendet werden, welche im Handbuch der Bibliothek beschrieben wird. Das Beispielprogramm dieser Übung ist ein Thermometer, welches Temperatur in °C mißt und sie auf dem alphabetischen LCD ausgibt. |
| |
| |
<code c> | <code c> |
// | // |
// Example program of the thermistor of Sensors module. | // Beispielprogramm des Thermistors des Sensormoduls. |
// The temperature is displayed on the LCD. | // Die Temperatur wird auf dem LCD angezeigt. |
// | // |
#include <stdio.h> | #include <stdio.h> |
| |
// | // |
// Main program | // Hauptprogramm |
// | // |
int main(void) | int main(void) |
char text[16]; | char text[16]; |
| |
// Setting the LCD | // Einrichten des LCD |
lcd_alpha_init(LCD_ALPHA_DISP_ON); | lcd_alpha_init(LCD_ALPHA_DISP_ON); |
| |
// Cleaning the LCD | // Löschen des LCD |
lcd_alpha_clear(); | lcd_alpha_clear(); |
| |
// Name of the program | // Name des Programms |
lcd_alpha_write_string("Termomeeter"); | lcd_alpha_write_string("Termomeeter"); |
| |
// Setting the ADC | // Einrichten des ADC |
adc_init(ADC_REF_AVCC, ADC_PRESCALE_8); | adc_init(ADC_REF_AVCC, ADC_PRESCALE_8); |
| |
// Endless loop | // Endlosschleife |
while (true) | while (true) |
{ | { |
// Reading the 4 times rounded values of the voltage of the thermistor | // Auslesen der 4-fach gerundeten Spannungswerte aus dem Thermistor |
value = adc_get_average_value(2, 4); | value = adc_get_average_value(2, 4); |
| |
// Converting the values of ADC into celsius scale | // Konvertieren der ADC Werte in Grad Celsius |
temperature = thermistor_calculate_celsius(value); | temperature = thermistor_calculate_celsius(value); |
| |
// Converting the temperature in to text. | // Konvertieren der Temperatur in Text. |
// To display the degree sign, the octal variable is 337. | // To display the degree sign, the octal variable is 337. |
sprintf(text, "%d\337C ", temperature); | sprintf(text, "%d\337C ", temperature); |
| |
// Displaying the text in the beginning of the second row of the LCD. | // Anzeige des Textes am Anfang der zweiten Zeile des LCDs. |
lcd_alpha_goto_xy(0, 1); | lcd_alpha_goto_xy(0, 1); |
lcd_alpha_write_string(text); | lcd_alpha_write_string(text); |
===== Extra ===== | ===== Extra ===== |
| |
* {{:examples:sensor:thermistor:ntc.xls|The diagram of temperature of a 10 kΩ NTC thermistor}} | * {{:examples:sensor:thermistor:ntc.xls|Das Temperaturdiagramm eines 10 kΩ NTC Thermistors}} |
| |