Простое устройство контролирования температуры

warning: call_user_func_array() expects parameter 1 to be a valid callback, function 'nodereference_autocomplete_access' not found or invalid function name in /var/www/avtomatchik/data/www/avtomatchik.com/includes/menu.inc on line 454.

Страницы: [1][2] Следующая

В данной статье описано недорогое простое устройство контролирования температуры.

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

В качестве микроконтроллера используется чрезвычайно простой и доступный микроконтроллер  PIC12F675 фирмы Microchip. Оптимальным является датчик температуры DS1820 от фирмы Dallas Semiconductor, работающий по двухпроводному интерфейсу 1-Wire. В качестве теплоэлектронагревателя (ТЭНа) может использоваться обычная электрическая лампа накаливания.

Алгоритм работы программы температурного управления чрезвычайно прост: микроконтроллер принимает данные от датчика температуры, сравнивает их с заданным температурным диапазоном и подает сигнал на коммутирование нагрузки. Высоковольтная нагрузка коммутируется от реле, которое запитывается от 12В через управляемый микроконтроллером биполярный транзистор.

Алгоритм работы микроконтроллера содержит обработку гистерезиса. В данном случае верхняя граница температурного режима — 35 градусов по Цельсию, нижняя — 25 градусов по Цельсию. При снижении температуры ниже  25 градусов включается нагрузка — ТЭН. Как только температура объекта управления превышает верхнюю температурную границу — 35 градусов, ТЭН отключается. Теперь ТЭН включится только тогда, когда тмпературный датчик DS1820 вновь сообщит о снижении температуры ниже 25 градусов.

 

 

Вся красота данного решения заключается в том, что представленный программный код микроконтроллера можно портировать на другие PIC микроконтроллеры, в т.ч. PIC16F84, PIC16F877, т. к. они имеют одинаковую систему команд и архитектуру. Всё, что требуется для работы кода на других микроконтроллерах — это изменить процедуру инициализации. И переназначить в макросах выводы DS1820 и DSTRIS в соответствии с регистрами данного контроллера. Также нужно обратить внимание на то, что программный код написан для частоты кварцевого генератора, используемого в устройстве, на 4МГц. Поэтому при использовании другого генератора должны быть переопределены программные задержки в реализации интерфейса 1-Wire.

Данный код можно без труда переделать для устройства, нагрузкой в котором является, скажем, вентилятор или паяльник :). Не следует забывать о том, что датчик температуры DS1820  работает в температурном диапазоне от -15 до +85. Его преимущество в том, что погрешность температуры составляет 0,5  градуса по Цельсию, и работает в 1-Wire интерфейсе, где для сопряжения с микроконтроллером нужны всего две линии (GND и In-Out).

Программный код микроконтроллера приведен ниже:

list r=dec, x=On, p=pic12f675 ;включаем полный текст макросов
#include <P12F675.INC>
; Настройка слова конфигурации микроконтроллера производится в MPLAB.
; Использование кварцевого резонатора на 4МГц.
ERRORLEVEL 2 ;Вывод только ошибок

#DEFINE DS1820         GPIO,GP0 ;- вход-выход для DS1820,
#DEFINE DSTRIS         TRISIO,GP0
#DEFINE LOAD        GPIO,GP1
;Нижний и верхний границы диапазона регулирования температуры.
#DEFINE LOW_VALUE 25    ;25 градусов
#DEFINE HIGH_VALUE 35    ;35 градусов
;-------------------------------------------------------------
;  Распиновка:
;
;                                           --__--
;                                   +5V---1|      |8--земля
;                      Кварц. резонатор---2|      |7-<>--вход-выход для DS1820 (GPIO0)
;                      Кварц. резонатор---3|      |6->--управление нагрузкой (GPIO1)
;                                (MCLR)---4|      |5--- (GPIO2)
;                                           ------
;
;
;-------------------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;макрос выбора банка. Аргумент n - номер банка
bsel macro n

