Differences

This shows you the differences between two versions of the page.

Link to this comparison view

ru:examples:sensor:thermistor [2010/12/15 15:11] – создано eduardtlmkru:examples:sensor:thermistor [Unknown date] (current) – removed - external edit (Unknown date) 127.0.0.1
Line 1: Line 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 термистора}} 
-*/ 
ru/examples/sensor/thermistor.1292418680.txt.gz · Last modified: (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0