Температура является едва ли не основным измеряемым параметром в промышленной и хозяйственной деятельности. Вместе с тем, мало просматривается экономически обоснованных реализации датчиков температуры даже в диапазоне -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 4-х проводной шиной команд/данных (имеется во встроенной библиотеке Ардуино). Имея в системе этот индикатор, нам легче будут в дальнейшем провести калибровку нашего температурного датчика, и наблюдать за температурой и временем даже не используя монитор последовательного порта, который встроен в среду Ардуино.
При работе с датчиками температуры на основе полупроводникового диода используется тот факт, что падение напряжения на прямо смещенном полупроводниковом диоде линейно зависит от температуры. Примерный вид такой зависимости для кремниевого диода показан на рис 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)PCF8563T1
кварц1
32,16КГцVD1
Диод1Д507А1
VD2-VD4
Выпрямительный диод1N41483
С1, С1.2
КонденсаторКМ52
10пФС2, С3,С5
КонденсаторКМ53
0,1мкФR2
Переменный резисторСП3-16а1
20КR3
РезисторМЛТ-1251
10КR4
РезисторМЛТ-1251
100KR5
РезисторМЛТ-1251
47КС4
КонденсаторКМ51
1мкФB
БатареяCR20321
Добавить все
Скачать список элементов (PDF)
Прикрепленные файлы: