Table of Contents

Thermistor

Necessary knowledge: [HW] Sensors Module, [HW] lcd, [ELC] Voltage Divider, [AVR] Analog-to-digital Converter, [LIB] Analog to Digital Converter, [LIB] Alphanumeric LCD, [LIB] Sensors

Connaissances nécessaires: [HW] sensor, [HW] lcd, [ELC] Diviseur de tension, [AVR] Convertisseur analogique - numérique, [LIB] Convertisseur analogique numérique, [LIB] lcd_alphanumeric, [LIB] sensor

Théorie

Thermistor NTC

Un thermistor est une résistance dont la résistivité varie en fonction de la température. Il y a deux types de thermistors : à un coefficient de résistance de température positif, puis à un coefficient de résistance de température négatif. La résistance des thermistors à coefficient positif augmente lorsque la température augmente alors que la résistance diminue dans le cas des coefficients négatifs. Ils ont pour acronyme PTC (positive temperature coefficient) et NTC (negative temperature coefficient).

L’aspect compliqué de l’utilisation de thermistors est que leur dépendance à la résistance n’est pas linéaire. Cette dépendance n’est linéaire que dans les gammes de températures très faibles. Pour les mesures de températures exactes dans les diverses émissions de température, on peut utiliser l’équation exponentielle du 3e ordre de Steinhart-Hart. Pour les thermistors NTC il existe une équation de Steinhart-Hart simplifiée en B-parameter :

La relation entre la température et la résistance d’un thermistor NTC.

où:

Le paramètre B est un coefficient, qui est habituellement donnée dans la notice du thermistor. Mais il n’est seulement constant dans des plages de températures, par exemple dans les plages 25–50 °C ou 25–85 °C. Si la plage de température mesurée est plus grande on doit utiliser l’équation donnée (quand c’est le cas) dans la notice.

Pour mesurer la résistance d’un thermistor on utilise habituellement un diviseur de tension, où l’une des résistances est remplacée par le thermistor et la tension d’entrée est constante. La tension de sortie du diviseur est mesurée, tension qui évolue en fonction de la résistance du thermistor. Si on applique la tension, le courant passe par le thermistor qui fait chauffer le thermistor à cause de la résistance ce qui modifie sans cesse la résistance. Le défaut causé par la montée en température du thermistor peut être compensée par le calcul, mais il est plus facile d’utiliser des thermistors qui ont une résistance plus grande et qui chauffent moins.

Lorsqu’on a des ressources limitées and qu’on n’a pas besoin d’une grande précision, on utilise des graphiques pré calculés et des tables de température. D’une manière générale on trouve dans la ces tables les plages de température et la valeur de la résistance, la tension ou les convertisseur analogique – numérique qui correspondent à la plage de température. L’ensemble des calculs exponentiels sont faits et tout ce qu’a à faire l’utilisateur est de trouver la bonne rangée et de lire la température qui correpond.

Pratique

Le module du Home Lab est équipé d’un thermistor de type NTC de 10 kΩ de résistance nominale. Aux températures de 25-50 °C le paramètre B du thermistor est de 3900. L’une des broches du thermistor est connectée au +5V alors que l’autre est reliée à la voie 2 (broche numéro PF2) du convertisseur analogique - numérique. Avec la même broche du micro contrôleur, la terre est ainsi reliée à une résistance de 10kΩ, qui forme alors un diviseur de tension avec le thermistor. Depuis donc que nous utilisons un thermistor NTC, dont la résistance diminue avec l’augmentation de la température, la tension de sortie du diviseur de tension augmente donc avec l’augmentation de la température.

Il est alors judicieux d’utiliser la table de conversion des températures et du convertisseur analogique – numérique afin de trouver la bonne température à utiliser avec l’AVR. Il est judicieux de trouver la valeur correspondante du convertisseur analogique – numérique pour chacun des degrés de température de la plage de température voulue parce que la table de conversion est trop grande à cause des nombreuses valeurs ADC de 10 bits. Il est recommandé d’utiliser un tableur (MS Excel, Openoffice Calc, etc.) afin de réaliser la table. La formule de Steinhart-Hart qui est adaptée aux thermistors NTC dont il est question, permet de trouver la résistance du thermistor qui correspond à la température. Lorsqu’on utilise la résistance, il est possible de calculer la tension de sortie du diviseur de tension et d’utiliser cette tension de sortie pour calculer la valeur de l’ADC. Les valeurs calculées peuvent être insérées dans le programme suivant :

