Микроконтроллеры в домашних условиях
 

Модуль управления бойлером.

Общее описание

Схема устройства

Прошивка

Фото

Общее описание

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

С ручным управлением все понятно - хозяин сам определяет, какая ему нужна температура, и осуществляет включение или отключение всего бойлера, либо отдельных позиций мощности (ТЭНов). В этом случае налицо некоторые неудобства: необходимость постоянного (до нескольких раз в сутки) вмешательства в работу системы, а если для этого еще нужно ходить в подсобное помещение (что чаще всего и бывает), это несколько утомляет. Кроме того, на период отопительного сезона необходимо постоянно находиться дома, в противном случае по приезду есть возможность попасть либо в сауну, либо в холодильник.

Кстати говоря, у меня поначалу была именно такая ситуация с той лишь разницей, что я вывел отдельный пульт, осуществлявший управление и контроль включенного состояния отдельных ТЭНов (схема выполнена на реле) в прихожую. Это избавило домочадцев от неоднократных путешествий в котельное помещение, путь куда лежал через холодную веранду, что являлось (особенно ночью) закалкой души и тела.

Совсем по другому обстоит дело при внедрении средств автоматики в процесс управления. Здесь существует, как минимум, два варианта. Первый заключается в применении датчиков температуры с переключателем на основе биметаллической пластины. При этом регулируемым параметром является температура воды, а переключаются одновременно все ТЭНы бойлера. Подобными устройствами, как правило, оснащаются все бойлеры заводского исполнения. Недостатком такой системы регулирования является большой диапазон между максимальной и минимальной температурой воздуха и необходимость частой корректировки регулятора среднего значения, особенно при колебаниях температуры за бортом. Такая регулировка подходит для помещений, не критичных к широкому разбросу температур (например, гаражи, подсобные помещения), либо для нагревания воды в бытовых целях.

Вторым вариантом является контроль температуры непосредственно воздуха в помещении и выдачи управляющих воздействий на нагревательные элементы. Здесь есть варианты в использовании элементной базы, но мы остановимся на электронной системе - все-таки с контроллерами работаем!

За основу модуля управления бойлером взят мой любимый PIC16F628A, в качестве датчика используется DS1821 (работает в режиме измерения температуры). Устройство имеет следующие возможности:

Наверх

Схема устройства

Схема модуля управления бойлером

Рис. 1. Принципиальная схема

Схема собрана на базе контроллера PIC16F628A. В качестве датчика используется DS1821. Он устанавливается в середине квартиры на высоте не более 1,5 м от пола - вобщем, в месте, где воздух из всех комнат смешивается - чтобы измерять усредненную температуру. Соединение датчика с модулем выполнено экранированным кабелем, проложенным в общем кабель-канале с силовыми проводами. Использованием экранированного кабеля для связи с датчиком, как и для прокладки питания 12 В я пытался решить проблему помехоустойчивости устройства. Контроллер сбрасывался при коммутации мощных потребителей в доме (холодильника, электропечи, чайника и т. д.). Однако, такое решение не очень помогло и в итоге я решил просто сохранять ключевые регистры в EEPROM и использовать сторожевой таймер на случай зависания программы. Хочется сказать, что впоследствии я узнал о других способах повышения помехоустойчивости еще на этапе проектирования печатной платы и с успехом применял их в других устройствах, однако данный вариант модуля работает у меня по сей день в первозданном виде.

На микросхеме КРЕН5А выполнен стабилизатор напряжения.

Для отображения информации используется семисегментный индикатор с общим катодом. Схема включения стандартная. В данном проекте используется динамическая индикация.

Кнопка SB служит для настройки средней температуры.

Управление силовой нагрузкой осуществляется через два вывода порта А (0 и 1). Через оптронную развязку (MOC3041) включены три пускателя (взяты штатные из этого же бойлера). Таким образом, получается трехступенчатое включение ТЭНов: при включении А1 работает контактор К1, при включении А0 - контакторы К2 и К3, при включении обоих выходов - все три контактора. Светодиоды HL1 и HL2 включены в цепи управления последовательно и индицируют включенное состояние соответствующих выходов порта.

