====== Термистор ====== //Необходимые знания: [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 термистора}} */