//
// Table for converting temperature values to ADC values.
// Every element of the array marks one Celsius degree.
// Elements begin from -20 degree and end at 100 degree.
// There are 121 elements in the array.
//
const signed short min_temp = -20;
const signed short max_temp = 100;
 
const unsigned short conversion_table[] =
{                           
	91,96,102,107,113,119,125,132,139,146,153,
	160,168,176,184,192,201,210,219,228,238,247,
	257,267,277,288,298,309,319,330,341,352,364,
	375,386,398,409,421,432,444,455,467,478,489,
	501,512,523,534,545,556,567,578,588,599,609,
	619,629,639,649,658,667,677,685,694,703,711,
	720,728,736,743,751,758,766,773,780,786,793,
	799,805,811,817,823,829,834,839,844,849,854,
	859,863,868,872,876,880,884,888,892,896,899,
	903,906,909,912,915,918,921,924,927,929,932,
	934,937,939,941,943,945,947,949,951,953,955
};

L'algorithme suivant permet de déterminer la température qui correspond aux paramètres de l'ADC:

//
// Converting the ADC values to Celsius degrees:
//
signed short thermistor_calculate_celsius(unsigned short adc_value)
{
	signed short celsius;
 
	// Covering the table backwards:
	for (celsius = max_temp - min_temp; celsius >= 0; celsius--)
	{
		// If the value in the table is the same or higher than measured 
		// value, then the temperature is at least the same high as the temperature
		// corresponding to the element.
		if (adc_value >= conversion_table[celsius]))
		{
			// Since the table begins with 0 but values from -20, the value
			// must be shifted.
			return celsius + min_temp;
		}
	}
 
	// If the value was not found the minimal temperature is returned.
	return min_temp;
}

L’algorithme recherche dans la table la plage qui convient aux valeurs de l’ADC et sauvegarde la valeur de rang la plus basse de cette plage. Les valeurs de rang sont en degrés ; la température avec une précision de 1 degré arrive lorsqu’on ajoute la température originale à la valeur de rang.

Cette table de conversion ainsi que cette fonction sont déjà dans la librairie du Home Lab, dans les exercices il n’est pas nécessaire de les écrires. La fonction de conversion est dénommée thermistor_calculate_celsius dans la librairie. On doit prendre en compte que la conversion n’est valable seulement si elle est utilisée avec le thermistor du module de capteur Home Lab. Afin d’utiliser un autre thermistor, on doit utiliser une table de conversion propre ainsi que les fonction complexes, décrites dans le manuel de la librairie. L’exemple suivant est un thermomètre, qui mesure la température en degrés Celsius et l’affiche sur l’écran LCD.

//
// Example program of the thermistor of module of sensors of home lab.
// The temperature is displayed on the LCD.
//
#include <stdio.h>
#include <homelab/adc.h>
#include <homelab/module/sensors.h>
#include <homelab/module/lcd_alpha.h>
 
//
// Main program
//
int main(void)
{
	unsigned short value;
	signed short temperature;	
	char text[16];
 
	// Setting the LCD
	lcd_alpha_init(LCD_ALPHA_DISP_ON);
 
	// Cleaning the LCD
	lcd_alpha_clear();
 
	// Name of the program
	lcd_alpha_write_string("Termomeeter");
 
	// Setting the ADC
	adc_init(ADC_REF_AVCC, ADC_PRESCALE_8);
 
	// Endless loop
	while (true)
	{
		// Reading the 4 times rounded values of the voltage of the thermistor
		value = adc_get_average_value(2, 4);
 
		// Conversing the values of ADC into celsius scale
		temperature = thermistor_calculate_celsius(value);
 
		// Conversing the temperature in to text.
		// To display the degree sign, the octal variable is 337.
		sprintf(text, "%d\337C   ", temperature);
 
		// Displaying the text in the beginning of the second row of the LCD.
		lcd_alpha_goto_xy(0, 1);
		lcd_alpha_write_string(text);
	}
}

Extra