Измерительные устройства

Простой термометр на микроконтроллере PIC12F629 с батарейным питанием.

TicPIC1Общее количество конструкций термометров на микроконтроллерах посчитать сложно. Каждый автор стремиться привнести что-то свое в этот простой прибор. В итоге увеличивается функциональность, точность и область практического применения электронных температурных измерителей. Ниже описан еще один вариант термометра, главными особенностями которого стали предельная простота конструкции и автономное питание.

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

Принципиальная схема и конструкция

В основе принципиальной схемы измерителя лежит микроконтроллер PIC12F629 от Microchip. Данный процессор выпускается в корпусах с 8 выводами и способен работать при напряжении питания от 2 до 5.5В. К его достоинством можно отнести встроенный генератор тактовой частоты и режим пониженного энергопотребления. Объем внутренней Flash-памяти программ - 1Кб позволяет легко реализовать опрос датчика и преобразование температуры.

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

Датчиком температуры выбран термометр с цифровым выходом MCP9800, опять же от Microchip.Эта микросхема интересна, прежде всего тем, что выпускается в компактном корпусе SOT-23. Использование  шины I2C делает ее подключение к микроконтроллеру элементарным. Опять же наличие спящего режима повышает привлекательность применения MCP9800 для систем с батарейным питанием.

Отображение показаний температуры производится на жидкокристаллическом индикаторе TIC3321. Он не требует подсветки, вследствие чего потребляет минимальный ток. Для передачи данных в индикатор необходимо подключить всего три линии.  Широкий температурный диапазон работы от -40 до +80ºС позволяет строить не только комнатные, но и уличные модели приборов.

Печатная плата Вид со стороны элементов
Печатная плата Вид со стороны элементов

Конструктивно термометр выполнен на односторонней печатной плате, которая по длине и ширине не превышает размеры индикатора. Все элементы, в том числе и микроконтроллер, применены в корпусах для поверхностного монтажа. Для установки батареи типа CR2032 использован специальный батарейный модуль, также в SMD варианте.

Алгоритм работы и программа

Часть характеристик термометра, связанная с энергопотреблением, находится в зависимости от алгоритма работы управляющей программы. Первоначально, в алгоритм не были включены мероприятия по энергосбережению. Итог не заставил себя ждать. Элемент питания CR2032 проработал ровно две недели, после чего термометр отключился. Для увеличения срока автономной работы потребовалось реализовать периодический режим опроса и индикации с переводом микроконтроллера и датчика в энергосберегающий режим между отдельными измерениями, а также оптимизацию всего алгоритма.

Энергопотребление микроконтроллера PIC12F629 в режиме сна составляет 1нА (наноАмпер) при напряжении питания 2В. Еще может 300нА потреблять сторожевой таймер. При напряжении питания 3.3В эти значения будут несколько выше. Потребляемый ток в рабочем режиме сильно зависит от частоты генератора, напряжения питания и окружающей температуры. Согласно документации он может превышать 100 микроАмпер. В итоге разница энергопотребления в спящем и рабочем режиме превышает 1000 раз. Соответственно для снижения потребляемого тока желательно чтобы микроконтроллер большую часть времени находился в режиме сна. Выход из этого режима возможен при подаче внешнего сигнала, либо по сторожевому таймеру. Последний вариант наилучшим образом подходит для реализации в данной конструкции.

Перевод микроконтроллера PIC12 в режим сна делается очень просто. Для этого достаточно подать команду Sleep. Несколько сложнее организовать выход. Главная проблема встроенного сторожевого таймера WDT – малое время работы. В отличие от STM32, где спящий режим может длиться годами, в PIC12F629 сторожевой таймер срабатывает через несколько секунд, даже с полностью включенным предделителем. Соответственно в программе приняты меры по увеличению времени нахождения в режиме пониженного потребления. Особенность срабатывания сторожевого таймера в режиме сна заключается в том, что он не сбрасывает микроконтроллер, а запускает исполнение программы со следующей, после sleep, команды. Так как сохраняются все состояния регистров, допустимо применить дополнительный программный счетчик пробуждений, который позволяет увеличить общее время нахождения системы в режиме энергосбережения.

Датчик температуры MCP9800 также имеет возможность работы с пониженным энергопотреблением. Для его перевода в этот режим необходимо установить бит однократного измерения в регистре управления датчиком. При этом шина I2C остается в работе. Запуск измерения выполняется сбросом бит режима сна. После этого некоторое время будет производиться преобразование температуры, длящееся до 250 мсек при высоком разрешении датчика. На это время, опять же, микроконтроллер можно перевести в спящий режим.

