Перегрев бойлера. Нужно решение без PID

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

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

Суть: грею мощным ТЭНом бойлер из нержавейки, с комнатной (25С) до заданной (110С) греется за 4 минуты, но нержавейка обладает плохой теплопроводностью, отсюда имеем запаздывающие показания при первом разогреве (75С при кипении воды), погрешность в 5С при поддержании температуры меня вполне устраивает.

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

Примечание. tempnow и tempset - температура в данный момент времени и заданная температура соответственно.

1. Включаем счётчик (инкремент переменной t, которая изначально равна нулю).

2. Берём начальную температуру (tempstart)

3. Если температура с датчика больше разности заданной температуры и начальной температуры (if (tempnow > tempset - tempstart) ) , то запускаем обратный отсчёт (декремент t/3 до нуля)

повтор.

 

Иными словами, греем ТЭН 3 минуты, 1 минуту ждём, снова греем 60 секунд, 20 ждём, 20 греем, 7 ждём и выходим на поддержание температуры, где температура колеблется в пределах 5 градусов (для меня это норма) и ТЭН включается на 10 секунд раз в 2 минуты.

Ваши мысли? Где я прав, где нет?

b707
Offline
Зарегистрирован: 26.05.2017

это что-то вроде ПИДа и будет

Не вполне понял, почему дачтчик запаздывает аж на 25 градусов... и причем тут теплопроводность нержавейки. Вы датчиком температруру стенки бойлера меряете. что ли?

rkit
Offline
Зарегистрирован: 23.11.2016

Если не хочешь пользоваться тем, до чего сам не дошел, то чего ты тут спрашиваешь? Давай, доходи сам.

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

b707 пишет:

Вы датчиком температруру стенки бойлера меряете. что ли?

Да, идёт замер стенки бойлера. Такая конструкция из экономических соображений.

b707 пишет:

это что-то вроде ПИДа и будет

Или просто ПИ, без этой формулы - просто П.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

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

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

mykaida пишет:

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

Всё это можно, более того, в другом своём проекте даже реализовал с готовой библиотекой PID, но в данной жизненной ситуации (давайте мы назовём это "слететь с гарантии") исходные данные в первом сообщении.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Вокруг датчика теплоизолируйте стенку.

vde69
Offline
Зарегистрирован: 10.01.2016

прям 1 в 1 подойдет :) http://arduino.ru/forum/proekty/kontroller-mufelnoi-pechi

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Опытным путём пришёл к тому, что, грея с 25С до 100С "перебег" составляет 10 градусов, грея с 70С до 120С - уже 6-7.

То есть, порядка 10-15%. Задача сводится к тому, чтобы за 10-20% от конечной точки прервать операцию на 30-60 секунд.

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

В первом сообщении вообще не так написал формулу. Подумал и сделал так:

(steinhart - это рассчитанная по формуле текущая температура бойлера, btimer - обычный счётчик, изначально равен нулю)

        //если стартуем или время простоя вышло, записываем в tempstart текущую температуру
        if (btimer <= 0){
          tempstart = steinhart;
          btimer = 0;
        }
        //если тек.темп. меньше, чем разница заданной температуры и (половина разницы заданной температуры бойлера и начальной температуры)
        if (steinhart < boilertemp - (boilertemp - tempstart)/2 ){
          digitalWrite(ten,1); //включение тэна если ниже
          btimer++;            //увеличиваем таймер
        } else {
          digitalWrite(ten,0); //выключение тэна если равно или выше целевого показателя температуры
          btimer = btimer - 10; //как декремент, но в 10 раз быстрее...
        }
Суть какая? Если включили устройство и бойлер в состоянии покоя находится при 25С, а надо догреть до 125, то половина разности этих температур - 50 градусов. На отметке 125-50 = 75 отключаем ТЭН и ждём одну десятую того времени, что грели.
На втором цикле температура бойлера дойдёт до 100 и половина разности целевой и текущей температур составит уже 12.5 градусов. То есть, ТЭН надо будет отключить при значении термодатчика 125-12.5 = 112.5, после простоя разница ещё снизится и составит уже пару градусов, то есть, выходим на обычное П-регулирование (меньше 125 - включаем ТЭН, больше - отключаем).
nik182
Offline
Зарегистрирован: 04.05.2015

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

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

