22.11.2024

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

Режим ПИД регулирования — Термостаты

Часто задаваемые вопросы

В режиме ПИД регулирования достигается более точная установка регулируемой температуры теплоносителя.

Функция актуальна для термостатов, управляющих котлом в релейном режиме. При управлении котлом по цифровой шине, режим ПИД регулирования установлен по умолчанию.

Для применения режима ПИД регулирования подключите к термостату термодатчики

воздуха и теплоносителя и укажите их в настройке «Датчики температуры»:

В «Настройках термостата» задайте Режим регулирования «по теплоносителю (ПИД)» и задайте пороговые значения.

ZONT анализирует скорость изменения текущей температуры в помещении относительно заданной, и вычисляет расчетную температуру теплоносителя.

Таким образом, регулирование работы котла осуществляется по показаниям термодатчика теплоносителя и расчётной температуре теплоносителя.

Пример регулирования по воздуху:

Пример ПИД регулирования:

При использовании ПИД регулирования достигается более точная установка регулируемой температуры и более ровная температура теплоносителя в батареях. Но котёл при этом может тактовать. Для уменьшения тактования котла следует отрегулировать задержки управления котлом и гистерезис. Гистерезис в случае ПИД регулирования применяется к температуре теплоносителя.

Важно понимать, что для выхода ПИД регулирования в рабочий режим требуется некоторое время (обычно 2-5 часов).



ПИД регулятор для печи отопительной Бренеран, необязательно для нее и необязательно для отопления.

РадиоКот >Схемы >Цифровые устройства >Автоматика >

ПИД регулятор для печи отопительной Бренеран, необязательно для нее и необязательно для отопления.

Небольшое предисловие.

Часть первая. Описание устройства.  

Техзадание.

  1. Устройство должно быть максимально не дорогим.
  2. Исходя из п.1 пришло в голову вращать диск поддувала обыкновенной сервомашинкой.
  3. Управлять сервомашинкой (заслонкой) будет ПИД регулятор (пропорциональный – интегральный — дифференциальный).
  4. Чтобы устройство было более универсальным, добавим еще выход ШИМ с малой частой, вдруг каким электротэном захочется поуправлять или еще чем.
  5. Сделаем индикацию текущей температуры на светодиодный дисплей.
  6. Обойдемся без клавиатуры, будем настраивать коэффициенты при помощи компьютера.
  7. Благодаря п.6, нужна программа-конфигуратор. Нужна, так нужна. Напишем.
  8. Раз нет клавиатуры, добавим переключатели, чтобы можно было оперативно менять задачу (температуру), на одну из трех, заранее установленных . 

Назначение: Недорогой температурный ПИД регулятор своими руками.

Диапазон измерения температуры: -55…125 гр.С.

Два выхода ШИМ. Первый для управления сервоприводом. Частота 50Гц, ширина импульса от 1 до 2 мс. Второй выход ШИМ для непосредственного подключения нагревателей (охладителей) или других устройств. Частота ≈0,15 Гц, ширина импульса от 0 до ≈6,5 сек.

Подключения ПИД регулятора к верхнему уровню осуществляется через последовательный интерфейс UART.

Измерение и индикация текущей температуры на светодиодный семисегментный дисплей.

 

Схема электрическая принципиальная.

Так как схема проста, начну сразу с нее.

 

 

Мозгом устройства является популярный микроконтроллер AtMega8.

Датчик температуры – DS18B20, подключенный по схеме с паразитным питанием, т.е. по двум проводам.

Сервомашинка – сервопривод с ШИМ управлением, я использую MG995. Ширина импульса 1мс соответствует положению 100% и 2 мс это 0%. Частота 50 Гц.

Так же есть, так называемый «медленный ШИМ». Это выход с открытым стоком полупроводникового ключа. 0% — закрыт, 50% открыт полпериода, 100% открыт весь период, а период около 6,5 сек. К нему, например, можно подключить электротэн, с учетом мощности конечно. Вместо МОП транзистора можно поставить оптопару, а к нему подключить мощный семистор.

Светодиодный индикатор работает в режим динамической индикации.

В схеме есть четыре «кнопочки».

Кнопка «RESET» — нажатие ее перезапустит контроллер.

Кнопка «PD6» — если удерживать ее во время перезапуска контроллера, все коэффициенты сбросятся на значения по умолчанию.

Переключатели «PD3:PD2» выбор уставки (температуры). Одной из трех или перевод в режим «максимум».

PD3

PD2

№ уставки

0

0

0

0

1

1

1

0

2

1

1

«максимум»

 

Для конфигурирования с помощью приложения Windows устройство подключается к компьютеру через последовательный интерфейс. Для того чтобы подключить к компьютеру я использую преобразователь USB-RS232_TTL. Но можно в схему встроить чип max232 и подключить к COM порту. Можно использовать микросхему CP2102 и впаять разъем microUSB, благо она дешевая. Можно организовать RS485  или радиоинтерфейс. Кому как нравится. Даже можно поставить модуль bluetooth типа HC-05, компьютер его увидит как удаленный COM-порт.

Стабилизатор напряжения 5В. Собственно можно обойтись без него, если использовать уже готовый стабилизированный источник питания, да и напряжение можно понизить. Если сервомашина будет кратковременно подсаживать питание, вместо стабилизатора нужно поставить диод, а после диода конденсатор побольше.

Ну и разъем для внутрисхемного программирования.

Хочу обратить внимание, что такие элементы как DS18B20, сервопривод, Com-порт и переключатели подключенные к PD3 и PD2 являются внешними устройствами и были включены в схему для более понятной работы устройства и его отладки в симуляции.

 

Алгоритм работы ПО микроконтроллера.

При включении питания, контроллер «вспоминает» из EEPROM коэффициенты и уставки ранее сконфигурированные.

Измеряет температуру один раз в секунду.

Через равные промежутки времени (частота дискретизации и это настраиваемый параметр) вычисляется управляющее воздействие по нижеследующей формуле.

 U=KpE+Ki∑E+KdΔE; %

где

         Kp, Ki, Kd – коэффициенты пропорциональной, интегральной и дифференциальной составляющих соответственно, дробные со знаком;

E – ошибка, разница между уставкой и текущей температурой.

ΔE – разница между текущей и предыдущей ошибкой.

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

Обратите внимание, что в формуле отсутствует частота дискретизации, а хотя вроде как и должна бы. Все на самом деле очень просто. Чтобы упростить расчеты, этот параметр исключен. Поэтому при настройке ПИД регулятора коэффициент Ki надо умножить на «частоту дискретизации», а Kd разделить.

«Частоту дискретизации» не стоит делать меньше 2 секунд, т.к. опрос температуного датчика происходит с частотой 1 секунда.

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

 

Фьюзы – внутренний RC генератор 8МГц, остальное по умолчанию.

 

Программа PID_Configurator.

 

Как я уже говорил, все настройки осуществляются приложением Windows «PID_Configurator».

Особо о нем рассказывать нечего, так как там все интуитивно понятно.

Опишу элементы управления.

  • «Считать» — считывает данные с устройства и заполняются поля с данными.
  • «Записать» — отправка коэффициентов в устройство. Все числа (кроме ограничений по минимуму и максимуму) имеют дробный формат и могут быть не только положительными, но и отрицательными. Если в этот момент будет включена галочка «reset», расположенная напротив поля Ki, сумма «ошибок» накопленная микроконтроллером будет сброшена.
  • «Открыть» — открывает файл с ранее сохраненной конфигурацией.
  • «Сохранить» — сохранить конфигурацию в файл.

 

В программе имеется возможность  анализа работы всей системы и упрощения получения коэффициентов ПИД регулятора. После нажатия кнопки «Пуск» приложение будет строить тренд, который Вы можете масштабировать и сохранять в файлы. Тренд сохраняется в двух форматах. Первый формат это скрин отображенного на экране тренда, второй это текстовый файл в виде таблицы всего тренда. Этот текст Вы без труда можете вставить, например, в электронную таблицу Excel.

 