if n==0        ;выбираем Bank 0

bcf STATUS,RP0

endif
if n==1        ;выбираем Bank 1

bsf STATUS,RP0

endif

endm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;-------------------------------------------------------------------------

org    0x3FF ;Последний адрес памяти программ.
goto START ;На случай выхода счетчика команд за пределы программы.
org 0x00 ;Вектор сброса микроконтроллера.
goto START ;начало выполнения программы после включения питания

cblock 0x20 ;Определение блока переменных начиная с адреса 0x20 в памяти данных

temp0,
temp1,
temp2,
temp3,
Temperature_L,
Temperature_H,
DSTemp,
Count

endc ;Окончание определения блока констант.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

START

;Инициализируем I/O-порты
;После сброса микроконтроллера каналы настроены на вход
bsel 0 ;Выбираем банк 0
clrf GPIO ;Очищаем, так как после сброса микроконтроллера, GPIO имеет случайное состояние
movlw b'111'
movwf CMCON ;Выключаем компаратор !
bsel 1            ;Выбираем банк 1
clrf ANSEL ;Отключаем режим аналоговых входов GPIO
bcf DSTRIS
bcf TRISIO,1
bsel 0
clrf temp0
clrf temp1
clrf temp2
bsf DS1820 ;Устанавливаем высокий уровень (заряжаем DS1820)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

LOOP

call GETTemperature
btfsc Temperature_H,7        ;Пропускаем след. команду если температура положительна.
goto LOOP ;Возвращаемся к очередному сканированию датчика, если температура отрицательна (не входит в условия эксплуатации).
bcf STATUS,C
rrf Temperature_L,f ;Сдвигаем содержимое регистра вправо на 1 (получаем целую часть).

movlw LOW_VALUE
subwf Temperature_L,W ;Вычитаем LOW_VALUE из Temperature_L
btfsc STATUS,C
goto IS_LESS_THEN_LOW_VALUE ;Если STATUS,C равен 1 (Temperature_L меньше LOW_VALUE)
;Temperature_L больше LOW_VALUE
movlw HIGH_VALUE ;Если STATUS,C равен 0 (Temperature_L больше LOW_VALUE) сравниваем с верхней границей.
subwf Temperature_L,W ;Вычитаем HIGH_VALUE из Temperature_L
btfss STATUS,C
goto IS_LESS_THEN_LOW_VALUE ;Если STATUS,C равен 1 (Temperature_L меньше HIGH_VALUE), то включаем нагрузку (первично)
;Температура входит в диапазон

;Основные циклы работы

IS_GREATHER_THEN_HIGH_VALUE ;Если температура входит в диапазон, то ждем пока она не снизится до LOW_VALUE.

bsel 0                        ;Переходим в банк памяти 0
bcf LOAD ;ВЫключаем нагрузку.
call GETTemperature ;Снова опрашиваем датчик температуры.
btfsc Temperature_H,7        ;Пропускаем след. команду если температура положительна.
goto LOOP ;Возвращаемся к очередному сканированию датчика, если температура отрицательна (не входит в условия эксплуатации).
;Нагрузка ВЫключена, ждем понижения температуры ниже LOW_VALUE, для её включения (гистерезис).
bcf STATUS,C
rrf Temperature_L,f ;Сдвигаем содержимое регистра вправо на 1 (получаем целую часть).
movlw LOW_VALUE ;Сравниваем с нижней границей.
subwf Temperature_L,W ;Вычитаем LOW_VALUE из Temperature_L
btfss STATUS,C
goto IS_LESS_THEN_LOW_VALUE ;Если STATUS,C равен 1 (Temperature_L меньше HIGH_VALUE), то включаем нагрузку (первично)
goto IS_GREATHER_THEN_HIGH_VALUE ;Продолжаем ожидать снижения температуры ниже LOW_VALUE

IS_LESS_THEN_LOW_VALUE

