Официальный сайт компании Arduino по адресу arduino.cc
ПИД регулятор нужна критика и конструктивные предложения по алгоритму (Библиотеку ПИД не предлагать)
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Ср, 15/10/2014 - 14:13
Делаю ПИД регулятор для водогрейного электрического котла.
void PID(){ err=ust-temp; I=I+err; zad=Kp*err+(Ki*I*0.25)+(Kd*(err-pre_err)/0.25); pre_err=err; if (zad<0){ zad=0;} if (zad>100){zad=100;} }
Что в него можно есче добавить, а что изменить?
По переменным temp-измеренная температура, ust-уставка, zad-управляющее воздействие (0-100%) буду управлять полупериодами по алгоритму Брезенхема, err-ошибка (рассогласование),pre_err-прошлая ошибка, I-интегральная составляющая (остальные составляющие расчитываються прям в формуле), Kp,Ki,Kd-коэффициенты ПИД, 0.25-частота расчета алгоритма ПИД (Функцию void PID() вызываю каждые 0.25с.
Что в него можно есче добавить, а что изменить?
Да что угодно. Можно чтоб он тостер утром включал, можно чтоб гимн пиликал через динамик, вариантов куча
Мене больше интересны предложения относительно самого алгоритма ПИД.
В приборе никаких излишеств, чистый функционал.
Что в него можно есче добавить, а что изменить?
Ну, как минимум, вспомнить, что 0.25 - это 1/4.
И избавиться от умножения/деления на число с плавающей точкой.
Какой-никакой прирост производительности (впрочем, в данном случае это некритично) и уменьшение размеров прошивки.
Функцию void PID() вызываю каждые 0.25с.
И что, температура в котле за это время успевает измениться? Одному мне кажется, что при такой частоте опроса датчика дифференциальная часть этой формулы будет реагировать скорее на погрешности в измерении температуры, чем на собственно изменение???
Вот блин не поверишь. Но есть люди и их очень много. Которые верят что если на период когда дома никого нет понижать/повышать в доме температуру то это принесет экономию и что можно в доме изменить температуру в течении 20 минут на 10-15 градусов. Они не понимают что либо дом должен быть с коробку от холодильника, либо в этот доме нужно подорвать ядреную бомбу что бы резко образовалось нужное количество энергии.
И именно такие люди и измеряют температуру 4 раза в секунду, ибо читай выше, температура у них меняется резко и непредсказуемо!
А зачем для котла вообще нужен пид регулятор с огромной инертностью системы .
Хотя может автор проводит сверхночные опыты по физике или химии.
Если бы Вы внимательно посмотрели код, то заметили бы что в нем нет опроса датчика температуры, он опрашиваеться другой функцией и реже, а эта функция только расчитывает управляющее воздействие.
Что в него можно есче добавить, а что изменить?
Ну, как минимум, вспомнить, что 0.25 - это 1/4.
И избавиться от умножения/деления на число с плавающей точкой.
Какой-никакой прирост производительности (впрочем, в данном случае это некритично) и уменьшение размеров прошивки.
Производительность никогда не помешает.
В котле стоял би металический термостат, у которого переодически залипали контакты и котел перегревался (знаю про пускатели и тврдотельные реле, сам электрик). После переезда на новую квартиру, дочь (4 года) включила пустой котел и как следствие тен згорел, решено было отремонтировать котел и заодно произвести модернизацию. Планирую еще если всё нормально будет работать поставить такойже регулятор в банный комплекс на приточку с нагревателем.
Тогда и датчик наличия жидкости поставьте обязательно. А действительно, зачем котлу ПИД, да еще и такой быстрый? ИМХО по гистерезису в 2-4 градуса (стандарт для котлов 2 или 10 градусов) будет не хуже работать. Я не спец по котлам, но в инкубаторах кое-что понимаю. Так даже в них 90% птицеводов используют релейный принцып поддержания температуры. Правда гистерезис поменьше. А у многих вообще аналоговые регуляторы используются и ничего.
Хочеться чтото универсальное и недорогое.
Писал выше (Планирую еще если всё нормально будет работать поставить такойже регулятор в банный комплекс на приточку с нагревателем.), возможно на управление электрокаменкой в сауне. На котле отладка будет.
Из всех ответивших пока только step962 по делу ответил, остальные...
Ну а что еще о 8 строчках кода можно сказать? Вы уж весь опубликуйте пожалуйста.
Что вообще делает
void
PID() если она ничего не возвращает и ничем не управляет? Просто значения присваивает?
Весь так весь
Код еще сыроват и не оптимизирован, но рабочий.
void PID() расчитывает управляющее воздействие на нагреватель в % (глобальная переменная zad :) ), далее эта переменная берется в функции ResOUT() которая вызываеться от внешнего прерывания детектора нуля для расчета по алгоритму Брезенхема пропустить полуволну синусойды питающей тен сети или нет.
Del
которая вызываеться от внешнего прерывания детектора нуля
подскажите как сделать - внешнее прерывание детектора нуля
нашел интерессный алгоритм - На основе 3-х температур: прогноза, реальной температуры и целевой, происходит расчет времени включения подогрева. Т.е. программа делает прогноз температуры, учитывает инерцию нагрева, и отключает нагрев заранее, что позволяет удерживать температуру точнее, при максимальной скорости нагрева.
вся статья по ссылке http://we.easyelectronics.ru/Tools/pechka-za-1580-rubley-chast-2-upravlenie-i-primer-raboty.html
может пригодится
Всем доброго времени суток!
yul-i-an, по самому алгоритму ПИД-регулятора (расчету управляющего воздействия) добавить что-либо тяжело. Единственное, что я бы изменил в расчете, это убрал жесткую зависимость от времени вызова процедуры регулятора, например, передавая в процедуру время между вызовами. Воздух в доме - объект весьма и весьма инерционный, особенно если учесть то, что перемещение нагретых воздушных масс происходит только засчет конвекции, а не перемешивается, к примеру, вентилятором. Отсюда вызывать процедуру регулирования каждые 250 мс, на мой взгляд, очень часто. Хотя бы от одной секунды, не чаще. А освободившееся время уделите обработке сигнала с датчика: делайте выборку, примените фильтрацию. Иначе от скачкообразных погрешностей измерения Ваша Д-составляющая будет только мешать, и Кд будет очень мал. Не исключено, что при настройке Вы придете к более простым законам регулирования - ПИ- или П-регуляторам. Подумайте над тем, где Вы установите датчик, чтобы от отражал именно температуру в комнате, а не у батареи или у окна. Еще рекомендую добавить переключение режима работы: ручной/автоматический. Пригодится, если регулятор уйдет в автоколебания при каких-нибудь настройках, и его понадобится отключить, выставив управляющее воздействие вручную.
Прислушатесь к тому, что Вам уже здесь посоветовали, многое озвучивалось ранее.
http://arduino.ru/forum/proekty/sutochnyi-termostat-dlya-gazovogo-kotla?...
А зачем для котла вообще нужен пид регулятор с огромной инертностью системы .
Хотя может автор проводит сверхночные опыты по физике или химии.
Чем больше инертность тем как раз таки полезнее ПИД. При нулевой инеции вы получите отличное регулирование в релейном режиме, а вот с высокой инерцией реальная температура без ПИД будет скакать в стороны тем сильнее чем больше инерция. Представьте вы включиле нагрев и ждете когда датчик вам скажет, что вы достигли температуры. При высокой инерции это произойдет тогда когда энергии будет произведено намного больше чем нужно, и она будет продолжать нагревать уже после того когда вы выключите нагрев. В итоге перегрев будет ощутимым.
Вряд-ли, даже совсем не так! .....
Масса той воды, что мы греем, намного больше массы самого нагревателя. И "накопленная" в нём энергия быстро утилизуется этой водой. К тому-же в бойлерах датчик стоит не на самом дне, где его никогда не прогреть, а посередине, и при отключении нагревателя вода прогреется " ниже" датчика. Всего-лишь..... Не критично.
схема детектора нуля и управления симистором.
Тут про прерывания.
Схема рабочая, сам ей пользуюсь.
Видео работы.
а как решили с детектором нуля ту проблему, что он срабатывает только на одну полуволну? Я вынуждел был на входе диодный мост ставить, чтобы ловить обе полуволны
Так там по схеме и стоит диодный мостик.
тоже регулятор нужно в алгоритм, только для сервопривода. Что такое детектор нуля и зачем он нужен?
тоже регулятор нужно в алгоритм, только для сервопривода. Что такое детектор нуля и зачем он нужен?
Сетевое напряжение 220В переменное 50Гц, тоесть 50 раз в секунду меняеться полярность - напряжение переходит из положительного в отрицательное. Детектор нуля необходим чтобы уловить момент перехода через ноль.
Чтобы использовать закон регулирования Вам нужна будет обратная связь (знать текущее положение сервы)
Потомучто регуляторы выполняют свои расчеты исходя из величены рассогласования регулирования и его знака.
Вот например вполне рабочий ПИ регулятор
Он применялся на терморегуляторе.
.
Вот например вполне рабочий ПИ регулятор
Он применялся на терморегуляторе.
Здравствуйте.
Если Вас не затруднит, добавьте комментарии ко всем строчкам кода.Я с трудом пока понимаю C/C++, по этой причине хотелось бы самому разобраться как это работает, а не просто копировать Ваш код.
Спасибо.
Так там вроде все откопентированно.
Чтобы код ПИД регулятора лучше понять нужно его изучить и понять как он функционирует.
Последняя реализация http://arduino.ru/forum/proekty/narodnyi-inkubator?page=2#comment-328166
Может она понятнее будет.
...
dorian, разбирать работу ПИД по коду на С - занятие крайне неблагодарное вообще. А если Вы еще и не умеете читать (на С) - дело вообще бесперспективное.
Следуйте общему правилу: если Вы не знаете, как решить некоторую задачу, разбейте ее на задачи попроще. Для начала освойте С/С++, сделайте пару-тройку проектов попроще, а когда будете себя чувствовать увереннее, разберитесь с ПИД по литературе, попытайтесь написать ПИД либо какую-либо из его частей сами, и только потом решайте, что для Вас проще - разбираться с имеющимся кодом или написать свой.
А то, что Вы просите "откомментировать" готовый код - вряд ли кто согласится делать это иначе как за деньги, потому что занятие абсолютно глупое и, более того, - неправильное: комментарии служат не затем, чтобы пояснить, что делает код (а Вы просите именно об этом), т.к. это должно быть видно из самого кода, а то, зачем он (код) это делает. Т.е. в комментариях должно содержать только то, чего нет в самом коде. Соответственно, по имеющемуся коду такие комментарии составить просто невозможно.
Я понял, что мой вопрос не вписался в общую концепцию темы...Модератор, прошу удалить мои сообщения или я сам их затру.
Математика регулирования мне понятна и из кода в том числе (кроме нескольких строк).
Правильно ли я понял:
byte PIctl(float temp, float ust) - если не затруднит, поясните как это работает.
byte zad=0 - объявление переменной zad битового типа и запись в нее значение ноль.
float e, p - объявление переменной e и p типа флоут.
zad=byte(p+i) - сумма переменных p и i преобразуются в битовый тип и записывается в переменную zad.
Расставим точки.
Прошу прощения!Байтового типа.
Это функция. Возвращает байт. В нее передаются 2 значения типа float. Дальше в самой функции идет какое-то вычисление. Функцию надо вызывать в основном цикле программы или из другой функции. То есть вызываем функцию и передаемс в нее 2 float числа, на выходе получаем другой число типа байт. Что-то с ним дальше делаем. Ну это же азы Си. Как такое можно комментировать не зная степени незнания читающего? Может он и float что значит не знает.