Шановні друзі!
31 грудня магазин працюватиме до 16 години. 1 та 2 січня магазин працювати не буде.
Вітаємо всіх з Різдвом та Новим Роком!
Мобильная версия Форум Arduino Документация Гарантийные условия 0 0
UA RU
График работы магазина:
Пн-Пт: 8.00 - 19.00
Сб: 10.00 - 17.00
Вс: выходной
Каталог
Напиши статью и получи скидку!

Термістор (терморезистор). ADC в stm32

2017-02-21

Все статьи →

Богдан Парфенюк

Дана стаття являється кроком до створення табло на основі дисплею 320х240px з контролем температури для лабораторного блока живлення.

Тому використовуються саме Термістори. Вони мають мізерну ціну, малий розмір (їх зручно прикріпити до радіатора), доступні, також вони не бояться вологи та працюють в будь яких умовах.

А ще їх можна віддалити від контролера на доволі велику відстань і не перейматися про втрату сигналу. Також, нагадаю що маючи викладений нижче алгоритм роботи та код програми, можна не прикладаючи багато зусиль (переписати лише ініціалізацію ніжок) застосувати цей код до будь-якого контролера stm32. У моєму випадку це stm32f103vet6.

Терморезистори (термістори) бувають різними за виглядом але всі вони являються резисторами і тому основною їхньою характеристикою є опір (який вони жваво міняють залежно від прикладеної до них температури ). Я використовую резистор 10кОм (це можна визначити помірявши його опір при кімнатній температурі С). Наприклад ще є термістори на 100кОм.

Обладнання:

Термістор (терморезистор)

Плата з контролером stm32, наприклад - така

Реле, наприклад - таке);

SWD програматор

Схема підключення:

Живлення та підсвітка LCD шилда 3.3V. Працює по FSMC у 16-бітному режимі.

Розпіновка задіяних ніжок контролера на Малюнку 1 (зеленим позначені піни тачскріна)

Малюнок 1

Ще хочу повідомити що використовуємо ми ADC контролера тому потрібно стабілізувати живлення для нього. Наприклад використовувати якийсь блок живлення на 5V (якщо ми живимо демоплату), а не просто втикнути все в USB комп’ютера. Інакше напруга просяде і значення VREF зміниться, наслідком цього буде некоректне вимірювання спаду напруги на термісторі.

На Малюнку 2 зображено як підєднати терморезистор.

Чому саме так? Це тема закону Ома та дільників напруги тому кому цікаво може погуглити це =)

Малюнок 2

Код програми та логіка роботи:

@Код прикладаю в архіві. Там цілий проект EmBits. Це найшвидший спосіб перевірити усе в діїі та застосувати.

Це IDE безкоштовне - http://www.emblocks.org/web/downloads-main

Тільки встановити і вже можна відразу працювати. Якщо колись встановлювали Microsoft Office то проблем з цим не виникне_)

Запустивши проект спочатку перевіримо чи правильно працює наш ADC.

Для цього в скачаному проекті, в мейні (відразу після init_adc();) вписуємо наступне:

uint16_t test=0;

While(1)

{

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

test = adc_res;

}

Компілюємо і запускаємо відладку. Додаємо у watch змінну test і дивимося що вона показує.

При під’єднанні обраного виводу ADC до VREF(у нашому випадку 3.3V) значення повинно бути рівне 4095 а коли приєднати цей пін до землі (від’єднавши при цьому від 3.3V) то значення test буде рівне нулю. Якщо все добре значить рухаємось далі, якщо ні то шукаємо помилки в схемі або ініціалізації ADC (можливо ви щось додавали своє тому краще спочатку протестувати те що є а потім тільки вносити свої зміни).

Тепер складаємо схему з резистором і терморезистором як зображено на малюнку 2.

Видаляємо що є в мейні і вписуємо туди наступне і перекомпільовуємо (це теж певний тест):

initPeriph();

initFSMC();

initLCD();

init_adc();

fillRectangle(0,0,320,240,RED);

delay(1000);

double z=0,a=0;

fillRectangle(0,0,320,240,BLACK);

while(1)

{

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

z=seredn_ADC(100);

if(z!=a&&z!=a+1&&z!=a-1)

{ drawFloat(a,4,20,0,4,BLACK); drawFloat(z,4,20,0,4,YELLOW0); a=z; }

delay(ChasotaVumir);

}