Монтажную плату устройства в формате Sprint-Layout 5.0 скачиваем здесь.

Наверх

Прошивка

Файлы проекта в среде MPLab IDE можно скачать здесь.

Исходный код с описанием алгоритмов работы приведен ниже.

Микроконтроллер PIC16F628A использует внутренний осциллятор 4 МГц. Сторожевой таймер включен на максимальный предделитель.

Динамическая индикация выполняется в основном цикле программы с выдержкой времени на таймере 0 с периодом 256 мксек.

Блок-схема алгоритма головной программы приведена на рис. 2

Блок-схема алгоритма головной программы

Рис. 2

При помощи счетчика COUNT_DIG происходит установка и выбор активного разряда индикации. Соответствие значения счетчика и активного разряда следующее: счетчик 0 - разряд 1, счетчик 1 - разряд 2, счетчик 2 - разряд 3. Нумерация разрядов индикатора справа налево (схема на рис. 1). В данном проекте 3 разряд не используется (однако, в программе он учтен).

Регистры LSD и MSD используются для хранения цифры соответственно младшего и старшего разрядов индикации в двоично-десятичном виде (заносятся туда при выполнении подпрограммы BinBSD). В подпрограмме CASE_DIG данные из двоично-десятичного вида преобразуются к виду для побитного отображения на сегментах индикатора.

В подпрограмме CHECK_ERR происходит проверка битов ошибки связи с датчиком и записи в EEPROM и при наличии ошибки происходит замена подготовленных данных на данные отображения ошибки (в регистре SHOW_DIG).

Подпрограмма SHOW выставляет выходы порта для управления сегментами в соответствии с битами регистра SHOW_DIG, при этом сегмент a соответствует биту 0, сегмент b - биту 1 и т. д.

Далее выполняется DISCHARGE, где в зависимости от значения счетчика COUNT_DIG включается соответствующий выход порта, управляющий схемой включения разряда индикатора.

Счетчики COUNT_TEMP и COUNT_TEMP_H используются для отсчета циклов основной программы между вызовом подпрограмм связи с термодатчиком. Приращение счетчика COUNT_TEMP происходит в каждом цикле основной программы (период - 256 мксек), приращение COUNT_TEMP_H происходит при достижении COUNT_TEMP значения 128 (период - 32,8 мсек). Таким образом, ветка алгоритма, в которой выполняется одно из действий - отправка команды на преобразование температуры (процедура CONV), либо считывание температуры (процедура TRANSACT) - исполняется с периодом около 2 сек. Поэтому температура считывается с датчика с интервалом 4 сек. Процедуры CONV и TRANSACT пришлось разнести в разные ветки, так как при совместном исполнении (предполагалось сначала в случае готовности данных считывать температуру, затем сразу давать команду датчику на следующее преобразование) требуется около 7 мсек. И хотя они и выполняются в ветке, где нет задержки таймером, все равно наблюдалось заметное моргание индикатора. После разделения моргание исчезло. Кроме того, отпала необходимость проверять готовность данных в датчике, так как время на преобразование около 1 секунды (заявлено в даташите), мы же делаем интервал между преобразованием и считыванием 2 секунды.

Кроме вышеуказанного, значение счетчика COUNT_TEMP_H используется для мигания индикатора при отображении средней температуры (регистр MIDDLE_TEMP) и счетчика циклов неизменного состояния выходов управления нагрузкой (регистр POWER_COUNT).

Обмен данными с датчиком по шине 1-WIRE, осуществляемый в процедурах CONV и TRANSACT, выполняется в подпрограммах READ и WRITE. Организация циклов записи и чтения байта данных с обязательной предварительной инициализацией происходит с помощью подпрограмм соответственно в WR_BYTE, R_BYTE и INIT. В INIT, также, происходит проверка наличия ответа датчика, и в случае отсутствия ответа последующие WR_BYTE или R_BYTE не выполняются.

