Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Отвлекитесь, эмбеддеры! Отвлеченные темы - обсудить проблемы тепловой смерти вселенной, или просто пиво. Этот раздел - для отдыха.

 
Опции темы
Непрочитано 22.11.2017, 21:28  
ALEGYR
Вид на жительство
 
Регистрация: 10.06.2005
Сообщений: 325
Сказал спасибо: 43
Сказали Спасибо 360 раз(а) в 194 сообщении(ях)
ALEGYR на пути к лучшему
По умолчанию 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 суток!!!
ALEGYR вне форума  
Непрочитано 22.11.2017, 22:11  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию 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.
AR_Favorit вне форума  
Непрочитано 22.11.2017, 22:13  
stalkernet
Почётный гражданин KAZUS.RU
 
Регистрация: 02.07.2009
Сообщений: 1,110
Сказал спасибо: 1,246
Сказали Спасибо 2,178 раз(а) в 624 сообщении(ях)
stalkernet на пути к лучшему
По умолчанию Re: Мои ответы на вопросы [b]AR_Favorit[/b]

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

Алгоритм то предельно прост.

1 проводим измерения. кому хочется в градусах - переводим в градусы. кому хочется - в отсчетах АЦП.
2 проводим расчет попугаев ПИДа.
3 В корректоре мощности приводим попугаев к реальному воздействию. то есть на какое время нужно включить нагреватель за период регулирования.
4 Запускаем подпрограмму отвечающую за нагреватель.
5 Заносим необходимые даные для дальнейшего расчета.
6 запускаем таймер периода регулирования.
7 занимаемся своими делами пока не окончится период регулирования. переходим к пункту 1

Все!!! больше нечего не надо придумывать. и не чего подобного я у Вас не увидел. Реализация зависит от искуства программиста.
stalkernet вне форума  
Непрочитано 22.11.2017, 22:19  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: Мои ответы на вопросы [b]AR_Favorit[/b]

Сообщение от ALEGYR Посмотреть сообщение
вообще-то у меня
Ну а про 4-х байтовые значения я уже писал
Да и писал ты, и какал, и блевал тут уже, но всё не по делу, но я не поленюсь спросить еще раз: каким боком к обсуждаемому моменту относится переполнение переменной?! Тупая ты башка, речь о том, что как раз никакого переполнения не будет, а просто в твоей не переполнившейся аж четырехбайтной - итить, круто! - переменой накопится ахерительно большое значение, на порядки превышающее максимальный выходной сигнал ПИДа, некоторой составной частью которого оно вообще-то должно являться. И все, и пипец, уставка достигнута, надо поддерживать на выходе скромные 160-180, а у тебя одна интегральная компонента накопила значение на 2 порядка больше, да ты еще и на 9 его умножил.

Ты не пробовал хотя бы раз попытаться подумать над тем, что написано, а не действовать по принципу чат-ботов, которые увидев слово, которое знают, выдают рандомную фразу с его присутствием? Очень уж похоже.
AR_Favorit вне форума  
Непрочитано 22.11.2017, 22:27  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: Мои ответы на вопросы [b]AR_Favorit[/b]

Сообщение от stalkernet Посмотреть сообщение
Мдя опять за за свое. У вас обоих черте что написано. у одного интегратор. у другого интервал воздействия. и ни у одного второй ступени регулятора - корректора мощности в котором попугаи пида пересчитываются в реальное воздействие

Алгоритм то предельно прост.

1 проводим измерения. кому хочется в градусах - переводим в градусы. кому хочется - в отсчетах АЦП.
2 проводим расчет попугаев ПИДа.
3 В корректоре мощности приводим попугаев к реальному воздействию. то есть на какое время нужно включить нагреватель за период регулирования.
Какой еще "корректор мощности?!"
Не корректор мощности, а преобразователь выходного значения ПИД алгоритма в период шим (в данном случае).

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

Причем алгоритм может выдать и больше 100%, это в моем случае неважно, нагреватель все равно отработает ровно 100%.
AR_Favorit вне форума  
Непрочитано 22.11.2017, 22:39  
OakRidge
Заблокирован
 
Регистрация: 16.05.2015
Адрес: Болгария
Сообщений: 1,460
Сказал спасибо: 286
Сказали Спасибо 1,125 раз(а) в 540 сообщении(ях)
OakRidge на пути к лучшему
По умолчанию Re: Мои ответы на вопросы [b]AR_Favorit[/b]

Неплохо порытся в архивах. Объяснить решение уравнений методом случайного поиска.
Во тогда будет склока
OakRidge вне форума  
Непрочитано 22.11.2017, 22:39  
ALEGYR
Вид на жительство
 
Регистрация: 10.06.2005
Сообщений: 325
Сказал спасибо: 43
Сказали Спасибо 360 раз(а) в 194 сообщении(ях)
ALEGYR на пути к лучшему
По умолчанию 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.
ALEGYR вне форума  
Непрочитано 22.11.2017, 22:44  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию 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 градусов...

Ардуинщики
AR_Favorit вне форума  
Непрочитано 22.11.2017, 22:55  
avp94
Почётный гражданин KAZUS.RU
 
Аватар для avp94
 
Регистрация: 26.01.2007
Сообщений: 3,123
Сказал спасибо: 61
Сказали Спасибо 1,153 раз(а) в 624 сообщении(ях)
avp94 на пути к лучшему
По умолчанию Re: Мои ответы на вопросы [b]AR_Favorit[/b]

Сообщение от stalkernet Посмотреть сообщение
Алгоритм то предельно прост
.......
.......
Стесняюсь, но спрошу:
Это алгоритм чего?
А то можно и короче:
- измерили
- вычислили
- порегулировали

ALEGYR отдыхает.
avp94 вне форума  
Непрочитано 22.11.2017, 23:02  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию 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%).

И чем это похоже на "релейное регулирование"?

Не понимаешь - спроси. Тут же есть люди, которые чайникам такие вещи разжевывают.
AR_Favorit вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Wiznet W7100. Общие вопросы R_N Микроконтроллеры, АЦП, память и т.д 7 06.06.2012 00:33
PCAD - вопросы и ответы avr123-nm-ru Proteus, KiCAD и другие ECAD 7 27.01.2011 21:15
Система измерения температуры (на AD8495), вопросы по схеме и реализации spartakchamp Измерительное оборудование 2 15.11.2010 22:04


Часовой пояс GMT +4, время: 03:55.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot