Мобильная версия
Вход в магазин
Регистрация
Напомнить пароль
Список желаний
(098) 067-12-26 Киевстар (098) 067-12-26   Киевстар
(066) 142-24-48 Vodafone (066) 142-24-48   Vodafone
(098) 067-12-26 Lifecell (063) 642-36-59   Lifecell

График работы магазина:

Пн-Пт: 10.00 - 19.00

Сб-Вс: выходные

Киев, пр-кт Голосеевский, 97-А
р-н метро "Выставочный центр"

Каталог

Блочное шифрование в IoT

Исторически сложилось, что для IoT (Internet of Things) на базе ZigBee сетей в первую очередь стояла цель минимизировать энергопотребление, потому вопрос безопасности остался без внимания. В данной статье предлагается пример безопасной IoT системы с

Комплекс домашней автоматизации (Часть 2)

Следующим этапом разработки комплекса домашней автоматизации стал проект уличной метеостанции.

Генератор радиошума в диапазоне 2.4 ГГц

Генераторы шума обычно используются для научных экспериментов и для тестирования приемо-передающего или антенного оборудования, но еще с помощью них, можно улучшить уже существующую беспроводную инфраструктуру.

Комплекс домашней автоматизации (Часть 1)

Комнатная метеостанция. Основная функция устройства – это сигнализация об аварийных ситуациях, но поскольку на плате установлен микроконтроллер ATmega328p, я решил добавить несколько датчиков для автономности и организации обратной связи.

Роутер на Raspberry Pi 3 с дисплеем

В проекте используются Raspberry Pi 3 и OLED (SSD1306 128x64 I2C или SPI). Для корпуса используется акриловый «сэндвич», так как так наглядней, и обычный 5-вольтовый источник питания силой тока около 0,5 А (этого вполне достаточно: устройство потребляет
Напиши статью и получи скидку!

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

2017-02-21

Все статьи →
Богдан Парфенюк
 
Дана стаття являється кроком до створення табло на основі дисплею 320х240px з контролем температури для лабораторного блока живлення.
 
Тому використовуються саме Термістори. Вони мають мізерну ціну, малий розмір (їх зручно прикріпити до радіатора), доступні, також вони не бояться вологи та працюють в будь яких умовах.
А ще їх можна віддалити від контролера на доволі велику відстань і не перейматися про втрату сигналу. Також, нагадаю що маючи викладений нижче алгоритм роботи та код програми, можна не прикладаючи багато зусиль (переписати лише ініціалізацію ніжок) застосувати цей код до будь-якого контролера stm32. У моєму випадку це stm32f103vet6
 
Терморезистори (термістори) бувають різними за виглядом але всі вони являються резисторами і тому основною їхньою характеристикою є опір (який вони жваво міняють залежно від прикладеної до них температури ). Я використовую резистор 10кОм (це можна визначити помірявши його опір при кімнатній температурі С). Наприклад ще є термістори на 100кОм. 
 
Обладнання:
 
Термістор (терморезистор) - https://arduino-ua.com/prod1737-termistor-tes-3950-100-kom 
Реле, наприклад - https://arduino-ua.com/prod1706-modyl-rele-5v-10a);
 
Схема підключення: 
 
Живлення та підсвітка 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 секунди). Тобто потрібно забезпечити швидкий теплообмін між термістором і обєктом вимірювань. 
 
Успіхів при повторені!
оплата картами Visa и MasterCard