В итоге работа системы построена следующим образом: после инициализации микроконтроллера и датчика запускается программный счетчик циклов спящего режима и микроконтроллер переводится в режим сна. Периодически по таймеру WDT происходит возобновление работы, с уменьшением значения счетчика и повторным переводом в спящий режим. В момент, когда остается последняя итерация цикла, запускается измерение температуры. После обнуления счетчика циклов выполняется считывание температуры, ее обработка и вывод на индикатор. Затем цикл сна начинается заново.

Файлы проекта.

 Исходный текст управляющей программы

Управляющая программа термометра на языке mikroPascal
program TicPic;           
var rm,rs,slp:byte; port_array: array[3] of Byte; din: sbit at gpio.1; dclc: sbit at gpio.0; load: sbit at gpio.2; Soft_I2C_Scl : sbit at GP4_bit; Soft_I2C_Sda : sbit at GP5_bit; Soft_I2C_Scl_Direction : sbit at TRISIO4_bit; Soft_I2C_Sda_Direction : sbit at TRISIO5_bit;  {преобразование чисел в код индикатора}
function mask(num: byte): byte;
begin num:=num and %00001111; case num of //egfabcdp 0 : result:= %10111110; 1 : result:= %00001100; 2 : result:= %11011010; 3 : result:= %01011110; 4 : result:= %01101100; 5 : result:= %01110110; 6 : result:= %11110110; 7 : result:= %00011100; 8 : result:= %11111110; 9 : result:= %01111110; 10 : result:= %01000000; 11 : result:= %01000000; 12 : result:= %01000000; 13 : result:= %01000000; 14 : result:= %01000000; 15 : result:= %01000000; end; //case end
end;//~mask  {Запись цифр в индикатор}
procedure ShowDig(dig:byte);
var i1:byte;
begin for i1:=1 to 8 do begin if dig.0=1 then din:=1 else din:=0; dig:=dig shr 1; dclc:=1; nop; nop; dclc:=0; din:=0; end;
end; //~ShowDig  {Чтение температуры из MCP9800}
procedure Read_T(); begin clrwdt; {Чтение температуры} Soft_I2C_Start(); Soft_I2C_Write(0x90); Soft_I2C_Write(0x00); //mcp9800 Soft_I2C_Start(); Soft_I2C_Write(0x91); rm := Soft_I2C_Read(1); rs := Soft_I2C_Read(0); Soft_I2C_Stop(); {Перевод датчика в спящий режим} Soft_I2C_Start(); Soft_I2C_Write(0x90); Soft_I2C_Write(0x01); //mcp9800 Soft_I2C_Write(%01100001); //mcp9800 Soft_I2C_Stop(); end; //~ReadT  {Преобразование температуры}
procedure Calc_Temperature(temp1,temp2: byte;);
var i2,temp:byte; tmp:word;
begin if (temp1 and $80) = 0x80 then begin temp1 := not temp1 + 1; port_array[0]:=%01000000; port_array[1]:=mask((temp1 / 10) mod 10); port_array[2]:=mask(temp1 mod 10); end else begin temp:=temp2 shr 4; port_array[0]:=mask((temp1 / 10) mod 10); port_array[1]:=mask(temp1 mod 10)+1; tmp:=0; i2:=0; while i2 < temp do begin tmp:=tmp+625; i2:=i2+1; end; port_array[2]:=mask((tmp /1000) mod 10); end;
end; //~Calc_Temperature  begin { Main program } cmcon:=7; trisio:=0; gpio:=0; option_reg:=%00001111; //Включение предделителя к WDT Soft_I2C_Init(); Soft_I2C_Start(); Soft_I2C_Write(0x90); Soft_I2C_Write(0x01); //mcp9800 Soft_I2C_Write(%01100001); //mcp9800 Soft_I2C_Stop(); while 1 do begin clrwdt; Read_T(); Calc_Temperature(rm,rs); ShowDig(port_array[2]); ShowDig(port_array[1]); dclc:=1; nop; nop; dclc:=0; ShowDig(port_array[0]); load:=1; nop; nop; load:=0; slp:=5; while slp>0 do begin if slp=1 then begin // Однократное измерение температуры Soft_I2C_Start(); Soft_I2C_Write(0x90); Soft_I2C_Write(0x01); Soft_I2C_Write(%11100001); Soft_I2C_Stop(); end; sleep; //Переход в спящий режим nop; slp:=slp-1; end; end;
end.

Еще по теме:

Термометр на микроконтроллере PIC12F629

Термометр с линейной шкалой

Терморегулятор на микроконтроллере PIC16F676

 

Добавить комментарий