Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Arduino: Делаем самостоятельно датчик температуры

Температура является едва ли не основным измеряемым параметром в промышленной и хозяйственной деятельности. Вместе с тем, мало просматривается экономически обоснованных реализации датчиков температуры даже в диапазоне -50 +50 Град С , столь обычном и привычным для многих применений. Известны на рынке датчики DS18B20 фирмы Dallas , заявленная точность которых около 0,5 Град. Эти датчики были рассчитаны на построение микросетей (MicroLAN) с осуществлением адресного опроса каждого датчика со стороны микроконтроллерного устройства по протоколу 1-Wire. Однако, реализаций таких сетевых решений, когда линию связи делили бы десяток и более таких устройств, практически не встречается. Аналогична ситуация и температурными датчиками протокола I2C фирмы Philips, например такими, как LM75. Все это вызывает определенное недоверие к проработанности схемотехники указанных датчиков температуры. Что же делать, если необходимо иметь несколько точек измерения температуры, опрашиваемых с помощью микроконтроллера?

В эпоху аналоговых электронных термометров нередко можно было встретить схемы с диодными датчиками температуры. Уместно, к примеру, привести схему из справочника радиолюбителя [1 ] . В ней, в качестве датчика температуры, используется обычный кремниевый диод, а точность измерения, при этом, составляет 0,3 Град.

РИС1

Если посмотреть на эту схему внимательно, можно понять, что точность температурного измерения достигается здесь с помощь стабилизации напряжения питания схемы и стабилизацией тока отдельных ее узлов.

В качестве Ардуино устройства используем плату TE-MINI328 , от московской компании «Терраелектроника»  , которая на проверку оказалась совместима с Ардуино серии Nano.https://www.terraelectronica.ru/catalog_info.php?CODE=1041000

Принципиальная схема платы:

https://www.terraelectronica.ru/files/modules/te-mini328/TE-MINI328_V4_sheet.pdf

Практически в каждой реализации платы Ардуино имеется вывод источника опорного напряжения встроенного АЦП. Этот источник имеет уровень напряжения 1,1В у ардуино нано. Для других плат он может быть другим , например 2,54В, что зависит в общем от типа используемого микроконтроллера. Этот источник стабильного напряжения можно использовать как раз для питания температурного датчика, хотя и следует иметь в виду его относительно небольшой выходной ток.