Кроме вышеуказанных функций в подпрограмме CONV выполняется слудующее: подпрограмма BinBCD преобразует считанное значение температуры (либо регистр MIDDLE_TEMP или POWER_COUNT при наличии соответствующего флага) в двоично-десятичное с записью в регистры LSD и MSD для последующего отображения; подпрограмма BUTTON_CHECK проверки и обработки нажатия кнопки; подпрограмма SET_CURR_TEMP обработки считанного значения температуры; подпрограмма FIR_CH_TEMP для первичной установки выходов управления нагрузкой в соответствии с сохраненными в EEPROM значениями.

Логика работы кнопки (подпрограмма BUTTON_CHECK - период исполнения около 4 сек) следующая. При первом нажатии начинает мигающим отображаться значение средней температуры. Если кнопку удерживать в нажатом состоянии более 4 секунд (до следующего выполнения BUTTON_CHECK), то начнет отображаться мигающим светом значение регистра POWER_COUNT (это сделано только для наблюдения за работой модуля). В случае отпускания кнопки после начала отображения средней температуры, либо POWER_COUNT и прошествии 12 секунд (трехкратное исполнение процедуры BUTTON_CHECK) индикация возвращается в первоначальное состояние - отображение текущей температуры ровным светом.

Если после отпускания кнопки в режиме отображения средней температуры выждать чуть более 4 секунд (до следующего выполнения BUTTON_CHECK, где зафиксируется отпускание кнопки) и нажать кнопку вновь, то на время удержания ее в нажатом состоянии каждые 4 секунды будет циклически с возвратом к начальному значению изменяться средняя температура от 21 до 23. При появлении нужного числа кнопку необходимо отпустить - значение сохранится.

Подпрограмма SET_CURR_TEMP выполняется, также, 1 раз в 4 секунды. С помощью счетчика C_SAVE_TEMP осуществляется проверка установившегося значения температуры. При каждом выполнении SET_CURR_TEMP происходит следующее. Вначале (при C_SAVE_TEMP равном 0) происходит запись считанного значения температуры в буфер TEMP_BUFF. При каждом последующем выполнении SET_CURR_TEMP считанное значение сравнивается с TEMP_BUFF. Если значения равны, то инкрементируется счетчик C_SAVE_TEMP, если не равны - счетчик C_SAVE_TEMP сбрасывается и накопление происходит с новым значением TEMP_BUFF.

По достижении счетчиком числа 100 (около 6,6 мин неизменной измеренной температуры) происходит проверка равенства значения в буфере TEMP_BUFF и значения текущей температуры в CURRENT_TEMP с последующим сбросом счетчика C_SAVE_TEMP для выполнения следующего накопления.

Если TEMP_BUFF окажется не равным CURRENT_TEMP, значение текущей температуры (CURRENT_TEMP) сохраняется в регистре предыдущей температуры (PREV_TEMP), а из буфера TEMP_BUFF - в CURRENT_TEMP. После этого вызывается процедура обработки изменения температуры ON_T_CHANGE.

В случае равенства значений TEMP_BUFF и CURRENT_TEMP инкрементируется значение счетчика POWER_COUNT, после чего выполняется процедура обработки его изменения ON_POWER_COUNT_CHANGE. POWER_COUNT инкрементируется только до значения 99 (трехзначное значение не отобразится на индикаторе). Сброс счетчика осуществляется в процедуре ON_T_CHANGE (при изменении температуры). Таким образом, POWER_COUNT показывает количество 6-минутных циклов с одинаковой установившейся температурой.

Блок-схема подпрограммы ON_T_CHANGE показана на рис. 3. Здесь применены следующие обозначения: Ттек - текущая температура (регистр CURRENT_TEMP); Тср - средняя температура (регистр MIDDLE_TEMP); Тпред - предыдущая температура (регистр PREV_TEMP).

Блок-схема алгоритма обработки изменения температуры

Рис. 3

В регистры H_POWER_COUNT или L_POWER_COUNT заносится значение POWER_COUNT при соответственно превышении либо понижении установившейся текущей температурой ее среднего значения. Аналогично значение регистра POWER (состояние выходов управления нагрузкой) заносится в H_POWER или L_POWER при повышении либо понижении относительно среднего значения.

