Table of Contents

Термистор

Необходимые знания: [HW] Andurite moodul, [HW] LCD moodul, [ELC] Pingejagur,
[AVR] Analoog-digitaalmuundur, [LIB] Analoog-digitaalmuundur, [LIB] Alfabeetiline LCD,
[LIB] Andurid

Теория

NTC термистор

Термистор – это резистор, сопротивление которого меняется от температуры. Термисторы бывают двух типов: с положительным и отрицательным температурным коэффициентом. У терморезистора с положительным коэффициентом при повышении температуры сопротивление возрастает, а с отрицательным коэффициентом - уменьшается. Их сокращённые названия на английском языке: PTC (positive temperature coefficient) и NTC (negative temperature coefficient).

Использование термистора усложняет нелинеарность температурной зависимости его сопротивления. Зависимость является линеарной только в маленьких пределах, для вычисления нескольких десятков градусов и большей границы измерения подходит экспоненциальное уравнение третьего порядка Стейнхарта-Харта. Для NTC терморезисторов существует следующее упрощенное уравнение с B – параметром:

Температурная зависимость сопротивления NTC термистора

где:

B – параметр это коэффициент, который обычно дается в спецификации термистора. В то же время, он достаточно постоянен только в известных температурных промежутках, к примеру, 25–50 °C или 25–85 °C. Если измеряемый температурный промежуток больше, то при возможности следует использовать уравнение, находящееся в спецификации.

Сопротивление термистора измеряется косвенно делителем напряжения, где вместо одного резистора устанавливается термистор и входное напряжение которого постоянное. Измеряется выходное напряжение делителя напряжения, которое изменяется вместе с изменением сопротивления термистора. При подаче напряжения через термистор проходит электрический ток, который нагревает термистор из-за его сопротивления и таким образом изменяет сопротивление. Ошибку, возникающую при нагревании термистора, можно компенсировать вычислительно, но легче использовать термистор с большим сопротивлением, который нагревается меньше.

Из-за ограниченного ресурса и отсутствия необходимости применения большой точности, используются заранее вычисленные таблицы взаимозависимых температуры и сопротивления. В таблице, в целом, записаны показания температуры с точным интервалом, в соответствии с сопротивлением датчика, напряжением или значением аналогово-дигитального преобразователя. Для таблицы все экспоненциальное вычисление сделано заранее и в программе нужно всего лишь найти ряд, соответствующий измеренному параметру и прочесть температуру.

Практика

Плата модуля «Датчики» Домашней Лаборатории снабжена термистором типа NTC с номинальным сопротивлением 10 kΩ. При температуре 25-50 °C B – параметр равен 3900. Один вывод термистора подключен к питанию +5 V и другой к каналу 2 (вывод PF2) аналогово-дигитального преобразователя микроконтроллера. С тем же выводом микроконтроллера и землей соединен обычный 10 kΩ резистор, который вместе с терморезистором образует делитель напряжения. Так как имеется дело с NTC термистором, сопротивление которого уменьшается с повышением температуры, тогда в это же время поднимается и выходное напряжение делителя напряжения.

Для поиска температуры целесообразно использовать таблицу преобразования значений температуры и аналого-дигитального преобразователя. Разумно для каждого градуса найти соответствующее значение аналого-дигитального преобразователя из желаемого интервала температур, потому что противоположная таблица будет слишком большой из-за количества 10-битных ADC значений. Для создания таблицы желательно использовать какую-либо программу по вычислению таблиц (MS Excel, Openoffice Calc или другие). При помощи приведенного выше уравнения Стейнхарта-Харта, адаптированного для NTC термисторов, можно найти соответствующее температуре сопротивление терморезистора. Из сопротивления можно вычислить выходное напряжение делителя напряжения и в свою очередь из него - значение ADC. Найденные значения можно следующим образом записать в программу:

//
// Таблица для перевода температуры в значение ADC.
// Каждый элемент массива обозначает один градус Цельсия.
// Элементы начинаются от -20 градусов и кончаются 100 градусами.
// В целом в массиве 121 элемент.
//
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
};

 

Для того, чтобы в таблице найти температуру по значению ADC , можно использовать следующий алгоритм:

//
// Перевод значения ADC в градусы Цельсия.
//
signed short thermistor_calculate_celsius(unsigned short adc_value)
{
	signed short celsius;
 
	// Прохождение таблицы наоборот
	for (celsius = max_temp - min_temp; celsius >= 0; celsius--)
	{
		// Если значение таблицы такое же или больше чем измеренный результат,
		// тогда температура примерно такая же высокая,
		// как и температура соотвествуящая элементам.
		if (adc_value >= conversion_table[celsius])
		{
			// Так как таблица начинается с нуля, 
			// а значение элемента – 20 градусов, то придется значение сдвинуть
			return celsius + min_temp;
		}
	}
 
	// Если значение не найдено, то возвращается минимальная температура
	return min_temp;
}

Алгоритм ищет в таблице интервал, в котором находится значение ADC, и узнаёт нижнюю границу порядкового номера интервала. Порядковый номер обозначает градусы, к нему следует лишь прибавить начальную температуру и таким образом получается точность температуры в 1 градус.

Приведенные таблица перевода и функция уже имеются в библиотеке Домашней Лаборатории, так что в данном упражнении их самим писать не надо. У функции преобразования в библиотеке есть название thermistor_calculate_celsius. Нужно учитывать, что преобразовании подходит только термистору, находящемуся в модуле «Датчики» Домашней Лаборатории. Для использования других термисторов придется создавать таблицу переводов самому и использовать сложные функции, описанные в инструкции библиотеки. В упражнении для примера программы есть термометр, который измеряет температуру в Цельсиях и отображает это на буквенно-цифровом LCD экране.

 

//
// Пример программы термистора модуля «Датчики» Домашней Лаборатории.
// На LCD дисплее отображается температура в градусах.
//
#include <stdio.h>
#include <homelab/adc.h>
#include <homelab/module/sensors.h>
#include <homelab/module/lcd_alpha.h>
 
//
// Основная программа
//
int main(void)
{
	unsigned short value;
	signed short temperature;	
	char text[16];
 
	// Настройка LCD экрана
	lcd_alpha_init(LCD_ALPHA_DISP_ON);
 
	// Очистка LCD экрана
	lcd_alpha_clear();
 
	// Название программы
	lcd_alpha_write_string("Термометр");
 
	// Настройка ADC преобразователя
	adc_init(ADC_REF_AVCC, ADC_PRESCALE_8);
 
	// Бесконечный цикл
	while (true)
	{
		// Считывание значения напряжения термистора, округленное в 4-раза
		value = adc_get_average_value(2, 4);
 
		// Пересчитывание значения ADC в градусы
		temperature = thermistor_calculate_celsius(value);
 
		// Перевод температуры в текст
		// Для отображения знака градуса октановое число 337
		sprintf(text, "%d\337C   ", temperature);
 
		// Отображение текста в начале второго ряда LCD
		lcd_alpha_goto_xy(0, 1);
		lcd_alpha_write_string(text);
	}
}