Результатом такої програми буде вивід на дисплей спаду напруги на нашому терморезисторі. Це дасть змогу перевірити те що міряє наш ADC і порівняти значення з показами мультиметра.

ВАЖЛИВО те що перед тим як запускати вище приведений кусочок коду потрібно вказати значення VREF у дефайнах зверху (ну це не зовсім VREF, це певний множник який вираховується відносно дійсного у вас VREF).

Яку ж туди впистати змінну? Щоб дізнатися вмикаємо нашу плату до нашого живлення і міряємо напругу між землею і 3.3V. Все залежить від стабільності джерела живлення. Припустим у нас значення 3.24V, знайючи це ми ділимо його на 4095 і отримуємо приблизно 0,0008V. Ось це значення і потрібно записати. Усе, тепер компілюємо і перепрошиваємо.

Результат тестера може різнитися від показників ADC. У мене різниця склала 0.5V. думаю це визвано тим що вольтметр в тестері можливо враховує додатковий опір щупів який він вносить в систему чи щось таке…

А ще я користуюся китайським не оригінальним тестером який має значно більшу похибку ніж оригінальний та якісний мультиметр.

Результат цього тесту можна переглянути тут - https://www.youtube.com/watch?v=YDU45s27oEM

Тепер зробимо так щоб малювався графік (для якоїсь естетичної наглядності). При збільшенню температури опір падає і значення напруги теж, тобто значення температури обернено пропорційне спаду напруги на термісторі. Запустимо в мейні той код який був з самого початку в архіві після скачування і відрегулюємо чутливість нашої гістаграми.

Це можна зробити погравшись із значеннями в дефайнах (значення задаються цілими числами у мілісекундах):

#define ChastotaGistogramu 2 //(ms); 1000ms==1s

#define ChasotaVumir 80 //(ms); 1000ms==1s

Результат повинен бути чимось схожим на це: https://www.youtube.com/watch?v=v-aKbQPOptM

Тепер до самого цікавого. Як тепер нам отримати значення температури? Відповідь одна – імперичним методом. Діло в тому що ніякі формули нам у цьому не допоможуть, щоб не писав даташит усі термістори різні і залежності опору від температури у них не лінійні. Тому якщо ми хочемо отримати мінімальну похибку то потрібно заміряти значення спаду напруги на даному термісторі при кожному значенню температури яке нам потрібне. Відповідно результатом буде щось типу табличці:

Тільки ця складена відносно опору а у нас буде відносно температури. У мому випадку все що нижче 1.31V це температура більша 30 градусів а все що більше 1.75V це температура нижча 20 градусів. Ці два значення я теж вписав у дефайни і використовую їх, для прикладу, як порогові значення вмикання і вимикання двох реле.

Коли значення температури більше 30 градусів (менше 1.31V) то вмикається одне реле (інакше воно вимкнуте), якщо значення температури менше 20 градусів (більше 1.75V) то вмикаєтся друге реле (при всіх інших значеннях воно вимкнуте). Реле живляться від 3V і сигналом спрацювання для них логічний нуль на пінах PE2 та PE3.

Результат можна побачити на відео - https://www.youtube.com/watch?v=JT5Dc-ePWCg

ВИСНОВОК:

Термістор являється достойною заміною різним цифровим та аналоговим датчикам температури (при умові що в контролері є ADC). Таким чином можна здешивити свій виріб, а результат і точність вимірів температури не зміниться. При повторені цього проекту не обов’язково використовувати дисплей.

Порогові значення можна змінювати по бажанню в дефайнах.

Треба ще розуміти що термістор реагує на температуру свого корпусу і щоб зовнешнє середовище передало йому свою температуру яку ми хочемо виміряти потрібен час (у мене він складав 2-3 секунди). Тобто потрібно забезпечити швидкий теплообмін між термістором і обєктом вимірювань.

Успіхів при повторені!

Ваша оценка статьи:

Отлично
Хорошо
Удовлетворительно
Плохо
Очень плохо

Общая оценка:

Оценка "Термістор (терморезистор). ADC в stm32"
5 из 5
сделана на основе 2 оценок 2 клиентских отзывов.

Благодарим Вас за обращение! Ваш отзыв появится после модерации администратором.
Алексей
20.12.2020 05:42:03
Молодец!!
Максим
02.02.2019 09:01:01
Со съемом показаний с терморезисторов много возятся в прошивках 3Д-принтеров. Можно посмотреть например в исходниках прошивки Marlin. Правда там стандарт обычно 100 кОм.
оплата картами Visa и MasterCard