Платформа Ардуино удобна тем, что на ней легко реализуются базовые принципы структурного программирования: наследование, полиморфизм и инкапсуляция. В качестве прародителя целесообразно взять готовую работающую программу (Sketch) и , на ее основе, дополнить необходимым функционалом, который может присутствовать также во встроенном пакете библиотек. В качестве базы в данном примере была использована программа  выложенная в открытый доступ коллегами из фирмы OLIMEX (Болгария) , которая реализует часы реального времени на базе микросхемы PCF8563, являющаяся наиболее дешевой из однокристальных часов реального времени (https://www.olimex.com/Products/Duino/AVR/OLIMEXINO-328/resources/OLIMEXINO_328_MOD_RTC_Demo.zip) [2]. Далее эта программа была дополнена функцией работы с LCD индикатором известной системы команд HD44780 c четырех проводной шиной команд/данных (имеется во встроенной библиотеке Ардуино). Имея в системе этот индикатор, нам легче будут в дальнейшем провести калибровку нашего температурного датчика, и наблюдать за температурой и временем даже не используя монитор последовательного порта, который встроен в среду Ардуино.

При работе с датчиками температуры на основе полупроводникового диода используется тот факт, что падение напряжения на прямо смещенном полупроводниковом диоде линейно зависит от температуры.  Примерный вид такой зависимости для кремниевого диода показан на рис 2.

   
РИС 2

Для изготовления диодного температурного датчика возьмем популярный импортный диод 1N4148, хотя подойдут и аналогичные отечественные, например КД521 или Д220. По нашим наблюдениям хорошей линейностью вольт- температурной характеристикой обладают и многие германиевые диоды, например Д9, у которых падение напряжения при прямом смещении оказывается раза в 2 меньше, чем у кремниевых. Поскольку работать диодный датчик будет в области малых токов, примерно 100 МкА, следует тщательно изолировать проводные выводы с помощью виниловой трубки, торцы которой следует оплавить, например, с помощью промышленного фена или загермитизировать силиконовым герметиком или применив клеевый пистолет. Воспользоваться можно и термоусадочной трубкой соответствующего диаметра. Все это необходимо для того, чтобы вода ни в коем случае не могла попасть внутрь изоляции, что неизбежно привело бы к искажениям  результатов измерений. Также в расчет следует взять и тот факт, что диоды со стеклянным корпусом могут реагировать на попадание света внутрь корпуса, отчего определенным преимуществом будут обладать экземпляры с корпусом, покрытым черной краской (например КД503 Д220 и т.п.) Как указывалось выше для Ардуино Nano уровень опорного напряжения составляет 1,1 В. Поскольку падение напряжения на кремниевом диоде при комнатной температуре и току смещения 100МкА составляет прмерно 500мВ диапазон использования встроенного АЦП микроконтроллера ATMega328 , перекрывает диапазон температур от -50 до +50 Град С, так как падение напряжения на диоде не выйдет за пределы 0—1,1 В. Правда точность измерений в этом случае лучше чем 1 град ожидать не приходится. Для указанной схемы питания датчика, вольт- температурная характеристика будет иметь вид рис2. Т.е. , с повышением температуры, падение напряжения уменьшается. Зависимость температуры Т от напряжения Ud очевидно описывается уравнением вида:

Т=А-В*Ud,  (1.1)

Для нахождения неизвестных коэффициента пропорциональности В и коэффициента смещения А необходимо произвести по крайней мере два калибровочных измерения температуры в точках этой характеристики, отстоящей как можно дальше друг от друга. Измерение Т получают отсчетом калибровочного термометра (в качестве которого можно взять ртутный, спиртовой или электронный)( В моем случае удобно было использовать для калибровки более современный , измеряющий одновременно комнатную и "уличную" температуру фото1 )   Фото 1


Фото 1

, а Ud –есть отсчет АЦП для этой температуры . Получим, в результате, два уравнения вида 1.1, для разных измеренных температур. Разрешая пару этих уравнений относительно неизвестных А и В – получаем нужные нам калибровочные значения, которые будем использовать в программе для перевода отсчета АЦП к значению реальной температуры. Вышесказанное закрепим теперь практическим примером:

1. Помещаем датчик в среду с температурой Т1 (19,9 ГрадС)и записываем значение цифрового отсчета Ud1 (450)

2. Помещаем датчик в среду с температурой Т2 (-2,8 ГрадС) и записываем значение цифрового отсчета Ud2 (503) для этой температуры

3. Получив систему линейных уравнений : Т1=A-B*Ud1 и T2=A-B*Ud2

Разрешая их относительно неизвестных A и B получаем А=0,46, а В=229,5

Теперь несложно вычислить реальную температуру при любом полученном цифровом значении Ud по формуле 1.1. Ниже приведен фрагмент скетча где этот момент явно виден в моменте перехода переменной gett от целочисленного значения к значению с плавающей точкой.

Возникает попутно интересный вопрос: Можно ли эту процедуру вычисления калибровочных коэффициентов А и В провести и без использования Ардуино? Если в распоряжении имеется лишь цифровой тестер, то наверное да. При этом следует учесть, максимальному цифровому отсчету Udmax равному 1024 (для десяти разрядного АЦП AVR микроконтроллера будет соответствовать уровень опорного напряжения (1,1V) . Откуда следует вычислить поправку к показаниям тестера для вычисления соответствующих значений Ud.

Аналогично следует поступить и с другими диодными датчиками температуры (Коэффициенты А и В для каждого экземпляра будут очевидно отличаться!) , если предполагается их использование, например, на соседних каналах аналогового ввода А1, А2, А3, А4, А5. При необходимости расширить группу температурных датчиков выше числа аналоговых каналов у Ардуино (обычно 6) возможно применение аналоговых мультиплексоров.

Ниже дается фрагмент кода настроечных параметров АЦП с уравнением перевода цифрового отсчета падения напряжения на диодном датчике в значение реальной температуры.

/* initialize the library objects */

/* LiquidCrystal lcd(rs, en, d4, d5, d6, d7); */

LiquidCrystal lcd(8 , 9 , 5 , 4 , 7 , 6);

float gett(){

 ADMUX = 0;

 ADMUX |= (1 << REFS1); //Internal 2.56V Voltage Reference with external capacitor on AREF pin

 ADMUX |= (1 << REFS0); //Internal 2.56V Voltage Reference with external capacitor on AREF pin

 ADMUX |= (0 << ADLAR); //Temperature Sensor - 100111

 ADMUX |= (0 << MUX3); //Temperature Sensor - 100111

 ADMUX |= (0 << MUX2); //Temperature Sensor - 100111

 ADMUX |= (0 << MUX1); //Temperature Sensor - 100111

 ADMUX |= (0 << MUX0); //Temperature Sensor - 100111



 //ADC Control and Status Register A

 ADCSRA = 0;

 ADCSRA |= (1 << ADEN); //Enable the ADC

 ADCSRA |= (1 << ADPS2); //ADC Prescaler - 16 (16MHz -> 1MHz)

 ADCSRA |= (1 << ADPS1); //ADC Prescaler - 16 (16MHz -> 1MHz)

 ADCSRA |= (0 << ADPS0); //ADC Prescaler - 16 (16MHz -> 1MHz)

 //ADC Control and Status Register B

 // ADCSRB = 0;

 //ADCSRB |= (1 << MUX5); //Temperature Sensor - 100111



// delay(10);

 delay(10);



ADCSRA |= (1 << ADSC); //Start temperature conversion

while (bit_is_set(ADCSRA, ADSC)); //Wait for conversion to finish

byte low = ADCL;

byte high = ADCH;

ADCL = 0;

ADCH = 0;

int gett = (high << 8) | low; //Result is in kelvin

// return gett;// - 273 + TEMP_OFFSET;

 return (229.5-0.459*gett);

//ADCSRA = 0;

 //return (gett);

}

При работе с другими видами Ардуино необходимо руководствоваться DataSheets применяемого микроконтроллера в части использования АЦП, где последний, необходимо настроить на работу с выбранным каналом аналогового ввода, с использованием встроенного источника опорного напряжении, к которому предполагается подключение блокировочного конденсатора. Кстати такой конденсатор, емкостью 0,1 МкФ необходимо установить также параллельно диодному датчику, т.к. при малых токах диоды имеют свойство формировать «белый шум» из-за которого показания будут искажаться и «прыгать».


РИС 4 (плата Ардуино на схеме не показана)

А как поступать если от от датчика потребуется точность выше  одного градуса, например, для измерения температуры внутри инкубатора или в качестве медицинского термометра ?

В этих случаях неплохим решением может быть последовательное соединение подобных диодов, что неизбежно приведет к увеличению крутизны вольт –температурной характеристики температурного датчика, и , следовательно, разрешению по температуре. Не следует забывать, что в некоторых моделях микроконтроллеров предусмотрена настройка АЦП для работы с дифференциальным входом при одновременном увеличении коэффициента усиления входного усилителя, что может и должно привести передаточную характеристику схемы в желаемую область интереса. При отсутствии подобных опций можно применить внешний дифференциальный усилитель на отдельной специализированной микросхеме (например LM358 и т.п.), который, скорее всего, может быть общим для всех температурных каналов. Можно, наконец, настроить АЦП на работу с напряжением питания (+5В или + 3В)  в качестве опорного , сделав датчик из нескольких, последовательно соединенных кремниевых диодов. Правда, подключать эту «гирлянду» лучше все же не напрямую к питающему напряжению, а лишь к той его части, что подводится к выводу  для питания АЦП и развязана, как правило, индуктивно-емкостным фильтром.

Полностью скетч проекта приведен во вложении. Его реализация привела к идее изготовления универсального измерительного прибора на платформе Ардуино, что достигалось бы сменой датчиковых элементов (плат) с помощью встроенного разъема МРН22-2. См. Фото2,3. и рис4 Часы реального времени понадобятся при превращении такого прибора в логгер измеряемых данных с привязкой ко времени измерений и выгрузки, например, на ПК целью последующего анализа. Показание датчика температуры на индикаторе - в нижней строке справа, а уровня поля - на верхней строке справа. Получается весьма современный прибор, ведь входное сопротивление канала АЦП AVR микроконтроллеров составляет 100Мом, а это почти как у современных мультиметров!

   
ФОТО 2

Фото 3

Ссылки:

1. Чистяков Н.И. Справочная книга радиолюбителя-конструктора М. «Радио и связь» (1990)

2. https://www.olimex.com/Products/Modules/Time/MOD-RTC/open-source-hardware

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
WH1602D-NGG LCD-дисплей1 Поиск в магазине ОтронВ блокнот
DD1 Часы реального времени (RTC)
PCF8563T
1 Поиск в магазине ОтронВ блокнот
кварц1 32,16КГцПоиск в магазине ОтронВ блокнот
VD1 Диод1Д507А1 Поиск в магазине ОтронВ блокнот
VD2-VD4 Выпрямительный диод
1N4148
3 Поиск в магазине ОтронВ блокнот
С1, С1.2 КонденсаторКМ52 10пФПоиск в магазине ОтронВ блокнот
С2, С3,С5 КонденсаторКМ53 0,1мкФПоиск в магазине ОтронВ блокнот
R2 Переменный резисторСП3-16а1 20КПоиск в магазине ОтронВ блокнот
R3 РезисторМЛТ-1251 10КПоиск в магазине ОтронВ блокнот
R4 РезисторМЛТ-1251 100KПоиск в магазине ОтронВ блокнот
R5 РезисторМЛТ-1251 47КПоиск в магазине ОтронВ блокнот
С4 КонденсаторКМ51 1мкФПоиск в магазине ОтронВ блокнот
B БатареяCR20321 Поиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

Теги:

Опубликована: 0 2
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (9) | Я собрал (0) | Подписаться

0
Публикатор #
На форуме автоматически создана тема для обсуждения статьи.
Ответить
0
andro #
Довольно понятно и доходчиво. Только вот интересно, а что если использовать последовательно включённых несколько диодов? Это не расширит диапазон измерений?
Ответить
0

[Автор]
dkg10 #
Конечно, именно так
А как поступать если от от датчика потребуется точность выше одного градуса, например, для измерения температуры внутри инкубатора или в качестве медицинского термометра ?

В этих случаях неплохим решением может быть последовательное соединение подобных диодов, что неизбежно приведет к увеличению крутизны вольт –температурной характеристики температурного датчика, и , следовательно, разрешению по температуре.
Ответить
0
andro #
Упустил...
Ответить
0

[Автор]
dkg10 #
Да мы даже на кт315 делали такие датчики. Соединяли коллектор с базой и цепляли так по штук пять. Нормально все было. Единственно, гирлянду эту куда-то запихать надо было. Использовали гильзы от патронов и эпоксидкой заливали для внешней защиты, так сказать.
Ответить
+1
andro #
Лет десять назад делал термореле для охлаждения процессора компа и там применял датчик из МП41, брал специально германиевый, так как у них температурный коэффициент выше. Но из за большой массы инерция тоже выше.
Отредактирован 25.01.2018 11:31
Ответить
0

[Автор]
dkg10 #
Да нет. Померил на германиевом (ГТ308) через 51К от 4В чувствительность примерно 1,4 мВ/град. Для кремния (кд518) , при тех же условиях - чуть более - 1,6 мВ/град. Но кремний лучше не только большей линейностью характеристики, но и возможностью работы в более широком диапазоне температур (до +120 Град), тогда как германий едва ли до +80 Град
Ответить
0
Александр #
Очень слабенько. Эдакая ретро-схемотехника. А заявления про 1-wire и I2C датчики это вообще ахтунг. Автору следовало отказаться от таких категоричных заявлений. Ему еще есть куда расти
Ответить
0

[Автор]
dkg10 #
Нам всем есть куда расти. А публикаций то чего - то не видно c гирляндами датчиков типа 1-ware . Вот я и высказываю предположение. Если бы все было так гладко, то оно бы и проявлялось явно. А техническое решение в статье выгодно тем, что позволяет экономить ресурс памяти Arduino т.к. не нужны библиотеки по работе с 1-wire и I2C
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется сила тока?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Модуль измерения тока на ACS712 (30А)
Модуль измерения тока на ACS712 (30А)
Квадрокоптер Syma X11 Мультиметр Mastech MS8239C
вверх