Флаги в регистре POWER_FLAGS используются для операций со ступенями мощности: Poff - отключение всех трех ступеней, Pon - включение всех трех ступеней, Pup - повышение на одну ступень (если POWER не равно 3), Pdn - понижение на одну ступень (если POWER не равно 0).

Как видно из алгоритма, при повышении температуры на один градус выше среднего все ступени нагрузки отключаются, а при понижении на один градус ниже среднего все ступени включаются. Кроме того, после остывания (когда все ступени отключены) до средней температуры происходит включение одного ТЭНа, а после нагрева (когда все ступени включены) до среднего значения происходит отключение одного ТЭНа. Таким образом, получаем регулировку температуры + - 1 градус относительно заданного среднего значения.

Но это еще не все. Хотелось бы, чтобы система, по возможности, сама определяла когда повысить или понизить мощность с тем чтобы как можно реже выходить к крайним пределам регулирования. Для этой цели и были введены регистры H_POWER_COUNT, L_POWER_COUNT и H_POWER, L_POWER. В них сохраняется состояние системы (количество циклов неизменной температуры - POWER_COUNT, состояние выходов - POWER) на момент отклонения температуры от среднего значения в большую или меньшую сторону.

В подпрограмме обработки изменения POWER_COUNT ON_POWER_COUNT_CHANGE, алгоритм которой приведен на рис. 4, происходит проверка превышения счетчиком сохраненного значения с последующей (в случае превышения) корректировкой включенных ступеней мощности. Кроме этого, если сохраненное состояние выходов равно текущему и POWER_COUNT достигает соответствующее сохраненное значение, то происходит увеличение этого сохраненного значения. Этим приемом достигается более плавная регулировка температуры. Система как бы стремится предугадать отклонение температуры от среднего значения и, чтобы избежать этого, корректирует мощность нагрузки.

Блок-схема алгоритма обработки изменения POWER_COUNT

Рис. 4

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

Сохраняются следующие регистры: MIDDLE_TEMP - средняя температура (адрес 00h), POWER - состояние выходов управления нагрузкой (адрес 01h), PREV_TEMP - предыдущее значение температуры (адрес 02h), POWER_COUNT - счетчик количества 6-минутных циклов с установившейся температурой (адрес 03h), H_POWER_COUNT (адрес 04h), L_POWER_COUNT (адрес 05h), H_POWER (адрес 06h), L_POWER (адрес 07h).

При общей характеристике возможностей данного модуля хочется отметить его способность накопления информации для более плавного регулирования температуры с возможно меньшим отклонением от заданного значения. Однако, здесь накладываются некоторые ограничения. Это и дискретность датчика (шаг - 1 градус), и установка всего одного датчика на все помещение (колебания температуры в разных точках может достигать нескольких градусов), и серьезные суточные колебания уличной температуры (при этом система выходит на крайние пределы температурного коридора и кривая зависимости температуры от времени периодически имеет крутой характер).

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

Вобщем, задумок как всегда полно, да вот со временем на их реализацию туговато!

 

прошивка 1 прошивка 2 прошивка 3 прошивка 4 прошивка 5 прошивка 6 прошивка 7 прошивка 8 прошивка 9 прошивка 10 прошивка 11 прошивка 12 прошивка 13 прошивка 14 прошивка 15 прошивка 16 прошивка 17

 

Наверх

Фото

Фото 1

Фото 2

На фотографиях показано размещение модуля управления бойлером и других органов управления на распределительном щите.

Здесь цифровая шкала с двумя светодиодами - сам модуль.

Тумблер слева с двумя светодиодами (вверху и внизу) используется для переключения режимов управления: автоматическое посредством модуля (тумблер вверх), ручное (тумблер вниз). При ручном управлении включение каждой позиции (ТЭНа) производится одним из расположенных снизу выключателей.

Тумблер управляет реле с четырьмя контактными группами. Три группы коммутируют цепи управления силовыми пускателями, четвертая используется для индикации (диоды сверху и снизу).

Кнопка справа от тумблера - SB на схеме.

Фото 3

На этой фотографии приведена внутренняя сторона распред. щита.

Наверх

Наверх