Параметры UART.

Если будет нужно использовать радиоудлинитель, преобразователь интерфейса (например в RS-485), модуль Bluethooth и прочее, то нужно будет установить следующие параметры передачи данных:

  • 9600 бод;
  • 1-стоп бит;
  • Нет контроля четности.
  • 8 бит данных.

Плата печатная.

Пришел в магазин и все получилось как всегда. Выбор далеко не богат, город то не самый большой. Решил делать  плату  под те элементы, что есть. Можно было конечно заказать нужные элементы, но мне надо было «вот именно сейчас».

Индикатор – два спаренных FYD-5622. Кнопки типа SWT для перезапуска контроллера и сброса на значения по умолчанию. Переключатели внешние.

Что хочу сказать по поводу платы. Размеры ее можно значительно уменьшить, особенно если использовать планарные элементы.

Индикатор лучше использовать четырехразрядный, и с меньшим количеством ножек. А можно и совсем не ставить. Если  нужна только одна уставка – то внешние переключатели не нужны. Как я говорил уже ранее, можно отказаться от использования стабилизатора на плате (используя готовый внешний источник питания) и  от разъема внутрисхемного программирования.

А можно и использовать мой опытный вариант разводки дорожек платы.

 

Часть вторая. Боевое применение. Или как я настраивал и наслаждался результатом.

Начну с того, что я начал испытание с элементом Пельтье, используемый мной вместо электронагревателя, подключенный к «медленному ШИМ».

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

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

Убавил Ki , ограничил максимальное управляющее воздействие и вот что получилось.

После такого определения коэффициентов, на заданную температуру устройство выходило очень быстро и колебалось в рамках ±0,125 градуса и практически без перерегулирования. Можно было еще поиграться коэффициентами и попробовать сделать характеристику более идеальной, но не стал.

Хотя коэффициенты пришлось подправить,  все же для предварительного определения коэффициентов метод сработал. Возможно Ki пришлось сильно изменить потому что Kp не вынесен за скобки как это часто делают. Но я решил сделать формулу классической.

_____________________________________________________________________________________________________________________

Теперь перехожу к испытаниям на печи. Для чего собственно и было задумано данное устройство.

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

Поддувало печи Бренеран (или как его гордо называет производитель печи «регулятор мощности») выполнено из трубы диаметром 89мм со встроенным дисковым поворотным затвором.  Это поворотный затвор я решил не трогать, а сделать еще один регулятор.

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

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

Сервопривод удалил подальше от печи чтобы не нагревался. Как потом оказалось с очень большим запасом.

Отверстие, закрываемое поворотным диском, впоследствии было увеличено в более чем два раза. Плату контроллера была помещена в капроновый контейнер. Сервопривод с платой был соединен пяти метровым неэкранированным проводом, но не смотря на это сервопривод позиционируется точно. Т.е. сигнал ШИМ не искажается.

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

 

А вот мое рабочее место определения коэффициентов.

 

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

Плюсы и минусы данной печи описывать я тут не буду, не о том статья. Укажу ее марку — АОТ-8 тип 005.  Объем помещения 60м3.

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

Но все же я добился необходимого результата, не смотря позднее время. Кстати Ki убавил где-то на тот же порядок что и с элементом Пельтье от расчетного.  

Ниже Вы может увидеть тренд выхода на уставку 24 градуса. 

А вот продолжение тренда.

      Около 7 часов утра я обнаружил что в печи кончилось топливо, остались небольшие головешки (где-то хватает одной закладки на 6 — 7 часов, но не всегда) и удовлетворенный результатом ушел спать. 

 

Вывод:

          Хотя, устройство было задумано для регулировки притока воздуха в печь «Бренеран», регулируя тем самым ее мощность, область применения данного ПИД-регулятора само-собой  не ограничена этим.

         Типов ТТ котлов сейчас огромное количество, заводских и самодельных, горизонтальных и вертикальных. И почти все с ручным управлением, почему бы не попробовать? Можно и на самодельных, например на печке-бочке «Бубофоня», использующий принцип  котла-свечки Stropuva. Да и регулировать можно не температуру воздуха, а теплоносителя.

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

         У Вас свой дом подключенный к центральному отоплению? Поставьте сервопривод помощнее на запорную арматуру и регулируете температуру дома. Днем дома никого нет? Можно перейти на температурную уставку с температурой пониже, а управлять уставками можно программируемыми таймерами вместо переключателей или написать свое приложение под Windows или Android.

         Да и не обязательно управлять отопительным оборудованием, можно холодильным оборудованием, или даже  форточкой в теплице.

         Да мало ли еще куда его можно применить. Как говорится было бы желание.

       

     ————————————————————————————————————————————————

 

Файлы:
Конфигуратор (Windows)
HEX с сохранением данных в EEPROM
Схема (Proteus)
Плата (layout 6)

Все вопросы в Форум.


Как вам эта статья?

Заработало ли это устройство у вас?

ПИД-регулятор своими руками / Habr

; PID управление
CalcMainEnd:
	; Вычисления, Go-Go.
CalcPid:
	;	1. Eo = E				 | 16bit
Pid1:
	MOV Err0H, ErrH
	MOV Err0L, ErrL
	;	2. E = Y-X				 | 16bit
Pid2:
	CLR C
	MOV A, SettingL
	SUBB A, ThermoL
	MOV ErrL, A
	MOV A, SettingH
	SUBB A, ThermoH
	MOV ErrH, A
	JNB  OV, Pid2Ov
	JB	ACC.7, Pid2Max
Pid2Min:
	MOV ErrL, #LOW(-500*32)
	MOV ErrH, #HIGH(-500*32)
	SJMP Pid2End
Pid2Max:
	MOV ErrL, #LOW(500*32)
	MOV ErrH, #HIGH(500*32)
	SJMP Pid2End
Pid2Ov:
	JNB ACC.7, Pid2OvP
Pid2OvN: ; Проверим на ограничение вниз
	CLR C
	MOV A, ErrL
	SUBB A, #LOW(-500*32)
	MOV A, ErrH
	SUBB A, #HIGH(-500*32)
	JNC Pid2End ; Если > -500 => всё ок
	SJMP Pid2Min
Pid2OvP:
	CLR C
	MOV A, ErrL
	SUBB A, #LOW(500*32)
	MOV A, ErrH
	SUBB A, #HIGH(500*32)
	JNC Pid2Max ; Если < 500 => всё ок
Pid2End:

	;	3. Int = Int + (E+Eo)/2  | 32bit+16bit
Pid3:
	JNB PowerReady, Pid3End ; Если нет сети -- интегральную часть не копим
	MOV A, ErrL
	ADD A, Err0L
	MOV R0, A ; временно
	MOV A, ErrH
	ADDC A, Err0H
	MOV C, ACC.7 ; Полусумма всегда влезает в 16 бит, поэтому при сдвиге надо сохранить знак
	RRC A	; Поделим без потери знака
	XCH A, R0 ; A= младшая часть, R0 - старшая часть полусуммы
	RRC A	; Доделили
	JNB  IntS, Pid3IntPos
	; Int отрицательный, изменим знак для R0:A, тем самым можно будет просто сложить с Int
	CLR C
	CPL A
	ADD A, #1
	XCH A, R0
	CPL A
	ADDC A, #0
	XCH A, R0
Pid3IntPos:
	; У Int и R0:A сейчас согласованы знаки, поэтому складываем обычным образом
	ADD A, IntLL
	MOV IntLL, A
	MOV A, IntLH
	ADDC A, R0
	MOV IntLH, A
	MOV A, R0
	JB	ACC.7, Pid3Neg ; Прибавляли отрицательную разность?
	; Если разность положительная, просто распространим перенос
	JNC jPid3End  ; Если прибавили слово и переноса небыло -- делать нам ничего не требуется.
	INC IntHL ; Распространяем перенос выше
	MOV A, IntHL
	JNZ Pid3End  ; Если перенос не ушел в 4й байт -- всё нормально
	INC IntHH ; Распространяем перенос на САМЫЙ старший байт
	MOV A, IntHH
	JNZ Pid3End  ; Если перенос не ушел еще выше -- всё нормально
	MOV IntHH, #0FFh ; Если перенс был выше -- ограничиваем интеграл потолком
	MOV IntHL, #0FFh
	MOV IntLH, #0FFh
	MOV IntLL, #0FFh
