Нужен код ПИД-регулятора ТЭНа 220В ФИУ Ардуино

Roman2344
Offline
Зарегистрирован: 09.09.2015

Есть задача греть ТЭН до 130-135 градусов Цельсия в течении 5минут( и минуты 2 на разогрев до 130градусов), потом постоянно поддерживать температуру 120-125градусов, естественно ТЭН имеет инерционность, ТЭН 370Вт, 220В, сейчас так делаю ардуиной отслеживаю термопарой темпереатуру, потом специальный ОУ для термопар (AD8495), на выходе соответственно 5мВ на градус, всё бы хорошо но управляю я так набросал програмку которая у меня работает так: в цикле Setup я включаю ТЭН а потом каждые 5с. измеряю температуру аналоговым входом и проверяю условие соответствия заданной константе температуры в соответствии с этим либо включен либо выключен ТЭН, константы соответственно 108 - 113 градусов(что соответствует 130-135градусов) заданы меньшими из - за инерционности, и так по 5 ссекунд я отслеживаю в течении 7 минут температуру, далее в цикле LOOP я опять же отслежитваю температуру, уже с меньшими константами и в соответствии с условиями включаю ТЭН на 1 к трём, то есть допустим 3с. ТЭН включен 9с. он отключен, получается своего рода ШИМ со скважностью 33%  на управление семистором. Стабильность у меня получается где - то +-9градусов Цельсия. Вроде бы всё не плохо, но в цикле SETUP если начать греть ТЭН с 90 градусов( то есть когда он нагрет  и имеет температуру 90 градусов) то он может нагреться до 145градусов, если включить ТЭН когда он имеет свою температуру 20-25градусов цльсия, то он в режиме SETUP проскакивает некоторые проверки условий и греется не 7 минут а 4минуты, и нагревается до 118-124градусов Цельсия, вместо нужных мне 130-135градусов. Вообщем думаю сделать это всё с ФИУ, для подачи на ногу МК синусоиды думаю взять трансик с вторичкой вольт на 12, и через делитель подавать на ногу МК отслеживая переход через ноль, и мне нужен кусок кода именно ПИД-регулятора с ФИУ на ардуино. Температуру и всё остальное я под себя подправлю, мне бы код что бы я видел как отследить переход через ноль программно, и какую в связи с этим выдавать мощность то есть на сколько и когда открывать симистор.

Alexino
Offline
Зарегистрирован: 29.12.2015

С трансика и делителя не получите нормальный переход через 0, он у вас может затянуться чуть ли не до половины полупериода.
Если нужна гальразвязка, то потрон. 
Ну а вообще, для управления ТЭНами, ФИУ ни к чему. Лишнии помехи при включении нагрузки. Лучше пропуск периодов.

bwn
Offline
Зарегистрирован: 25.08.2014

Сегодня мода на фазовое управление? Посмотрите здесь. Только ПИД там нет.((((

Roman2344
Offline
Зарегистрирован: 09.09.2015

Alexino пишет:

С трансика и делителя не получите нормальный переход через 0, он у вас может затянуться чуть ли не до половины полупериода.
Если нужна гальразвязка, то потрон. 
Ну а вообще, для управления ТЭНами, ФИУ ни к чему. Лишнии помехи при включении нагрузки. Лучше пропуск периодов.

А есть код с пропуском периодов? Я так понимаю просто включать ТЭН через каждые не 20мс(период при частоте 50Гц), а каждые допустим 40мс., но всё равно ж нужно отслеживать темпераутуру. Вообщем код есть у кого - нибудь? Или условие темпераутуры так и отслеживать но если температура всё ещё не достигла нужной то включать ТЭН через каждые 40мс на 20мс. в этом условии или как? Чёто не пойму.

Alexino
Offline
Зарегистрирован: 29.12.2015

Не понятно, какой код Вам нужен ? Что за такой "код пропуска периодов" ? 
Если Вы сможете отслеживать переход через ноль, то и пропускать сможете. Обычной переменной, в качестве счётчика. Какой там может быть код ?

Roman2344
Offline
Зарегистрирован: 09.09.2015

Ну я имею ввиду скетч глянуть, я так понимаю нужно использовать прерывание  по переднему фронту, а в обработчике прерываний инкрементировать счётчик, и сделать цикл при счётчике=1 и при счётчике равным 2, и при счётчике =2 в этом цикле выполнять включение ТЭНа? То есть пропускаем один период. Но так не получиться прерывания у меня сейчас работают только по пинам(PCINT), а INT, не работают, видимо из - за того что у меня три термопары, использую ардуино мега, видимо прерывания АЦП при измерениях аналоговых входов не дают работать прерываниям INT.

Alexino
Offline
Зарегистрирован: 29.12.2015

Ну внешние прерывания никак не связаны с АЦП. Всё должно работать.

Roman2344
Offline
Зарегистрирован: 09.09.2015

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

Roman2344
Offline
Зарегистрирован: 09.09.2015

Alexino пишет:

Ну внешние прерывания никак не связаны с АЦП. Всё должно работать.

Самое интересное что внешние прерывания работают использую допустим INT0, вот только работает оно если раз 10 очень быстро дотронуться проводом +5В (прерывание по переднему фронту настроено)на INT0 так вот на 10 раз прерывание срабатывает( всё как положено притянуто резистором 10кило к общему), без термопар раньше работало прерывание INT0  и другие внешние основные с первого раза, а сейчас ни одно основное не срабатывает никто не замечал такого на меге? Мне кажеться это из - за того что используеться 3 АЦП(А0, А1,А2, и ещё два АЦП используются для других прерываний PCINTэто А14,А15), а у них приоритет прерываний выше чем у INT0 и других основных внешних прерываний.

Roman2344
Offline
Зарегистрирован: 09.09.2015

В цикле обработчика прерываний INT0 ничего не прописано, оно мне нужно для того что бы перейти в Setup и заново включать ТЭН на 7 минут один раз, а потом переходит в LOOP

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Roman2344 пишет:

В цикле обработчика прерываний INT0 ничего не прописано, оно мне нужно для того что бы перейти в Setup и заново включать ТЭН на 7 минут один раз, а потом переходит в LOOP

Я понимаю, что у Вас сложилось собственное мнение о задаче, есть даже его реализация, и своими замечаниями я только могу "подлить масла в огонь", но все же рискну их сделать, раз работает "не очень".

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

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

3. Если Вас не устраивают релейные алоритмы управления, то для пропорционального управления можно использовать ШИМ. В данном случае нет никакой необходимости с помощью Ардуино считать полупериоды сети. Определитесь с периодом ШИМ исходя из инерционности конкретного процесса и дискретности пропорционального управления мощностью в нагрузке. Чуть упрощенно - хотите "плавность" не хуже 1%, нужно в один период ШИМ уложить не менее 100 полупериодов питающей сети. Для сети в 50 Гц это будет минимум 1 с. Отмеряйте программно период ШИМ в 1 с и длительность времени заполнения (включения) согласно алгоритма управления. В качестве исполнительного элемента используйте твердотельное реле с контролем перехода через "0" (zero crossing). Реле само подаст на нагрузку необходимое количество полупериодов питающей сети, помещающихся в длительность импульса включения.

Применять ФИУ нужно, когда нагреватель - лампа накаливания. От "медленного ШИМа" лампочка даст "быстрого дуба". :)) Использовать ФИУ на ТЭНах - искать себе доп. помеховых приключений при всей добродушности и относительной безобидности такой нагрузки.

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

Roman2344
Offline
Зарегистрирован: 09.09.2015

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

2. А как тогда допустим мне нужно сделать так: прирблизительно 1,5- 2 минуты разогреть ТЭН до 130 градусов, а потом 5 минут так прогреть, и включить зажигание, и это нужно выполнить один раз, а потом нужно держать температуру 120-125градусов бесконечно как это сделать я поэтому и делаю так.

3. А я почти так и делаю я включаю ТЭН в цикле LOOP на 1секунду, и выключаю на 3сек., получается как ШИМ 33% скважность, а у меня и так стоит с  детектором нуля MOC3061 а далее BT136, стабильность ну где - то +-6градусов в цикле LOOP,  при работе в цикле  LOOP через 15минут(то есть когда входит в рабочую точку ТЭН как я понимаю, стабилизируется температура), а до 15 минут где - то +-10градусов стьабильность в LOOP. а В Setup у меня отслеживание температуры раз в 5 секунд, и по условию мало или много температуры включает ТЭН на 6с., выключает на 8с., стабильность при разогреве вместо нужных мне 135градусов максимум, поднимается до 142, если включить ТЭН при 90 градусах( когда ТЭН горячий), потом спускается и держится 130-135градусов, ну а в LOOP нормально 120-126градусов. А если ТЭН включить когда он холодный(20-25градусов) то в цикле SETUP температура поднимается до 118-125градусов, а в LOOP опять же 120-126. Градусов. Меня в основном не устравиает в SETUP что при разной тепературе ТЭН разброс температур, хотя и так сойдёт. И приходится ещё в SETUP и в LOOP делать выключения ТЭНа через какие - то промежутки времени в SETUP допустим через минуту нужно выключить ТЭН на 10с., что бы не пошло вверх, бо бывало начинало расти, а в LOOP у меня если мало температуры включаю ТЭН на 1с, если много выключаю на 2с., и всегда после этого выключить ТЭН на 1с.

Времена я подбором по стабильности температуры в LOOP подобрал.

То есть получается я всё правильно был сделал? Я думал что - то лучше или стабильние придумать, в Сетап допустим мне не нравиться что вдруг температура поползёт, хотя с паузами когда ТЭН выключаю раз в минуту то нормально держится. А и думал я что если отслеживать переход через ноль и делать ПИД то будет гораздо лучше,Ж теперь понимаю, что почти тоже и будет, может не много лучше, но прога усложниться, да и связь с сетью, даже и через опторазвязку пугает.

Спасибо значить я всё правильно сделал, что из ваших слов в каждом случае своя инерционность, и свои способы, время вывода, константы температур с которыми сравнивать и остальное ввсё свое, и контроль так же. И ПИД тут может и не помочь. Так?

 

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Roman2344 пишет:

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

Setup - это не цикл. Это участок программы, выполняющийся однократно при старте Ардуино. Моя рекомендация - использовать его только по назначению: для однократных программных инициализаций, когда Вы явно контролируете все действия.

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

Roman2344 пишет:
2. А как тогда допустим мне нужно сделать так: прирблизительно 1,5- 2 минуты разогреть ТЭН до 130 градусов, а потом 5 минут так прогреть, и включить зажигание, и это нужно выполнить один раз, а потом нужно держать температуру 120-125градусов бесконечно как это сделать я поэтому и делаю так.

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

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

Roman2344 пишет:

3. А я почти так и делаю...

Времена я подбором по стабильности температуры в LOOP подобрал.

Я верю, что описанный Вами алгоритм - вполне рабочий. :)) Вопрос его правильного программного оформления. Нужно, чтобы вся программа в LOOP постоянно крутилась, проверяя временнЫе условия и внешние события для перехода в нужные места. Необходимо устранить ситуации, когда программа затыкается и ждет нужного времени или срабатывания нужного пина, бросая анализ других условий.

Roman2344 пишет:

То есть получается я всё правильно был сделал? ... Спасибо значить я всё правильно сделал, что из ваших слов в каждом случае своя инерционность, и свои способы, время вывода, константы температур с которыми сравнивать и остальное ввсё свое, и контроль так же. И ПИД тут может и не помочь. Так?

Свои рекомендации по организации программы я изложил. Будете Вы им следовать или нет - дело хозяйское.

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

bwn
Offline
Зарегистрирован: 25.08.2014

Вы к сожалению не привели код, но подозреваю, что это длинный loop напичканный if-ами. Выводите все самодостаточные задачи в отдельные функции, а из loop делайте делайте их вызов по необходимости. Про sеtup Duino A.R. уже написал, используйте его по назначению - начальная инициализация после рестарта.