bsel 0                        ;Переходим в банк памяти 0
bsf LOAD ;Включаем нагрузку.
call GETTemperature ;Снова опрашиваем датчик температуры.
btfsc Temperature_H,7 ;Пропускаем след. команду если температура положительна.
goto LOOP ;Возвращаемся к очередному сканированию датчика, если температура отрицательна (не входит в условия эксплуатации).
;Нагрузка Включена, ждем повышения температуры выше HIGH_VALUE, для её вЫключения (гистерезис).
bcf STATUS,C
rrf Temperature_L,f ;Сдвигаем содержимое регистра вправо на 1 (получаем целую часть).
movlw HIGH_VALUE ;Сравниваем с верхней границей.
subwf Temperature_L,W ;Вычитаем HIGH_VALUE из Temperature_L
btfsc STATUS,C
goto IS_GREATHER_THEN_HIGH_VALUE ;Если STATUS,C равен 1 (Temperature_L больше HIGH_VALUE)
goto IS_LESS_THEN_LOW_VALUE ;Продолжаем ожидать повышения температуры выше HIGH_VALUE

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

#include <DS1820.inc>;Подключаем файл с подпрограммами для управления DS1820
End

 


 


 

 

Страницы: [1][2] Следующая




В данной статье описано недорогое простое устройство контролирования температуры.

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

В качестве микроконтроллера используется чрезвычайно простой и доступный микроконтроллер PIC12F675 фирмы Microchip. Оптимальным является датчик температуры DS1820 от фирмы Dallas Semiconductor, работающий по двухпроводному интерфейсу 1-Wire. В качестве теплоэлектронагревателя (ТЭНа) может использоваться обычная электрическая лампа накаливания.

Алгоритм работы программы температурного управления чрезвычайно прост: микроконтроллер принимает данные от датчика температуры, сравнивает их с заданным температурным диапазоном и подает сигнал на коммутирование нагрузки. Высоковольтная нагрузка коммутируется от реле, которое запитывается от 12В через управляемый микроконтроллером биполярный транзистор.

Алгоритм работы микроконтроллера содержит обработку гистерезиса. В данном случае верхняя граница температурного режима — 35 градусов по Цельсию, нижняя — 25 градусов по Цельсию. При снижении температуры ниже 25 градусов включается нагрузка — ТЭН. Как только температура объекта управления превышает верхнюю температурную границу — 35 градусов, ТЭН отключается. Теперь ТЭН включится только тогда, когда тмпературный датчик DS1820 вновь сообщит о снижении температуры ниже 25 градусов.

Вся красота данного решения заключается в том, что представленный программный код микроконтроллера можно портировать на другие PIC микроконтроллеры, в т.ч. PIC16F84, PIC126F877, т. к. они имеют одинаковую систему команд и архитектуру. Всё, что требуется для работы кода на других микроконтроллерах — это изменить процедуру инициализации. И переназначить в макросах выводы DS1820 и DSTRIS в соответствии с регистрами данного контроллера. Также нужно обратить внимание на то, что программный код написан для частоты кварцевого генератора, используемого в устройстве, на 4МГц. Поэтому при использовании другого генератора должны быть переопределены программные задержки в реализации интерфейса 1-Wire.

Данный код можно без труда переделать для устройства, нагрузкой в котором является, скажем, вентилятор или паяльник :). Не следует забывать о том, что датчик температуры DS1820 работает в температурном диапазоне от -15 до +85. Его преимущество в том, что погрешность температуры составляет 0,5 градуса по Цельсию, и работает в 1-Wire интерфейсе, где для сопряжения с микроконтроллером нужны всего две линии (GND и In-Out).

Программный код микроконтроллера приведен ниже:

Программный код модуля работы с датчиком DS1820 приведен ниже:

Так выглядит окно MPLAB:

Скачать код проекта на MPASM (assembler). Сам проект создан в MPLAB.

Скачать файл трассировки печатной платы в формате Layout.