jPid3End:
	SJMP Pid3End
Pid3Neg: ; Если разность отрицательная, то надо продолжать добавлять оба раза, но FFh
	MOV A, IntHL
	ADDC A, #0FFh
	MOV IntHL, A
	MOV A, IntHH
	ADDC A, #0FFh
	MOV IntHH, A
	JC	Pid3End  ; Если тут был перенос, значит знак интеграла не изменился
	CPL IntS ; Если переноса небыло, значит у интеграла изменился знак
	CPL C		 ; Обратим знак получившегося числа
	MOV A, #0
	SUBB A, IntLL
	MOV IntLL, A
	MOV A, #0
	SUBB A, IntLH
	MOV IntLH, A
	MOV A, #0
	SUBB A, IntHL
	MOV IntHL, A
	MOV A, #0
	SUBB A, IntHH
	MOV IntHH, A
	; так как оно стало отрицательным -- то перенос тут будет всегда
Pid3End:

	;	5. cI = Int*(1/Ti)		 | 32*32=>32bit
Pid5: ; R3:R2:R1:R0 = Int*(1/Ti)
	JB Ti_sh2, Pid5Calc ; если Ti_sh2=0, то 1/Ti=1 или Ti=0. и ничего делать не надо
	MOV A, Ti_mLL
	ORL A, Ti_mLH
	ORL A, Ti_mHL
	ORL A, Ti_mHH
	JZ	Pid5Zero
	MOV R0, IntLL
	MOV R1, IntLH
	MOV R2, IntHL
	MOV R3, IntHH
	AJMP Pid5End
Pid5Zero:
	MOV A, #0
	MOV R0, A
	MOV R1, A
	MOV R2, A
	MOV R3, A
	MOV IntLL, A
	MOV IntLH, A
	MOV IntHL, A
	MOV IntHH, A
	AJMP Pid5End
Pid5Calc:
	; R7:R6:R5:R4[:R3] = MULUH(Int*Ti_m) // R3 считаем как часть для округления
	MOV R2, #0
	;; R7:R6 = IntHH*Ti_mHH
	MOV A, IntHH
	MOV B, Ti_mHH
	MUL AB
	MOV R7, B
	MOV R6, A
	; R6:R5 += IntHL*Ti_mHH
	MOV A, IntHL
	MOV B, Ti_mHH
	MUL AB
	MOV R5, A
	MOV A, R6
	ADD A, B
	MOV R6, A
	MOV A, R2 ; A=0
	ADDC A, R7
	MOV R7, A
	; R5:R4 += IntLH*Ti_mHH
	MOV A, IntLH
	MOV B, Ti_mHH
	MUL AB
	MOV R4, A
	MOV A, R5
	ADD A, B
	MOV R5, A
	MOV A, R2 ; A=0
	ADDC A, R6
	MOV R6, A
	MOV A, R2 ; A=0
	ADDC A, R7
	MOV R7, A
	; R4:R3 += IntLL*Ti_mHH
	MOV A, IntLL
	MOV B, Ti_mHH
	MUL AB
	MOV R3, A
	MOV A, R4
	ADD A, B
	MOV R4, A
	MOV A, R2 ; A=0
	ADDC A, R5
	MOV R5, A
	MOV A, R2 ; A=0
	ADDC A, R6
	MOV R6, A
	MOV A, R2 ; A=0
	ADDC A, R7
	MOV R7, A
	;; R6:R5 += IntHH*Ti_mHL
	MOV A, IntHH
	MOV B, Ti_mHL
	MUL AB
	ADD A, R5
	MOV R5, A
	MOV A, R6
	ADDC A, B
	MOV R6, A
	MOV A, R2 ; A=0
	ADDC A, R7
	MOV R7, A
	; R5:R4 += IntHL*Ti_mHL
	MOV A, IntHL
	MOV B, Ti_mHL
	MUL AB
	ADD A, R4
	MOV R4, A
	MOV A, R5
	ADDC A, B
	MOV R5, A
	MOV A, R2 ; A=0
	ADDC A, R6
	MOV R6, A
	MOV A, R2 ; A=0
	ADDC A, R7
	MOV R7, A
	; R4:R3 += IntLH*Ti_mHL
	MOV A, IntLH
	MOV B, Ti_mHL
	MUL AB
	MOV A, R3
	MOV R3, A
	MOV A, R4
	ADDC A, B
	MOV R4, A
	MOV A, R2 ; A=0
	ADDC A, R5
	MOV R5, A
	MOV A, R2 ; A=0
	ADDC A, R6
	MOV R6, A
	MOV A, R2 ; A=0
	ADDC A, R7
	MOV R7, A
	;; R5:R4 += IntHH*Ti_mLH
	MOV A, IntHH
	MOV B, Ti_mLH
	MUL AB
	ADD A, R4
	MOV R4, A
	MOV A, R5
	ADDC A, B
	MOV R5, A
	MOV A, R2 ; A=0
	ADDC A, R6
	MOV R6, A
	MOV A, R2 ; A=0
	ADDC A, R7
	MOV R7, A
	; R4:R3 += IntHL*Ti_mLH
	MOV A, IntHL
	MOV B, Ti_mLH
	MUL AB
	ADD A, R3
	MOV R3, A
	MOV A, R4
	ADDC A, B
	MOV R4, A
	MOV A, R2 ; A=0
	ADDC A, R5
	MOV R5, A
	MOV A, R2 ; A=0
	ADDC A, R6
	MOV R6, A
	MOV A, R2 ; A=0
	ADDC A, R7
	MOV R7, A
	;; R4:R3 += IntHH*Ti_mLL
	MOV A, IntHH
	MOV B, Ti_mLL
	MUL AB
	ADD A, R3
	MOV R3, A
	MOV A, R4
	ADDC A, B
	MOV R4, A
	MOV A, R2 ; A=0
	ADDC A, R5
	MOV R5, A
	MOV A, R2 ; A=0
	ADDC A, R6
	MOV R6, A
	MOV A, R2 ; A=0
	ADDC A, R7
	MOV R7, A
	;;; Если R3 > 7F --
	MOV A, R3
	JNB ACC.7, Pid5Shift ; Если R3<80 -- округление не надо
	ANL A, #7Fh
	JZ	Pid5Round ; Если = 80 -- округляем до нечетного
	MOV A, #1
	ADD A, R4
	MOV R4, A
	MOV A, R2 ; A=0
	ADDC A, R5
	MOV R5, A
	MOV A, R2 ; A=0
	ADDC A, R6
	MOV R6, A
	MOV A, R2 ; A=0
	ADDC A, R7
	MOV R7, A
	SJMP Pid5Shift
Pid5Round:
	MOV A, R4
	ORL A, #01h
	MOV R4, A
	;JMP Pid5Shift

