Отвлекитесь, эмбеддеры! Отвлеченные темы - обсудить проблемы тепловой смерти вселенной, или просто пиво. Этот раздел - для отдыха. |
22.11.2017, 21:28
|
|
Вид на жительство
Регистрация: 10.06.2005
Сообщений: 325
Сказал спасибо: 43
Сказали Спасибо 360 раз(а) в 194 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от AR_Favorit
|
И так продолжается до тех пор, пока эти твои умещающиеся в двухбайтный регистр накопления интегральной ошибки не уйдут. А длиться примерно столько же, сколько был прогрев до точки уставки.
Вот так оно произойдет, если ты решишь "умничать феном" с самого начала нагрева, используя озвученные коэффициенты, а алгоритм не будет ограничивать суммарную величину накопленной интегральной составляющей ошибки на некоторой абсолютной величине, а будет полагаться только на ограничение ее вклада коэффициентом.
|
вообще-то у меня
Цитата:
|
double aggKp=30.0;
double aggKi= 9.0;
double aggKd= 1.5;
|
а это означает что и все составляющие ПИДа хранянтся в 4-х байтовом состоянии!
Ну а про 4-х байтовые значения я уже писал
Сообщение от ALEGYR
|
для хранения интегральной составляющей вполне хватит регистра в 32 разряда, и его даже не нужно будет искусственно ограничивать!!!
Ведь он же переполнится только еще через 4294 таких же сумм ошибок!!!
То есть греть бочок с маслом до 1000 градусов с ошибкой в 1000 градусов, и с выборкой пида 1 раз в одну секунду, можно непрерывно в течении 4294967 секунд, или 71582 минут, или 1193 часов, или 49 суток!!!
|
|
|
|
|
22.11.2017, 22:11
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от ALEGYR
|
При выходе на уставку, он просто просто прибавит 1-2 градуса, а потом отнимет 1-2 градуса. Мы же достигли своего, и тихо поддерживаем то чего достигли.
|
Ты ответь на заданный вопрос, а не на тот, который ты придумал. Интегральная составляющая накопила 17000, у тебя интегральный коэффициент 9.0
Какое при этом выходное значение ПИД?
Вот именно поэтому тебе приходится пускать ПИД в дело при уже небольшой ошибке, а не потому, что с начала нагрева с ним было бы медленнее. Ты не знаешь, как его настраивать, и наставил нелепые коэффициенты наугад (точнее, не наугад, а из собственного представления о его работе, но, поскольку оно с действительностью ничего общего не имеет - то в, принципе, "наугад" тоже хорошо описывает процесс))). И если ты зарядишь нагрев с комнатной температуры - у тебя нагреватель сразу выйдет на полную мощность, на которой будет оставаться до ошибки в 8,5 градуса всего лишь за счет пропорциольной составляющей, умноженной на бессмысленный и беспощадный кеф 30.
Включили. Температура 25, уставка 190, ошибка 165, умножаем на 30 - пропорциональная компонента дает вклад в выходной сигнал аж 4950.
В конце алгоритма у тебя стоит ограничитель выходного сигнала, всё, что больше 255, он преобразует в 255.
В итоге нагрев получается все на тех же 100% и с использованием ПИД.
А вот почему у тебя не получилось использовать нагрев с ПИД с начальной точки - это потому, что интегральная компонента при первом же включении получает значение 165*9 = 1485, что тоже гораздо больше максимального выходного сигнала.
Затем ее сразу ограничивает значением 255 то, что ты в моем коде назвал "первым костылем" - те самые две выделенные жирненьким строчки, все просьбы объяснить назначение которых - и вежливые, и нет - ты типа не замечаешь.
И после этого каждая итерация прибавляет и прибавляет к этому значению ошибку, а выделенные строчки исправляют и исправляют значение интегральной компоненты на 255.
А дальше наступает момент истины. При ошибке менее 8,5 вклад пропорциональной компоненты начинает падать. Но интегральная по-прежнему 255, и выходной сигнал по прежнему 255, и нагреватель по-прежнему выдает 100%. И так продолжается до самой точки уставки!!!
И только в тот момент, когда нагрев превысил уставку, ПИД-алгоритм у тебя начинает что-то пытаться исправить. Пропорциональная составляющая выдает уже отрицательный вклад в минус 30 единиц на каждый градус перерегулирования, ну а интегральная начинает уменьшаться.
И на графике температуры у тебя при этом ровный уверенный рост с начала нагрева с характерным выбросом выше уставки, и последующие затухающие колебания, после чего алгоритм уже справляется с поддержанием температуры на нужном уровне.
И всего этого избегают правильной настройкой ПИД, при которой у тебя основной вклад примерно первые две трети времени нагрева вносит пропорциональная составляющая, а оставшуюся треть - интегральная, и к моменту достижения заданной температуры в интегральной компоненте как раз накоплено значение, которое должно быть на выходе ПИД для поддержания этой температуры. И дальше фактически работает одна только интегральная составляющая. Именно она поддерживает текущую температуру. А пропорциональная только ускоряет нагрев.
Это все для твоей системы, неинерционной и линейной, разумеется. НО в принципе, довольно близко вообще для любых нагревателей.
Но ты, как уже говорилось, не смог правильно настроить алгоритм, и вместо этого занялся психическим онанизмом, подбирая точку включения ПИД так, чтобы не было косяка с перерегулированием. Вот такие вещи называются костылем - решение проблемы не теми методами, которыми она должна решаться, из-за непонимания их, или еще по какой причине - а пригораживанием программной подпорки где-то в другом месте.
Вангую, что для уставки 270 градусов тебе придется включать в работу ПИД-алгоритм уже при другом значении ошибки, чтобы избежать выброса на температурном графике.
И в итоге ты придешь к очередной портянке IF-ов, определяющей, при какой ошибке включать в работу ПИД в зависимости от уставки.
И вся эта хренатень - просто оттого, что ты вместо того, чтобы почитать о работе алгоритма и напрячь свой слабенький межушный узел, предпочитаешь часами гундосить тут, какой ты крутой, подтверждая это... ничем.
Враг вступает в город,
Пленных не щадя,
Оттого, что в кузнице
Не было гвоздя
Сообщение от ALEGYR
|
В это время нас больше беспокоят помехи (неожиданные порывы ветра в виде сквозняков). Но для "скозняков" у ПИД-регулятора есть дифференциальная составляющая. Она быстро внесет в регулирующий сигнал свой весомый вклад, и быстро успокоится. Ну а дальше регулятор будет продолжать делать свое дело.
|
У тебя дифференциальный кеф 1,5 при несоизмеримых пропорциональном 30 и интегральном 9.
Например, резкое падение температуры на 5 градусов ("порыв ветра") от поддерживаемых 190 заставит пропорциональную компоненту подбросить в выходной сигнал 150 единиц и интегральную - 45. А дифференциальная у тебя вычтет из текущей ошибки 5 прошлую ошибку ноль и умножит результат на 1,5, и получив 7.5, не очень "весомые" на фоне 195, выданных другими компонентами.
Нужно не порыв ветра, а резко вынести установку из квартиры на улицу в зимний мороз, чтобы дифференциальная составляющая внесла хоть сколько-то заметный вклад. И все равно он будет перекрыт несоизмеримо большим вкладом остальных компонент.
Мелкие "сквозняки" в твоей настройке исправляет почти исключительно интегральная составляющая. В особо крупные (ну может у тебя там стены в мороз рушатся, а паять надо))) к ней присоединяется пропорциональная.
А дифференциальная в твоей линейной системе вообще не нужна. Не работает она в ней.
Последний раз редактировалось AR_Favorit; 22.11.2017 в 22:45.
|
|
|
|
22.11.2017, 22:13
|
|
Почётный гражданин KAZUS.RU
Регистрация: 02.07.2009
Сообщений: 1,110
Сказал спасибо: 1,246
Сказали Спасибо 2,178 раз(а) в 624 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Мдя опять за за свое. У вас обоих черте что написано. у одного интегратор. у другого интервал воздействия. и ни у одного второй ступени регулятора - корректора мощности в котором попугаи пида пересчитываются в реальное воздействие
Алгоритм то предельно прост.
1 проводим измерения. кому хочется в градусах - переводим в градусы. кому хочется - в отсчетах АЦП.
2 проводим расчет попугаев ПИДа.
3 В корректоре мощности приводим попугаев к реальному воздействию. то есть на какое время нужно включить нагреватель за период регулирования.
4 Запускаем подпрограмму отвечающую за нагреватель.
5 Заносим необходимые даные для дальнейшего расчета.
6 запускаем таймер периода регулирования.
7 занимаемся своими делами пока не окончится период регулирования. переходим к пункту 1
Все!!! больше нечего не надо придумывать. и не чего подобного я у Вас не увидел. Реализация зависит от искуства программиста.
|
|
|
|
22.11.2017, 22:19
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от ALEGYR
|
вообще-то у меня
Ну а про 4-х байтовые значения я уже писал
|
Да и писал ты, и какал, и блевал тут уже, но всё не по делу, но я не поленюсь спросить еще раз: каким боком к обсуждаемому моменту относится переполнение переменной?! Тупая ты башка, речь о том, что как раз никакого переполнения не будет, а просто в твоей не переполнившейся аж четырехбайтной - итить, круто! - переменой накопится ахерительно большое значение, на порядки превышающее максимальный выходной сигнал ПИДа, некоторой составной частью которого оно вообще-то должно являться. И все, и пипец, уставка достигнута, надо поддерживать на выходе скромные 160-180, а у тебя одна интегральная компонента накопила значение на 2 порядка больше, да ты еще и на 9 его умножил.
Ты не пробовал хотя бы раз попытаться подумать над тем, что написано, а не действовать по принципу чат-ботов, которые увидев слово, которое знают, выдают рандомную фразу с его присутствием? Очень уж похоже.
|
|
|
|
22.11.2017, 22:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от stalkernet
|
Мдя опять за за свое. У вас обоих черте что написано. у одного интегратор. у другого интервал воздействия. и ни у одного второй ступени регулятора - корректора мощности в котором попугаи пида пересчитываются в реальное воздействие
Алгоритм то предельно прост.
1 проводим измерения. кому хочется в градусах - переводим в градусы. кому хочется - в отсчетах АЦП.
2 проводим расчет попугаев ПИДа.
3 В корректоре мощности приводим попугаев к реальному воздействию. то есть на какое время нужно включить нагреватель за период регулирования.
|
Какой еще "корректор мощности?!"
Не корректор мощности, а преобразователь выходного значения ПИД алгоритма в период шим (в данном случае).
И если вы посмотрите в мой код на первой странице, только очень внимательно посмотрите, а не будете по примеру топикстартера разбрасываться глупостями, не разобравшись, то обнаружите, что в моем случае выходное значение ПИД в диапазоне от 0 до (период регулирования * 1000) в точности соответствует как раз времени (в миллисекундах) включенного состояния нагревателя за весь период регулирования. Не нужно мне преобразовывать эту величину потому, что у меня порядок величин, использованный в расчетах, выбран так, чтобы сразу именно в нужных единицах выдавать результат.
Причем алгоритм может выдать и больше 100%, это в моем случае неважно, нагреватель все равно отработает ровно 100%.
|
|
|
|
22.11.2017, 22:39
|
|
Заблокирован
Регистрация: 16.05.2015
Адрес: Болгария
Сообщений: 1,460
Сказал спасибо: 286
Сказали Спасибо 1,125 раз(а) в 540 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Неплохо порытся в архивах. Объяснить решение уравнений методом случайного поиска.
Во тогда будет склока
|
|
|
|
22.11.2017, 22:39
|
|
Вид на жительство
Регистрация: 10.06.2005
Сообщений: 325
Сказал спасибо: 43
Сказали Спасибо 360 раз(а) в 194 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от AR_Favorit
|
Цитата:
|
Сообщение от ALEGYR
БАХ!!!
и вот уже есть первая строка с костылем
if (pid_counter‹(EE_PID_TIME*1000)) pid_counter++;
|
Идиот, это не костыль, и не часть ПИД алгоритма. Это вызов функции с нужной периодичностью
|
Я понимаю, что тебе было лень использовать аппаратные таймеры контроллера, и даже с некоторым сомнением, допускаю, что ты просто забыл как их запрограммировать на прерывания, но ты ввел не очень нужную для ПИДа переменную, и ввел ее контроль в код программы! То есть, занял дополнительные ресурсы контроллера, и увеличил время выполнения всей программы лишними действиями! Это я и называю костыль - для себя любимого!!!
Сообщение от AR_Favorit
|
Цитата:
|
Сообщение от ALEGYR
Цитата:
|
БАХ!!! - и вот уже есть третья строка с костылем
if (control›heat_counter) HEAT_ON; else HEAT_OFF;
|
|
Дебил, это не костыль, а исполнительная часть, преобразующая выходной сигнал ПИДа в ШИМ управление нагревателем.
|
Я понимаю, что тут ты включаешь умного, и думаешь что создал исполнительную часть, преобразующую выходной сигнал ПИДа в ШИМ управление нагревателем.
Но именно тут ты и поставил НАСТОЯЩИЙ КОСТЫЛЬ(!!!), тупо похерив само ПИД регулирование, и заменив его простым релейным регулированием, которое иногда называют " ВКЛ-ВЫКЛ"
Ведь ты, со всеми своими программными косяками, и особым трепетом к значению интегральной составляющей, считал значение управляющего воздействия ПИД, (которое у тебя называется control), а потом берешь его и выкидываешь (!) вводя условие, что пока оно (переменная control) больше твоего костыля heat_counter, то мы херим ПИД и тупо греем бачок!!!
Твой генератор ШИМ ведь не управляется сигналом control, а управляется сигналами HEAT_ON или HEAT_OFF!!! То есть ВЛК реле или ВЫКЛ реле!
Сигнал control изменил свое значение с 34 на 35, а ты в свое ШИМ управление нагревателем, просто передаешь HEAT_ON , пока heat_counter будет или 15, или 16, или 17, или даже 34!!!
Последний раз редактировалось ALEGYR; 23.11.2017 в 03:51.
|
|
|
|
22.11.2017, 22:44
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от ALEGYR
|
Во-первых, нагрев фена, до температуры на 20 градусов меньше уставки, производиться на максимальной мощности, и БЕЗ участия ПИД регулятора. А это значит, что все значения интегральной составляющей не будут превышать 20 градусов, все время выхода на уставку, и не превышать 1 градуса с моментв выхода на уставку!
|
Вот она, полнейшая непособность прочитать самим же использованный код!
Ты запустил ПИД в работу при ошибке в 20 градусов.
При первой итерации выполнилась строчка
outputSum+= (ki * error);
И значение интегральной составляющей стало 9* 20 = 180!!!
Через полсекунды следующий вызов, скажем, с ошибкой уже 18
Строчка
outputSum+= (ki * error);
выполнилась еще раз.
К текущему значению outputSum прибавилось 9*18, 180+9*18 = 342!!!
Где же оно у тебя "не превышает 20"?!?!?!
Потом ограничитель срубает это значение до outMax, которое у тебя составляет 255 (если ты не забыл его установить)))
А потом к нему снова и снова прибавляется текущая величина ошибки, умноженная на 9. И только когда ошибка станет равна нулю, твоя бедная интегральная компонента успокоится. Но она одна при этом будет лупить 100% в нагреватель.
И только после превышения уставки добавляемые к ней значения окажутся отрицательными, и всего за несколько итераций она вернется к пристойным 160-180, соответствующим мощности, которые надо выдавать на твой фен для поддержания достигнутых 190 градусов...
Ардуинщики ![Мистер Грин](images/smilies/icon_smilegreen.gif) ![Мистер Грин](images/smilies/icon_smilegreen.gif)
|
|
|
|
22.11.2017, 22:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.01.2007
Сообщений: 3,123
Сказал спасибо: 61
Сказали Спасибо 1,153 раз(а) в 624 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от stalkernet
|
Алгоритм то предельно прост
.......
.......
|
Стесняюсь, но спрошу:
Это алгоритм чего?
А то можно и короче:
- измерили
- вычислили
- порегулировали
![Валяюсь от смеха](images/smilies/icon_biggrin.gif) ![Валяюсь от смеха](images/smilies/icon_biggrin.gif)
ALEGYR отдыхает.
|
|
|
|
22.11.2017, 23:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от ALEGYR
|
Я понимаю, что тебе было лень использовать аппаратные таймеры контроллера, и даже с некоторым сомнением, допускаю, что ты просто забыл как их запрограммировать на прерывания, но ты ввел не очень нужную для ПИДа переменную, и ввел ее контроль в код программы! То есть, занял дополнительные ресурсы контроллера, и увеличил время выполнения всей программы лишними действиями! Это я и называю костыль - для себя любимого!!!
|
Таки продолжаешь демонстрировать свою ущербность. Нет там никакого "увеличения времени выполнения программы". И это НЕ костыль. Это обычная реализация - может и не самая оптимальная, а может, мне тупо удобнее было при разводке платы использовать ногу проца, на которую нельзя вывести аппаратный ШИМ. Никто не обязывает его использовать - программный в данном случае ничем не хуже.
Сообщение от ALEGYR
|
Но именно тут ты и поставил НАСТОЯЩИЙ КОСТЫЛЬ(!!!), тупо похерив само ПИД регулирование, и заменив его простым релейным регулированием, которое иногда называют "ВКЛ-ВЫКЛ"
|
Ты идиот. Релейное регулирование - это включение и выключение нагревателя по уставкам. Где ты такое увидел?!
Сообщение от ALEGYR
|
Ведь ты, со всеми своими программными косяками, и особым трепетом к значению интегральной составляющей, считал значение управляющего воздействия ПИД, (которое у тебя называется control), а потом берешь его и выкидываешь (!) вводя условие, что пока оно (переменная control) больше твоего костыля heat_counter, то мы херим ПИД и тупо греем бачок!!!
|
Таки ты действительно кретин.
Сообщение от ALEGYR
|
Твой генератор ШИМ ведь не управляется сигналом control, а управляется сигналами HEAT_ON или HEAT_OFF!!! То есть ВЛК реле или ВЫКЛ реле!
Сигнал control изменил свое значение с 34 на 35, а ты своему в свой ШИМ управление нагревателем, просто передаешь HEAT_ON , пока heat_counter будет или 15, или 16, или 17, или даже 34!!!
|
А что такое, по-твоему, ШИМ, чучело?!
А теперь смотри сюда, дебил тупой. Ты уже реально утомил нести свою идиотскую херь.
Каждую секунду происходит следующее:
1) Нагреватель включается (control›0, heat_counter==0, control›heat_counter)
2) Каждую миллисекунду heat_counter увеличивается на единицу.
Если значение heat_counter достигло величины control, нагреватель выключается, иначе остается включенным.
3) по достижении значения 1000 heat_counter становится равным нулю. Цикл повторяется до бесконечности.
Что происходит при control == 100?
В начале цикла нагреватель включается, 100 мс остается включенным, и 900 мс находится в выключенном состоянии, и так по кругу.
Что происходит при control == 300?
В начале цикла нагреватель включается, 300 мс остается включенным, и 700 мс находится в выключенном состоянии, и так по кругу.
Что происходит при control == 652?
В начале цикла нагреватель включается, 652 мс остается включенным, и 348 мс находится в выключенном состоянии, и так по кругу.
Понимаешь, дебил?
На "релюшку", которой твоему больному мозгу представляется управляющее нагревателем оптореле идет именно ШИМ-сигнал. С частотой 1 герц (при периоде регулирования 1с). И с коэффициентом заполнения, заданным в переменной Control (0 = заполнение 0%, 1000 = заполнение 100%).
И чем это похоже на "релейное регулирование"?
Не понимаешь - спроси. Тут же есть люди, которые чайникам такие вещи разжевывают.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:55.
|
|