====== Термистор ======
//Необходимые знания: [HW] [[et:hardware:homelab:sensor]], [HW] [[et:hardware:homelab:lcd]], [ELC] [[et:electronics:voltage_divider]], \\ [AVR] [[et:avr:adc]], [LIB] [[et:software:homelab:library:adc]], [LIB] [[et:software:homelab:library:module:lcd_alphanumeric]], \\ [LIB] [[et:software:homelab:library:module:sensor]]//
===== Теория =====
[{{ :examples:sensor:thermistor:sensor_thermistor_ntc_picture.jpg?80|NTC термистор}}]
Термистор – это резистор, сопротивление которого меняется от температуры. Термисторы бывают двух типов: с положительным и отрицательным температурным коэффициентом. У терморезистора с положительным коэффициентом при повышении температуры сопротивление возрастает, а с отрицательным коэффициентом - уменьшается. Их сокращённые названия на английском языке: PTC (//positive temperature coefficient//) и NTC (//negative temperature coefficient//).
Использование термистора усложняет нелинеарность температурной зависимости его сопротивления. Зависимость является линеарной только в маленьких пределах, для вычисления нескольких десятков градусов и большей границы измерения подходит экспоненциальное уравнение третьего порядка Стейнхарта-Харта. Для NTC терморезисторов существует следующее упрощенное уравнение с B – параметром:
{{:examples:sensor:thermistor:sensor_ntc_equation.png?130|Температурная зависимость сопротивления NTC термистора }}
где:\\
* T0 - номинальная температура, например 25 °C.\\
* R0 - cопротивление при номинальной температуре.\\
* B - B–параметр.
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
#include
#include
#include
//
// Основная программа
//
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);
}
}
/*
===== Дополнительные материалы =====
* {{:examples:sensor:thermistor:ntc.xls|10 kΩ Температурный график NTC термистора}}
*/