Pid5Shift:
	; R3:R2:R1:R0 = (Int-R7:R6:R5:R4) >> 1
	CLR C
	MOV A, IntLL
	SUBB A, R4
	MOV R0, A
	MOV A, IntLH
	SUBB A, R5
	MOV R1, A
	MOV A, IntHL
	SUBB A, R6
	MOV R2, A
	MOV A, IntHH
	SUBB A, R7
	RRC A ; >>1 без потери переноса
	MOV R3, A
	MOV A, R2
	RRC A
	MOV R2, A
	MOV A, R1
	RRC A
	MOV R1, A
	MOV A, R0
	RRC A
	;MOV R0, A
	; R3:R2:R1:R0 += R7:R6:R5:R4
	;MOV A, R0
	ADD A, R4
	MOV R0, A
	MOV A, R1
	ADDC A, R5
	MOV R1, A
	MOV A, R2
	ADDC A, R6
	MOV R2, A
	MOV A, R3
	ADDC A, R7
	MOV R7, A
	; Теперь сдвинуть вправо на sh3.
	; sh3 может быть до 16 (так как у нас Ti 16разрядный; проверим необходимость сдвига на 16 бит)
	MOV A, Ti_sh3
	JNB ACC.4, Pid5ShiftUnder16
	; Надо сдвинуть >=16 -- 2 байта сдвинем mov'ами
	MOV R0, 18h+2; R2, bank 3
	MOV R1, 18h+3; R3, bank 3
	MOV R2, #0
	MOV R3, #0
Pid5ShiftUnder16:
	JNB ACC.3, Pid5ShiftUnder8
	; Надо сдвинуть на >=8 -- 1 байт сдвигаем mov'ами
	MOV R0, 18h+1; R1, bank 3
	MOV R1, 18h+2; R2, bank 3
	MOV R2, 18h+3; R3, bank 3
	MOV R3, #0
Pid5ShiftUnder8:
	ANL A, #07h
	JZ Pid5End ; Если внутри байта двигать не надо -- всё
	MOV R4, A
	SJMP Pid5ShiftRight
Pid5NextShift:
	CLR C
	; К этому моменту C у нас еще возможнозначимый старший бит!
Pid5ShiftRight:
	MOV A, R3
	RRC A
	MOV R3, A
	MOV A, R2
	RRC A
	MOV R2, A
	MOV A, R1
	RRC A
	MOV R1, A
	MOV A, R0
	RRC A
	MOV R0, A
	DJNZ R4, Pid5NextShift
	; Всё, после всех сдвигов получили результат
	; Не забываем, что у вычисленного в R3:R2:R1:R0
	; сейчас число положительное, а знак его в IntS
Pid5End:

	;	4. PID += [ cD = Td * (E-Eo) ]		| 16*16=>32bit
Pid4: ; cD = R7:R6:R5:R4; ErrD = E-Eo
	CLR C
	MOV A, ErrL
	SUBB A, Err0L
	MOV DiffL, A
	MOV A, ErrH
	SUBB A, Err0H
	MOV DiffH, A
	MOV C, ACC.7 ; Берём знак результата
	MOV DiffS, C ; Сохраним знак E-Eo
	JNC Pid4Mul
	; Diff -- орицательный, обратим знак
	MOV A, DiffL
	CPL A
	ADD A, #1
	MOV DiffL, A
	MOV A, DiffH
	CPL A
	ADDC A, #0
	MOV DiffH, A
Pid4Mul:
	; R7:R6 = DiffH*TdH
	; MOV A, DiffH = в любом случае A=DiffH
	MOV B, TdH
	MUL AB
	MOV R6, A
	MOV R7, B
	; R5:R4 = DiffL*TdL
	MOV A, DiffL
	MOV B, TdL
	MUL AB
	MOV R4, A
	MOV R5, B
	; R6:R5 += DiffH*TdL
	MOV A, DiffH
	MOV B, TdL
	MUL AB
	ADD A, R5
	MOV R5, A
	MOV A, R6
	ADD A, B
	MOV R6, A
	MOV A, R7
	ADDC A, #0
	MOV R7, A
	; R6:R5 += DiffL*TdH
	MOV A, DiffL
	MOV B, TdH
	MUL AB
	ADD A, R5
	MOV R5, A
	MOV A, R6
	ADD A, B
	MOV R6, A
	MOV A, R7
	ADDC A, #0
	MOV R7, A

	;	6. PID = E + cI + cD	 | 32bit
Pid6:	; R3:R2:R1:R0 равно cI, знак в IntS;
	; R7:R6:R5:R4 = cD; знак в DiffS
	; E в обратном дополнительном коде

	JB IntS, ChkDiffN
	JNB DiffS, Pid6Add ; Int>0, Diff>0 => Add
	SJMP Pid6Sub ; Int>0, Diff<0 => Sub
ChkDiffN:
	JNB DiffS, Pid6Sub ; Int<0, Diff>0 => Sub
	; Int<0, Diff<0 => Add
Pid6Add:
	; Одинаковый знак => складываем их с проверкой на переполнение
	MOV A, R0
	ADD A, R4
	MOV R0, A
	MOV A, R1
	ADDC A, R5
	MOV R1, A
	MOV A, R2
	ADDC A, R6
	MOV R2, A
	MOV A, R3
	ADDC A, R7
	MOV R3, A
	JNC Pid6Err ; Если нет переноса - в результате сложения переполнения небыло
	MOV R3, #0FFh
	MOV R2, #0FFh
	MOV R1, #0FFh
	MOV R0, #0FFh
	SJMP Pid6Err
Pid6Sub:
	; Знаки разные -- вычтем одно из другого и проверим знак результата
	CLR C
	MOV A, R4
	SUBB A, R0
	MOV R0, A
	MOV A, R5
	SUBB A, R1
	MOV R1, A
	MOV A, R6
	SUBB A, R2
	MOV R2, A
	MOV A, R7
	SUBB A, R3
	MOV R3, A
	JNC Pid6Err ; Если нет заимствования -- знак результата равен знаку DiffS
	CPL DiffS ; Если заимствование было, у DiffS и результата надо обратить знак
	MOV R6, #0 ; R6=0
	MOV A, R0
	CPL A
	ADDC A, R6 ; R6=0, C=1 => действие +1
	MOV R0, A
	MOV A, R1
	CPL A
	ADDC A, R6 ; +перенос
	MOV R1, A
	MOV A, R2
	CPL A
	ADDC A, R6
	MOV R2, A
	MOV A, R3
	CPL A
	ADDC A, R6
	MOV R3, A

Pid6Err:
	MOV R6, #0 ; R6=0
	; В R3:R2:R1:R0 -- лежит cI+cD; знак суммы в DiffS
	; надо прибавить/отнять Err, записанное в обратном коде
	; Приведём знак Err к DiffS
	MOV R4, ErrL
	MOV A, ErrH
	JB ACC.7, Pid6ChkDiffS
	JNB DiffS, Pid6SumErrNoInv ; Err>0, Diff>0 => NoInv
	SJMP Pid6SumErrInv
Pid6ChkDiffS:
	JNB DiffS, Pid6SumErrNoInv ; Err<0, Diff>0 => NoInv
Pid6SumErrInv:
	; У Err знак отличается от DiffS -- инвертируем
	SETB C ; Не уверен в состоянии C
	MOV A, ErrL
	CPL A
	ADDC A, R6 ; A+=R6+C, R6=0	C=1 => A+=1
	MOV R4, A ; R4=ErrL
	MOV A, ErrH
	CPL A
	ADDC A, R6
Pid6SumErrNoInv:
	MOV R5, A ; ErrH
Pid6SumErr:
	; Итак, в R5:R4 лежит Err, знак которого согласован с DiffS; но в обратно-дополнительном коде
	MOV A, R0
	ADD A, R4
	MOV R0, A
	MOV A, R5
	CLR F0
	JNB ACC.7, Pid6SubErrPos
	SETB F0
	MOV R6, #0FFh ; Добавляем отрицательное => дополняем FFами
Pid6SubErrPos:
	ADDC A, R1
	MOV R1, A
	MOV A, R2
	ADDC A, R6 ; +расширение
	MOV R2, A
	MOV A, R3
	ADDC A, R6 ; +расширение
	MOV R3, A
	MOV R6, #0
	; Надо проверить нет ли смены знака итоговой суммы
	JNC Pid6ChkF0
	JB F0, Pid7 ; Err<0, был перенос => Знак не сменился, переполнения нет
	SJMP Pid6SumOv ; Err>0, был перенос => переполнение
Pid6ChkF0:
	JNB F0, Pid7 ; Err>0, небыло переноса => нет переполнения
	;SJMP Pid6SumUf ; Err<0, небыло переноса => сменился знак
Pid6SumUf:
	; Если Err<0 и небыло переноса => сменился знак
	CPL DiffS
	MOV A, R0
	CPL A
	ADD A, #1 ; C=?, поэтому прибавляем 1 обычным методом
	MOV R0, A
	MOV A, R1
	CPL A
	ADDC A, R6
	MOV R1, A
	MOV A, R2
	CPL A
	ADDC A, R6
	MOV R2, A
	MOV A, R3
	CPL A
	ADDC A, R6
	MOV R3, A
	SJMP Pid7 ; Знак у результата и DiffS приведены в норму
Pid6SumOv:
	; Было переполнение => округляем до максимума
	MOV R0, #0FFh
	MOV R1, #0FFh
	MOV R2, #0FFh
	MOV R3, #0FFh

	;	7. U = K*PID/256		 | 32bit*16bit/8bit => 40bit,
	;					 | которые усекаются до 10bit
	;					 | при вычислениях
Pid7: ; В R3:R2:R1:R0 лежит результат PID, в DiffS его знак
	  ; Нужно вычислить K*PID/256, ограничив результат до 10бит
	  ; K всегда положительно, поэтому если PID < 0 => минимум
	JB DiffS, Pid7Umin
	; поскольку мы можем жестко ограничить сверху 16ю битами,
	; то если R3 != 0 => ставим максимум в любом случае
	MOV A, R3
	JNZ Pid7Umax
	; [R2:R1:R0 * KH:HL] = [R7:R6:R5:R4:R3]
	; вычисляем, учитывая что должно получиться R7=0 R6=0,
	; иначе переполнение, поэтому R7 и R6 вообще не трогаем
	; но проверяем результат
	; R7:R6 = R2*KH
	MOV A, R2
	JZ Pid7S1
	MOV A, KH
	JNZ Pid7Umax ; Если R2!=0 и KH!=0 => R7:R6>0 => переполнение
Pid7S1:
	; R6:R5 = R2*KL
	MOV A, R2
	MOV B, KL
	MUL AB
	MOV R5, A
	MOV A, B
	JNZ Pid7Umax ; Если R6 > 0 => переполнение
	; R6:R5 = R1*KH
	MOV A, R1
	MOV B, KH
	MUL AB
	ADD A, R5
	JC	Pid7Umax ; Если R6 > 0 => переполнение
	MOV R5, A
	MOV A, B
	JNZ Pid7Umax ; Если R6 > 0 => переполнение
	; R5:R4 = R0*KH
	MOV A, R0
	MOV B, KH
	MUL AB
	MOV R4, A
	MOV A, R5
	ADD A, B
	JC	Pid7Umax ; Если R6 > 0 => переполнение
	MOV R5, A
	; R5:R4 = R1*KL
	MOV A, R1
	MOV B, KL
	MUL AB
	ADD A, R4
	MOV R4, A
	MOV A, R5
	ADDC A, B
	JC	Pid7Umax ; Если R6 > 0 => переполнение
	MOV R5, A
	; R4:R3 = R0*KL
	MOV A, R0
	MOV B, KL
	MUL AB
	RLC A ; C = R3>=0x80, Z=R3>0x80
	MOV R3, #0FFh ; R3<>0x80 => ничего
	JNZ Pid7S2
	MOV R3, #0FEh ; R3==0x80 => округление до четного
Pid7S2:
	MOV A, R4
	ADDC A, B ; Складываем умножение, регистр, и перенос-округление
	ANL A, R3 ; А так же если округление до четного -- отбрасываем после младший бит
	MOV R4, A
	MOV A, R5
	ADDC A, R6 ; R6=0 у нас с давних пор, хоть мы туда и не складывали ничего во время перемножения
	JC	Pid7Umax ; Если R6 > 0 => переполнение
	MOV R5, A
	; R5:R4 => ограниченный в 16 бит результат
	; Теперь надо ограничить R5:R4 до Umax/Umin
	MOV A, UmaxL
	SUBB A, R4 ; C=0 на текущий момент
	MOV A, UmaxH
	SUBB A, R5
	JC Pid7Umax ; Если R5:R4>Umax => R5:R4 = Umax
	MOV A, UminL
	SUBB A, R4 ; C=0 на текущий момент
	MOV A, UminH
	SUBB A, R5
	JNC Pid7Umin ; Если R5:R4<Umin => R5:R4 = Umin
	; Мощность вычислена
	MOV UH, R5
	MOV UL, R4
	SETB UReady
	AJMP CalcExit
Pid7Umax: ; Установить максимальную мощность
	MOV UH, UmaxH
	MOV UL, UmaxL
	SETB UReady
	AJMP CalcExit
Pid7Umin: ; Установить минимальную мощность
	MOV UH, UminH
	MOV UL, UminL
	SETB UReady
	AJMP CalcExit

ПИД-регулятор температуры с инструкцией по эксплуатации микроконтроллера

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

Год назад я заказал себе для паяльной печи комплект из двух термоконтроллеров — один обозреваемый и второй гораздо более функциональный. Почему-то у меня появилась глупая мысль использовать их вместе, но когда уже получил заказ резко поумнел и этот сравнительно простой термоконтроллер остался не удел.
Итак, что этот термоконтроллер может. Самое главное, конечно же, это поддерживать заданную температуру, управляя нагревателем. Но чем он лучше любого термоконтроллера за 1.5-2 бакса, которых полно на Али? Самое главное — тем, что он обеспечивает регулирование температуры PID-регулятором.

постараюсь объяснить попроще что такое PID-регуляция 🙂

По русски это понятие, кстати, сокращается в те же буквы — ПИД, Пропорционально-Интегрирующе-Дифференцирующая регуляция.
В инете множество статей, посвященных ПИД, но очень мало рассказывающих об этом понятными словами. Я не популяризатор, но постараюсь изложить принцип работы ПИД-регуляторов максимально доступно 🙂

ЗЫ: конкретные цифры на графиках могут не совпадать с цифрами в примерах, но принцип сохраняется 🙂

Представьте, что у нас есть банка с водой, температуру которой нужно поддерживать 70 градусов с помощью вставленного в эту банку нагревателя мощностью 100 Ватт. Для измерения температуры в воду опущен термометр.
Самый простой способ сделать это как раз применяется в однбаксовых терморегуляторах: включаем нагреватель, температура достигает заданной, выключаем нагреватель, температура падает ниже заданной — включаем нагреватель, и т.д.
Элементарнейший и дешевейший способ, не требующий никаких вычислительных ресурсов. На этом принципе делают как цифровые контроллеры, так и аналоговые, и даже механические. Однако есть у него большой недостаток — он не поддерживает более-менее точно заданную температуру. С таким регулятором температура воды в нашей банке будет гулять вокруг заданной, то превышая ее, то падая ниже. График температуры будет напоминать пилу. Это называется пороговый регулятор, то есть который включает или выключает нагреватель по достижении заданных порогов:

А что если не просто включать-выключать нагреватель, а регулировать его мощность — чем температура воды ниже заданной тем больше мощности подаем на нагреватель? Звучит логично и вот так у нас и начинает появляться ПИД 🙂 Точнее, появилась первая его составляющая Пс — пропорциональная, значение которой прямо пропорционально разнице между заданной и текущей температурами. Итак, будем выдавать на нагреватель значение Пс: при текущей температуре воды 20 градусов он выдаст в нагреватель 70-20=50 Ватт. Когда вода нагреется до 40 градусов, он уже будет выдавать 70-40=30 Ватт. При температуре воды 60 градусов он будет выдавать 70-60=10 Ватт. Отлично, никаких прыжков вокруг заданной температуры, все плавно 🙂 Однако есть одна закавыка: при мощности на нагревателе 10 Ватт он уже не может и дальше нагревать воду, а может только удерживать эти достигнутые 60 градусов. Итак, вода 60 градусов, Пс соответственно выдает 10 Ватт и температура воды стоит на месте, до 70 градусов с таким регулятором ей не добраться:

Нужно что-то добавлять к пропорциональной составляющей, какое-то значение, причем не постоянное. На помощь приходит Ис — интегрирующая составляющая. Это накопитель ошибок. При каждом измерении в него добавляется разница между заданной и текущей температурами. Если заданная температура больше, то добавляется положительное число, если меньше, то отрицательное. У этой составляющей есть заданное максимальное значение, превысить которое она не может, то есть если при очередном добавлении оказывается, что сумма превысит максимум, то Ис становится равной максимуму, но не больше. То же касается нуля — отрицательным числом она тоже не может стать. Пусть у нас этот максимум будет равен мощности нагревателя — 100. Теперь на нагреватель будет выдаваться суммарное значение мощности Пс+Ис. Для примера последовательность температур и что при этом получается:
1. Температура 20 градусов, Ис изначально равна нулю, Пс=70-20=50, в нагреватель выдается Ис+Пс=0+50=50 Ватт.
2. Вода нагрелась до 30 градусов, Ис=0(ее предыдущее значение)+(70-30)=40, Пс=70-30=40, в нагреватель выдается Ис+Пс=40+40=80 Ватт.
3. Вода нагрелась до 40 градусов, Ис=40(ее предыдущее значение)+(70-40)=70, Пс=70-40=30, в нагреватель выдается Ис+Пс=70+30=100 Ватт.
4. Вода нагрелась до 60 градусов, Ис=70(ее предыдущее значение)+(70-60)=80, Пс=70-60=10, в нагреватель выдается Ис+Пс=80+10=90 Ватт.
Смотрите-ка, пока все выглядит неплохо, вода уже 60 градусов, а нагреватель все еще греет воду, хотя и начал снижать мощность 🙂
5. Вода нагрелась до 70 градусов, Ис=80(ее предыдущее значение)+(70-70)=80, Пс=70-70=0, в нагреватель выдается Ис+Пс=80+0=80 Ватт.
6. Вода нагрелась до 80 градусов, Ис=80(ее предыдущее значение)+(70-80)=70, Пс=70-80=-10, в нагреватель выдается Ис+Пс=70+(-10)=60 Ватт.
Вода перегрелась. И хотя, как видно, мощность пошла вниз, температура еще будет какое-то время колебаться пока не успокоится на заданном значении:

Это называется перерегулирование. Происходит оно из-за того, что и нагреватель и термометр и, главное, вода имеют какую-то инерцию, регулятор получает обратную связь (показания температуры) с определенным запаздыванием. При подаче на нагреватель полной мощности вода не нагреется мгновенно до 100 градусов, и точно так же она не остынет мгновенно при выключении нагревателя. Регулятор посмотрел на температуру — холодная вода, добавил мощности. Через 2 секунды глянул — все еще холодная — опять добавил. А когда в очередной раз он обнаруживает, что вода уже дошла до нужной температуры то начинает выдавать мощность, накопленную в Ис, считая, что это как раз нужное для поддержания температуры значение мощности (на самом деле интегрирующая составляющая после устаканивания всех возмущений действительно содержит значение, необходимое для ровного поддержания регулируемой величины, а пропорциональная призвана только компенсировать случайные отклонения). Но для воды это много и она продолжает нагреваться. И только после превышения заданной температуры регулятор начинает снижать мощность. И эта качка продолжается некоторое время пока значение Ис не придет к нужной величине.
Что можно предпринять в таком случае? Ну, например можно понизить влияние на выходную мощность Ис. Это называется коэффициент, у каждой составляющей ПИД может быть свой коэффициент, которым можно повышать или понижать влияние этой составляющей на выходной результат. Уменьшим влияние Ис до 0.3 от его значения — Ис*0.3:

Уже лучше, но все равно есть колебание в начале. Это из-за слишком большого влияния пропорциональной составляющей, давайте уменьшим и ее влияние в 2 раз — Пс*0.5:

Идеально, правда? 🙂
Нуу… Почти. Колебаний нет, но вот время нагрева увеличилось. Оно пришло к заданной температуре только к 25-му отсчету.
На самом деле зачастую используют ПИ-регулятор, без его дифференцирующей части и это вполне работает, как видно. Однако часто можно добиться еще лучшего результата с использованием третьей составляющей — дифференцирующей, Дс.
Она является «демпфером», не дающим регулируемому устройству слишком быстро менять свое состояние. В нашем примере Дс начнет снижать выходную мощность тем сильнее чем быстрее будет нагреваться вода, иными словами она не даст «разогнаться» графику роста температуры настолько, чтобы он проскочил заданную температуру 🙂 При этом, пока до заданной температуры далеко влияние Дс не очень значительно на фоне других составляющих, температура может расти быстро. Но чем ближе она к заданной тем сильнее становится влияние Дс на фоне все уменьшающихся Ис и Пс.
Дс в отличии от Пс и Ис не прибавляется к выходному сигналу (в нашем примере- мощности), а вычитается из него. Она равна скорости изменения регулируемой величины (в нашем примере — температуры). Например, если в прошлый замер температура была 28 градусов, а в текущем замере она уже 31 градус, то Дс будет равна 3 — на столько температура выросла с прошлого замера, это скорость роста температуры. И это значение, возможно умноженное на свой коэффициент, вычитается из выходной мощности, потому эта составляющая и называется дифференцирующей 🙂
Вот что получится при добавлении Дс:

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

А вот что было бы без дифференцирующей составляющей при тех же условиях:

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

Уфф… 🙂 Ну, я говорил, что не являюсь популяризатором, поэтому за доходчивость своего изложения не отвечаю. Но я старался 🙂

ЗЫ: самое веселое заключается в подборе коэффициентов этих составляющих, т.к. без правильных (хотя бы примерно) значений этих коэффициентов ПИД-регулятор или вообще не будет регулировать или будет регулировать очень плохо. Подбор идеальных коэффициентов, как я понял, дело весьма нетривиальное. Пока я не встречал в инете доступное объяснение как их рассчитывать, в основном приводятся методики их экспериментального подбора. Что, впрочем, достаточно логично, т.к. для расчета нужно столько всего знать о регулируемом механизме, сколько о нем не всегда знают даже его создатели :))

Основные параметры этого регулятора (именно этой модели — REX-C100FK02-V*AN):

  • питание — 24 вольта постоянного напряжения / 24 вольта переменного напряжения / 85-264 вольта переменного напряжения
  • потребление — не более 9 VA при питании 240 вольт
  • выход — напряжение, 12 вольт, сопротивление нагрузки 600 Ом и выше
  • тип подключаемой термопары — K (в настройках можно выбрать целую кучу типов, но я не уверен, что железо универсальное и поддерживает всю эту кучу)
  • диапазон регулирования температуры — 0-400 градусов Цельсия (зависит от типа термопары)
  • выход аварийной сигнализации — один выход, реле на замыкание
  • период цикла регулирования — 0.5 сек
  • метод регулирования — PID, вкл/выкл (дискретный), P, PI, PD (настраивается)
  • вес — около 170 грамм
  • крепление — в отверстие панели

Вот русскоязычный мануал на этот контроллер (нашел где-то в сети) — drive.google.com/open?id=1HDs7UX5rllDy8GFdYrdINbcGI_Snoo00
А вот качественный англоязычный, чуть более полный, но по настройкам немного не соответствует — drive.google.com/open?id=1Ez—F-3hjLzNtKP36FkGy6vfGQ_AkPkn

И пролежал бы он у меня еще неизвестно сколько, если бы жена не пожаловалась, что в нашей электродуховке она не может запекать полимерную глину — температуру там нормально не выставить. Да и пироги порой подгорают 🙂 Духовка из самых дешевых, увы 🙂 И я вспомнил об этом контроллере. Мне он не понадобился, слишком примитивен, а вот для духовки — самое то. Но решил я не курочить духовку, а сделать отдельную коробочку с этим регулятором и твердотельным реле на 40 ампер. Точно такое же реле уже год трудится у меня на почти такой же духовке (переделанной в паяльную печь) и не жужжит.

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

