| |
| ru:examples:sensor:thermistor [2010/12/15 15:11] – создано eduardtlmk | ru:examples:sensor:thermistor [Unknown date] (current) – removed - external edit (Unknown date) 127.0.0.1 |
|---|
| ====== Термистор ====== | |
| |
| //Необходимые знания: [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 термистора }} | |
| |
| где:\\ | |
| * T<sub>0</sub> - номинальная температура, например 25 °C.\\ | |
| * R<sub>0</sub> - 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. Найденные значения можно следующим образом записать в программу: | |
| |
| <code c> | |
| // | |
| // Таблица для перевода температуры в значение 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 | |
| }; | |
| </code> | |
| |
| ~~PB~~ | |
| |
| Для того, чтобы в таблице найти температуру по значению ADC , можно использовать следующий алгоритм: | |
| |
| <code c> | |
| // | |
| // Перевод значения 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; | |
| } | |
| </code> | |
| |
| Алгоритм ищет в таблице интервал, в котором находится значение ADC, и узнаёт нижнюю границу порядкового номера интервала. Порядковый номер обозначает градусы, к нему следует лишь прибавить начальную температуру и таким образом получается точность температуры в 1 градус. | |
| |
| Приведенные таблица перевода и функция уже имеются в библиотеке Домашней Лаборатории, так что в данном упражнении их самим писать не надо. У функции преобразования в библиотеке есть название //thermistor_calculate_celsius//. Нужно учитывать, что преобразовании подходит только термистору, находящемуся в модуле «Датчики» Домашней Лаборатории. Для использования других термисторов придется создавать таблицу переводов самому и использовать сложные функции, описанные в инструкции библиотеки. В упражнении для примера программы есть термометр, который измеряет температуру в Цельсиях и отображает это на буквенно-цифровом LCD экране. | |
| |
| ~~PB~~ | |
| |
| <code c> | |
| // | |
| // Пример программы термистора модуля «Датчики» Домашней Лаборатории. | |
| // На 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); | |
| } | |
| } | |
| </code> | |
| |
| /* | |
| ===== Дополнительные материалы ===== | |
| |
| * {{:examples:sensor:thermistor:ntc.xls|10 kΩ Температурный график NTC термистора}} | |
| */ | |