nik182 пишет:

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

Соглашусь с коллегой. Только правильнее для управления построить 2 функции (они до кипения будут неразрывные) не менее третьего порядка.

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

nik182 пишет:

У  Вас есть запаздывание реакции датчика на температуру. Ждать одну десятую нагрева это движение в правильном направлении, но лучше сразу делать расчёт температуры с учётом запаздывания.

Именно, запаздывание реакции (причину даже можно опустить).

Уточню с ожиданием: ждать 1/10 нагрева только "в конце пути", тем самым идёт П - регулирование (без И и Д), но с "торможением" в конце. То есть, ТЭН не дёргаем, а включаем на полную мощность и притормаживаем лишь на финишной прямой.

Меня этот вариант вполне устроил, есть перебег в 3 градуса (1%), что вполне для моих задач приемлимо (задача - на максимальной мощности без дёрганья ТЭНа выйти близко к заданной температуре и дальше поддерживать в пределах 2-3 градусов).

nik182
Offline
Зарегистрирован: 04.05.2015

А со временем датчик подползёт к температуре уставки, но запаздывание останется. Как в таких условиях отслеживать температуру в пределах нескольких градусов не понятно. Нужно дергаться по малейшим дельтам. Именно для этого нужны графики - понимать в каких условиях на сколько дёргать. Универсального не получится. Долейте немного холодной воды в объём при установившейся хотя бы 10 минут нормальной температуре и посмотрите на реакцию - через сколько сработает датчик на догрев?   

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

nik182 пишет:

А со временем датчик подползёт к температуре уставки, но запаздывание останется. Как в таких условиях отслеживать температуру в пределах нескольких градусов не понятно. Нужно дергаться по малейшим дельтам. Именно для этого нужны графики - понимать в каких условиях на сколько дёргать. Универсального не получится. Долейте немного холодной воды в объём при установившейся хотя бы 10 минут нормальной температуре и посмотрите на реакцию - через сколько сработает датчик на догрев?   

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

Имеется устройство, генерирующее пар (вода и пар в бойлере при давлении 1.5 бар и температуре 125С), всё это контролируется прессостатом (вещь относительно дорогая - от 1000 до 3500 руб., капризная и довольно неточная), то есть, в момент падения давления до 1.4 бар, включается ТЭН, при достижении 1.6 бар - выключается.

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

Плюсы: прогрев идёт до заданного давления (на 100% мощности) и лишь затем идёт поддержание давления

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

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

Да, код получился весьма простеньким, но оно же работает. Здесь использование PID - это как использование двигателя от камаза на оке (ага, написал, а потом подумал, ведь ока и выпускается камазом, ну да ладно, вы и так поняли)

nik182
Offline
Зарегистрирован: 04.05.2015

Ну вот. Задача совсем другая. Не хорошо так делать. 

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

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

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

nik182
Offline
Зарегистрирован: 04.05.2015

Не знаю. ПИД работает так, как его программируют. Всё зависит от исполнительного механизма. А если он не умеет плавно а только вкл откл? ПИД уже не применить?

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

А почему нельзя контактами прессостата коммутировать низковольтную цепь и получать лог сигналы на входе контроллера?

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Можно. Но зачем иметь погрешность 0.2-0.3 бар, если тензодатчик-манометр даст на два порядка меньшую погрешность при сопоставимой цене?

Morroc
Offline
Зарегистрирован: 24.10.2016

nik182 пишет:
А если он не умеет плавно а только вкл откл? ПИД уже не применить?

Один из режимов работы подогреваемого столика у 3Д принтеров именно вкл/откл через реле. Можно даже попробовать наковырять оттуда алгоритм автоподбора коэффициентов.