Все подключения производятся через винтовые клеммы на задней стенке:

Подключение очень понятно расписано как на наклейке на корпусе контроллера, так и в мануале.

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

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

Общий план был такой — отдельная коробочка с контроллером и твердотельным реле на радиаторе, из нее выходят два силовых провода с вилкой и розеткой (да, розетка на проводе) и термопара. Термопара вставляется в духовку и зажимается ее дверцей, изоляция у термопары термоупорная, ничего ей не будет 🙂
Сначала мелькнула мысль напечатать корпус на 3D-принтере, но печатать такой размер из ABS на моем открытом всем сквознякам Anet A8 — геморрой, а PLA, размягчающийся уже при 55-60 градусах рядом с духовкой долго не проживет. Решил резать из литого поликарбоната толщиной 6 мм, их у меня есть несколько листов 50х50 см 🙂

Для начала нарисовал модель (стакан для масштаба):

Вот так оно будет собираться:

Верхняя крышка и одна стенка съемные, на винтах, остальное клееное. Правда, уже потом, когда все было сделано, до меня дошло, что лучше бы было сделать съемным дно, а не крышку, но переделывать не стал 🙂
Вырезал на фрезерном станке, так что размеры сошлись идеально. Неидеально сошлась только толщина, которая оказалась 5.9 мм вместо 6. Для более прочной склейки (или чтобы думать что так более прочно) по краям стенок сделал проточки, так что стенки соединяются полупазами:

И вот кучка запчастей готова к дальнейшей работе:

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

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

Распечатал шаблон отверстий, прихватил его кусочками двухстороннего скотча к радиатору и просверлил отверстия:

После чего обнаружил, что слегка неправильно нарисовал модель твердотельного реле, и отверстия на радиаторе теперь не совсем совпадают с отверстиями в реле. К счастью, я ошибся очень удачно — во-первых не совпадало только одно отверстие, а во-вторых оно не совпадало так сильно, что совершенно не мешало просверлить правильное 🙂 Так что все обошлось просто лишним отверстием 🙂

Через час корпус уже был достаточно прочным, чтобы можно было спокойно его крутить и примерять. И вот тут я обнаружил свой второй прокол в модели: сам-то контроллер по габаритам я нарисовал верно, а вот крепежную рамку с защелками рисовать не стал. И оказалось, что она теперь мешает крышке закрыться примерно на 3 мм. Пришлось класть крышку в станок и фрезеровать на ее внутренней стороне выемку.
Еще одна моя ошибка была в том, что узкие планки, которые я приклеил к стенкам и к которым должны прикручиваться крышки, я вырезал без отверстий для болтов. Решил, что приклею, а потом по месту просверлю. Сверлить ровно и именно там где наметил никогда не было моей сильной стороной. Короче, почти все отверстия в этих планках уехали. Из-за этого пришлось разбивать сверлом отверстия в крышках и зенковкой пытаться профрезеровать скосы для шляпок в ту же сторону 🙂 Получился слегка колхоз…
Кстати, резьба в поликарбонате держит болты очень хорошо, никаких гаек не нужно.
Перед покраской слегка закруглил грани с помощью напильника и шкурки, процесс очень быстрый и легкий.
В процессе покраски я не делал фото, как-то забыл об этом, да там ничего интересного, в общем-то, и нет. Шкуркой заматировал поверхности, обезжирил, покрыл двумя слоями грунта и потом двумя слоями краски.

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

В отверстия для проводов я вставил специальные резиновые шайбы для таких случаев, брал их тоже на али:

(коцка — это результат моего нетерпения, полез ковырять корпус когда краска еще не высохла окончательно)
Так как они не предназначены для панелей толщиной 6 мм, пришлось с внутренней стороны делать под них выемки, оставляя стенки толщиной 1 мм:

Затянул в отверстия силовые провода, соединил заземление и одну из жил, из которой сделал отвод для запитки контроллера, как и от одной из вторых жил, идущей от вилки, прикрутил реле на термопасту к радиатору, а радиатор к корпусу:

Дальше все просто — провода к реле, отмерить длину проводов до контроллера, отрезать, зачистить, залудить, прикрутить…
Все провода, выходящие из корпуса я обтянул изнутри стяжками чтобы их случайно не выдернули. Стандартная практика.

Все соединил и включил посмотреть не бахнет ли что-нибудь салютом. Не бахнуло:

Там в глубине корпуса можно увидеть светящийся индикатор реле, значит все нормально, можно собирать 🙂

Для начала я решил устроить ему стресс-тест и подключил к нему вот такой тепловентилятор на 3 кВт:

Термопару при этом я посадил на радиатор реле и закрепил кусочком каптона чтобы контролировать температуру не только на ощупь.

Включил, тепловентилятор зажужал, а я пошел писать спойлер про ПИД-регулятор, время от времени отвлекаясь и проверяя температуру радиатора. Через 15 минут после старта температура дошла до 50 градусов. Еще через 20 минут она была уже 67 градусов и на этом значении продержалась следующие 30 минут пока я не выключил все это — в офисе стало жарко 🙂 Вердикт — с духовкой 1.5-2 кВт справится без проблем 🙂

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

Верхний, красный дисплей — измеряемая (текущая) температура
Нижний, зеленый дисплей — заданная температура
Индикаторы слева по порядку сверху вниз:
1. Аварийная сигнализация 1
2. Выходной сигнал
3. Аварийная сигнализация 2
4. Индикатор работающей автонастройки PID
Кнопки слева направо: «настройка», «сдвиг», «вверх», «вниз».
Для установки заданной температуры нажимаем «настройку», все разряды нижнего дисплея кроме младшего начинают мерцать. Кнопками «вверх» и «вниз» выставляем в младшем разряде нужную цифру и нажимаем «сдвиг», теперь мерцают все разряды кроме десятков, настройка сдвигается на разряд влево. И так выставляем нужные цифры во всех разрядах. Для окончания настройки нажимаем еще раз «настройку».

Более подробные настройки вкратце

Как я писал в спойлере про PID-регулятор, коэффициенты такого регулятора — дело тонкое и подбирать их нужно для каждого случая. Изначальные настройки коэффициентов в этом регуляторе скорее всего не подойдут под ваше применение, нужно подбирать свои. Эти коэффициенты и другие параметры в регуляторе можно изменить в более глубоких настройках. Чтобы войти в этот режим нажмите и удерживайте кнопку «настройка» 3-4 секунды.
На верхнем дисплее название параметра, а на нижнем — текущее значение этого параметра. Настройка значения производится так же, как и настройка температуры — кнопками вверх-вниз меняем текущий разряд, потом кнопкой сдвига переходим к следующему и т.д. Для перехода к следующему параметру нажимаем «настройку». Для сохранения всех настроек и выхода из этого режима жмем и удерживаем 3-4 секунды кнопку «настройка».
Список параметров в той последовательности в которой они перебираются:
  • AL1 — настройка выхода первой аварийной сигнализации (в этой модели она одна, второй нет).
  • AГU — автонастройка PID

  • P — коэффициент Пс (пропорциональной составляющей ПИД), когда выставлен в 0 контроллер работает в дискретном режиме регулирования
  • I — коэффициент Ис (интегрирующей составляющей ПИД), когда установлен в 0 контроллер работает в режиме ПД
  • d — коэффициент Дс (дифференцирующей составляющей ПИД), когда установлен в 0 контроллер работает в режиме ПИ
  • Ar — насколько я понял, этот параметр задает максимум Ис, но не уверен, что понял правильно.
  • Г — тоже не совсем понял этот параметр, но похоже, что это период, с которым происходит измерение текущей температуры и соответствующее изменение выходного сигнала
  • SC — тут можно подкорректировать показания термопары, это значение добавляется к ним. Может быть как положительным, так и отрицательным числом.
  • LCK — блокировка настроек, 0000 — все настройки доступны, 0001 — изменить можно только заданную температуру и AL1, 0011 — изменить можно только заданную температуру, 0111 — изменить ничего нельзя.
