NTC термістор
Термістор - це резистор, опір якого змінюється від температури. Термістори бувають двох типів: з позитивним і негативним температурним коефіцієнтом. У терморезистора з позитивним коефіцієнтом при підвищенні температури опір зростає, а з негативним коефіцієнтом - зменшується. Їх скорочені назви англійською мовою: PTC (positive temperature coefficient) і NTC (negative temperature coefficient).
Використання термістора ускладнює нелінеарность температурної залежності його опору. Залежність є линеарной тільки в невеликих межах, для обчислення декількох десятків градусів і більшою кордону виміру підходить експоненціальне рівняння третього порядку Стейнхарта-Харта. Для NTC терморезисторов існує наступне спрощене рівняння з B - параметром:
де:
T0 - номінальна температура, наприклад 25 ° C.
R0 - Опір при номінальній температурі.
B - B-параметр.
B - параметр це коефіцієнт, який зазвичай дається в специфікації термистора. У той же час, він досить сталий тільки у відомих температурних проміжках, наприклад, 25-50 ° C або 25-85 ° C. Якщо вимірюваний температурний проміжок більше, то при можливості слід використовувати рівняння, що знаходиться в специфікації.
Опір термістора вимірюється опосередковано дільником напруги, де замість одного резистора встановлюється термістор і вхідна напруга якого постійне. Вимірюється вихідна напруга дільника напруги, яке змінюється разом зі зміною опору термістора. При подачі напруги через термістор проходить електричний струм, який нагріває термистор через його опору і таким чином змінює опір. Помилку, що виникає при нагріванні термистора, можна компенсувати обчислювально, але легше використовувати термістор з великим опором, який нагрівається менше.
Через обмеженого ресурсу і відсутності необхідності застосування великої точності, використовуються заздалегідь обчислені таблиці взаємозалежних температури і опору. У таблиці, в цілому, записані свідчення температури з точним інтервалом, відповідно до опором датчика, напругою або значенням аналогово-світа перетворювача. Для таблиці все експоненціальне обчислення зроблено заздалегідь і в програмі потрібно всього лише знайти ряд, відповідний измеренному параметру і прочитати температуру.
Плата модуля «Датчики» Домашньої Лабораторії забезпечена термістором типу NTC з номінальним опором 10 kΩ. При температурі 25-50 ° CB - параметр дорівнює 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 \ 337 C", temperature); // Відображення тексту на початку другого ряду LCD lcd_alpha_goto_xy (0, 1); lcd_alpha_write_string (text); }}