и далее опять по кругу, начиная с AL1.
И в этих настройках можно изменить коэффициенты ПИД на требуемые. Однако чтобы знать на что их менять нужно очень хорошо понимать что делаешь и как это отразится на работе контроллера, или же долго и нудно перебирать их в надежде наткнуться на правильные значения. И чтобы облегчить жизнь простым смертным в контроллере предусмотрена автоматическая настройка этих коэффициентов.
Порядок проведения автонастройки:
Все условия должны быть приближены к реальным. То есть если Вы настраиваете для использования с духовкой, то духовка должна быть подключена, закрыта и температура на контроллере должна быть выставлена на максимальную (можно процентов на 10 меньше) из того диапазона, который предполагается применять в духовке. В процессе настройки контроллер нагреет духовку до этой температуры и подержит ее некоторое время.
Итак, подключили духовку (но пока не включаем ее нагреватели), выставили температуру (я установил 180 градусов), заходим в настройки, перебираем пункты пока не появится AГU, выставляем в 1 младший разряд и выходим из настроек. Начинает мигать индикатор AT. Теперь включаем нагреватели духовки и ждем пока мигание AT прекратится. Контроллер нагревает духовку постоянным нагревом до заданной температуры, выключает нагрев и следит за тем на сколько и как быстро температура превысит заданную после выключения нагрева. Исходя из скорости нагрева, «перескока» температуры и скорости дальнейшего остывания он и вычисляет коэффициенты ПИД. Этот процесс он может повторить 2-3 раза для уточнения.

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

И работа контроллера после этого (тоже ускорено в 10 раз):

Как видно, ПИД остался настроен не совсем оптимально (а никто и не обещал идеала :)), температура перескакивает по инерции заданную аж на 10 градусов. В дальнейшем при желании можно подкорректировать вычисленные им коэффициенты (что я и сделаю на домашней духовке), но при этом нужно понимать что и зачем менять.
Кстати, тот второй, более продвинутый контроллер (он видел слева на видео) справился с автонастройкой гораздо лучше, ничего корректировать не пришлось, перескок температуры на 200 градусах не превышает 2-3 градусов.

Есть и еще один уровень настроек, вход в него осуществляется нажатием и удержанием в течении 3-4 секунд одновременно кнопок «настройка» и «сдвиг». Но туда без необходимости лучше не лазить, а при необходимости внимательно сверяться с мануалом 🙂

Результат всей этой возни 🙂


Итог:
Контроллер своих денег стоит и с работой справляется очень неплохо, особенно если настроить его чуть более тонко, чем предполагает автонастройка. Твердотельное реле тоже отлично справляется с достаточно большой нагрузкой, хотя насчет заявленных 40 ампер у меня очень большие сомнения. Максимум 20, да и то с хорошим радиатором и его активным охлаждением.

Все 🙂

Терморегуляторы для электрокотлов: обзор устройств Auraton 1300, программируемых регуляторов температуры Auraton 2020 TX, недельных программаторов Salus

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

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

Управление теплом с помощью терморегуляторов Auraton

Термоустройство Auraton 1300 может использоваться с отопительными агрегатами всех типов, конвекторами и инфракрасными панелями. Этот прибор чрезвычайно эффективен в вопросе энергосбережения и улучшения комфорта в помещении. Он прост в монтаже и эксплуатации – регулирование температуры осуществляется простым нажатием кнопки.

На жидкокристаллическом экране Auraton 1300 отображается следующая информация:

  • температура в помещении;
  • порядок работы теплогенератора;
  • переключатель «вкл/выкл»;
  • указатель разряда батареек.

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

  • воздуховодных трубопроводов;
  • нагревательных приборов;
  • скрыто проложенных труб и дымоотводящих каналов.

Совет! Прибор необходимо оградить от прямого попадания солнечных лучей.

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

Программируемые терморегуляторы для электрических котлов

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

Недельный программатор для отопительного оборудования (и газового, и электрического) Auraton 2020 TX Plus оснащён удобным большим информативным дисплеем. На нём отображена следующая информация: время, день недели, температура в обогреваемом помещении, выполняющаяся программа. Этот прибор не требует прокладки проводов для монтажа. Цикл работы – 7 суток, количество программ – 3.

Внимание! Программатор Auraton 2020 TXplus оснащён функцией настройки чувствительности контроля температуры в пределах – 0,25-1,00С. Диапазон регулирования – 5-300С.

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

Регулятор температуры оснащён двумя циклами программирования:

  • с понедельника по пятницу можно устанавливать 4 точки переключения температуры в сутки;
  • в субботу и воскресенье – по две точки переключения в сутки.

Внимание! Программатор оснащён возможностью изменения коммуникационного кода. Эта функция позволяет исключить помехи от другого, рядом расположенного беспроводного  оборудования.

Правила установки терморегулятора Auraton 2020 TXplus:

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

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

Недельные программаторы Salus (Британия)

Регулятор температуры для электрических котлов фирмы Salus модели T105RF – это беспроводной недельный программатор, позволяющий задавать два уровня температуры: «комфортный» и «экономный» в интервале 7-300С, с шагом – 0,50С.

На любой день недели можно задавать одну из 9 программ, 6 из которых имеют жёсткие заводские настройки, 3 – могут задавать сами пользователи. Прибор оснащён большим информативным дисплеем с синей подсветкой.

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

Внимание! Если на одном объекте подключено несколько комплектов, то можно выбрать один из 32-х коммуникационных кодов, что исключает взаимное негативное влияние оборудования.

Если при выборе терморегулятора его стоимость играет важную роль, то можно выбрать более дешёвую проводную модель.

что это такое, регулирование температуры ПИД регулятором

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

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

Что такое ПИД регулятор?

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

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

Что такое ПИД регулятор для чайников?

Что такое ПИД регулятор для чайников?

Три коэффициента ПИД регулятора и принцип работы

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

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

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

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

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

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

Интеграл используется для исключения ошибок путем расчета статической погрешности. Главное в этом процессе — подобрать правильный коэффициент, иначе ошибка (рассогласование) будет влиять и на интегральную составляющую.

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

Настройка ПИД регулятора

Настройка ПИД-регулятора осуществляется 2 методами:

  1. Синтез подразумевает вычисление параметров на основании модели системы. Такая настройка получается точной, но требует глубоких познаний теории автоматического управления. Она подвластна только инженерам и ученым. Так как необходимо снимать расходные характеристики и производить кучу расчетов.
  2. Ручной способ основывается на методе проб и ошибок. Для этого за основу берутся данные уже готовой системы, вносятся некоторые коррективы в один или несколько коэффициентов регулятора. После включения и наблюдений за конечным результатом проводится изменение параметров в нужном направлении. И так до тех пор, пока не будет достигнут нужный уровень работоспособности.

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

Современные автоматизированные процессы реализуются как специализированные модули под управлением программ для настройки коэффициентов регулятора.

Назначение ПИД регулятора

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

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

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

Часто ПИД регуляторы используются при регулировке температуры, давайте на простом примере подогрева воды в ёмкости рассмотрим данный автоматический процесс.

В емкости налита жидкость, которую нужно подогреть до нужной температуры и поддерживать её на заданном уровне. Внутри бака установлен датчик измерения температуры — термопара или термометр сопротивления и напрямую связан с ПИД-регулятором.

Для подогрева жидкости будем подавать пар, как показано ниже на рисунке, с клапаном автоматического регулирования. Сам клапан получает сигнал от регулятора. Оператор вводит значение температурной уставки в ПИД-регуляторе, которую необходимо поддерживать в ёмкости.

Что такое ПИД регулятор для чайников?

Что такое ПИД регулятор для чайников?

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

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *