Отвлекитесь, эмбеддеры! Отвлеченные темы - обсудить проблемы тепловой смерти вселенной, или просто пиво. Этот раздел - для отдыха. |
12.12.2017, 20:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от ALEGYR
|
Хочу!
|
Окей, займусь!
А за это я я хочу ответ на вопрос
|
|
|
|
12.12.2017, 20:26
|
|
Вид на жительство
Регистрация: 10.06.2005
Сообщений: 325
Сказал спасибо: 43
Сказали Спасибо 360 раз(а) в 194 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от AR_Favorit
|
А за это я я хочу ответ на вопрос
|
лови
Сообщение от AR_Favorit
|
Внимание, вопрос. Тема же - твои ответы на вопросы? Вот и ответь пажалста на крайне вежливо заданный вопрос:
ЗА КАКИМ ПОЛОВЫМ КУЕМ ты исполняешь это самое включение ПИД-алгоритма строго при определенной температуре ошибки, а не просто при включении нагрева? Для чего ты писал эту самую минимум одну лишнюю строку, выглядящую как с некоей целью введенный костыль??
|
Я включаю ПИД-алгоритм не с момента пуска, а с некоторого значения температуры ниже температуры уставки только по той причине, что знаю, что нагрев любого тела не может происходить мгновенно, и мне нет смыла программно умничать ПИДом!
Я на 100% уверен, что даже на 100% приложенной к нагревателю мощности, график нагрева будет линейным, изменяясь со скоростью 1-2 градуса в секунду, и начинаю работать ПИДом только тогда, когда мне эту линейность надо изменить, чтобы выйти на заданную температуру без ее превышения!
|
|
|
|
12.12.2017, 20:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от ALEGYR
|
лови
Я включаю ПИД-алгоритм не с момента пуска, а с некоторого значения температуры ниже температуры уставки только по той причине, что знаю, что нагрев любого тела не может происходить мгновенно, и мне нет смыла программно умничать ПИДом!
|
Это не объяснение! Ты ввел лишний кусок программы - зачем? Без него же с "умничанием ПИДом" тоже ведь будет работать, и даже не хуже! Ты так орал про "лишнюю ячейку памяти", а сам истратил их несколько. Даже хуже, чем у меня (у меня-то, помнится, в любом случае пересчет бы присутствовал), и ты еще и свое время на написание лишнего кода истратил. Зачем?!
|
|
|
|
12.12.2017, 20:49
|
|
Вид на жительство
Регистрация: 10.06.2005
Сообщений: 325
Сказал спасибо: 43
Сказали Спасибо 360 раз(а) в 194 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от AR_Favorit
|
Да не превращается при этом ПИД-регулятор ни во что, дятел ты упоротый, сколько раз тебе повторять? При нормальной работе интегральная составляющая столько не накапливает. А при аномалиях - обрыве ТЭНа, или при заливке во внешнюю емкость сильно охлажденного масла, слишком вязкого и убивающего насос, или неправильной настройке коэффициентов - накапливает, стопорится, а в другом месте программы это воспринимается как аварийный сигнал.
|
Ну да, ну да! При аномалиях или неправильной настройке коэффициентов вся работа агрегата стопорится, а в другом месте программы поставим костылек и это будет восприниматься как аварийный сигнал! Как будто другое место программы знает, что изменение переменной integral_err прекратилось от аномалии, а не от того что агрегат достиг уставки, и спокойненько выполняет свою работу!
Ведь изменение переменной integral_err происходит либо по условию
if (integral_err‹(EE_PID_TIME*2000)) integral_err += PID_curr_err;
либо по изменению переменной PID_curr_err, которая определяется по формуле
PID_curr_err = EE_FUEL_TARGET_TEMP - temp;
Вы фантазер, батенька!
Последний раз редактировалось ALEGYR; 12.12.2017 в 21:13.
|
|
|
|
12.12.2017, 20:50
|
|
Почётный гражданин KAZUS.RU
Регистрация: 02.07.2009
Сообщений: 1,110
Сказал спасибо: 1,246
Сказали Спасибо 2,178 раз(а) в 624 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Бля ну наконецто до народа начало доходить... а я уж думал когда это случится. Господа брачующиеся поймите наконец свою главную ошибку. Вы сравниваете два разных регулятора. ОДНОСТОУПЕНЧАТЫЙ с ДВУХСТУПЕНЧАТЫМ!!!!!!!!
одноступенчатый это чистый ПИД!!!
двухступенчатый это обычный позиционный плюс ПИД включаемый при определенном условии!!!!!!!!
тотже чистый ПИД при определенном алгоритме может стать двухступенчатым регулятором. пример разгон идет при Кp › 0 Ki = 0 Kd › 0.(первая ступень) при достижении определенного условия переходит идет уже при Kp › 0 Ki › 0 Kd › 0. (вторая ступень)
|
|
|
|
12.12.2017, 21:11
|
|
Вид на жительство
Регистрация: 10.06.2005
Сообщений: 325
Сказал спасибо: 43
Сказали Спасибо 360 раз(а) в 194 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от AR_Favorit
|
Это не объяснение! Ты ввел лишний кусок программы - зачем?
|
Это как раз и объяснение! Я в своем коде ввел условие
if (error ›= 20 ){ Output = 255 ; }
чтобы оператором
analogWrite(HEATER_PIN_OUTPUT, Output);
нагревать фен максимально быстро пока температура нагрева не достигнет значения на 20 градусов меньше уставки!
Если я этого на сделаю, то нагревания фена не произойдет, так как управляющий сигнал пида Output равен 0!
Что касается твоего вопроса
Сообщение от AR_Favorit
|
ты еще и свое время на написание лишнего кода истратил. Зачем?!
|
то я истратил СВОЕ время на написание лишнего кода, чтобы сократить время выполнения программы! Я то ведь потрачу свое время только один раз, а бедненькой ардуине придется тратить свое время и силенки всю ее жизнь, пока она будет работать в агрегате!
|
|
|
|
12.12.2017, 21:19
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
что касается кефов для моего варианта.
На твоих графиках температура растет строго на 1 градус каждую итерацию алгоритма. Допустим, что это реальный график с твоего устройства (здравый смысл подсказывает, что с таким строгим прибавлением градуса за итерацию - это эмуляция, но я не стану настаивать). Вопрос - а какой период регулирования на твоем графике? 1 секунда? Нагрев с 25 градусов до 190 градусов занимает 165 секунд? ОК. Значит у меня будет EE_PID_TIME = 1
Температура будет в градусах. При необходимости можно пересчитать в десятых долях градуса, но пока для разминки оставим так.
Дальше мы можем заметить на твоем графике один важный момент: выходное значение алгоритма при достигнутой уставке пляшет вокруг величины 155 единиц из 255. Именно эту, или чуть меньшую величину должна давать интегральная составляющая. При достигнутой и устойчиво удерживающейся нулевой ошибке только она ведь и будет давать выходной сигнал.
Поскольку у меня при вышеуказанном периоде регулирования 100% выходной мощности соответствует 1000 единиц, а не 255, как у тебя, пересчитываем твое выходное значение при достигнутой уставке в мое:
155*1000/255 = 607
Интегральная компонента за 165 секунд должна изменить свой вклад в выходной сигнал от 0 до 607.
Среднее значение ошибки за время нагрева составит ((190-25)+(190-190))/2 = 82
165 итераций прибавляют в среднем 82 каждая. Без учета кефов за время нагрева интегральная составляющая накопит 165х82=13530. Это значение, будучи умножено на Ки и поделено на тысячу (у меня же там деление на тысячу) должно дать вышерассчитаное значение 607.
(Ки*13530)/1000 = 607
Ки = (607*1000) /13530 = 44
Мы, благодаря тому, что у нас есть типа экспериментальный график нагрева, получили требуемое значение интегрального коэффициента еще до того, как подобрали пропорциональный. Это потому, что данный коэффициент в твоем случае - важнее пропорционального. Если занизишь Ки, "догревать" до уставки будет слишком долго, если завысишь, будет перерегулирование
А вот теперь мы спокойно подберем подходящий пропорциональный кеф. Тут, конечно, проблема понятная: мы должны обеспечить значение " с запасом" вносимой пропорциональной компонентой величины в выходной сигнал, на начальном участке нагрева, и вовремя "убраться" из процесса, когда подобрались к уставке.
Мы помним, что у нас еще есть вклад интегральной составляющий, ноль в начале нагрева и 607 в самом конце. Например, за 10 секунд до достижения уставки это значение будет 557.
То есть чтобы фен выдавал 100% мощности, нам надо начальном участке нагрева (при ошибке 165) иметь Кп*165›=1000, а за 10 секунд до достижения уставки (при ошибке 10)- уже Кп*10›= 443.
Я предлагаю начать с Кп = 40, Ки = 44, Кд=0.
При этом твою любимую строку
"if (integral_err‹(EE_PID_TIME*2000)) integral_err += PID_curr_err;", разумеется, придется скорректировать, ибо она предназначена для систем с на порядок меньшей интегральной составляющей. То есть кеф 2000 для твоей системы должен быть минимум в 10 раз больше, чтобы "залочивание" аномально большого накопления происходило за пределами возможных при нормальной работе системы значений накопленной интегральной ошибки.
if (integral_err‹(EE_PID_TIME*20000)) integral_err += PID_curr_err; для систем типа твоей.
Вот с такими уставками подключить твой фен к моей конструкции - и будет похоже на истину. Разумеется, на реальном устройстве (да-да, нам обязательно надо реальное устройство) надо будет с ними еще поиграться, и после получения устойчивого и максимально быстрого выхода на рабочую точку можно уже поиграться и с дифференциальной компонентой, тут чисто подбор на объекте, оценить влияние "колебаний воздуха от проходящих мимо людей" на выходную температуру фена я как-то не в состоянии.
Последний раз редактировалось AR_Favorit; 12.12.2017 в 21:51.
|
|
|
|
12.12.2017, 21:21
|
|
Вид на жительство
Регистрация: 10.06.2005
Сообщений: 325
Сказал спасибо: 43
Сказали Спасибо 360 раз(а) в 194 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от AR_Favorit
|
Да не превращается при этом ПИД-регулятор ни во что, дятел ты упоротый, сколько раз тебе повторять?
|
Ну конечно! Это ведь это не ты, а я поумничал и написал
Сообщение от AR_Favorit
|
Дифференциальная же составляющая во всем этом веселье может и не участвовать вообще. Более того, ее влияние тут не особо-то и желательно: просто на участках, где скорость нагрева сильно меняется, она будет пытаться в меру заданного ей кефа "прибить" крутизну изменения графика нагрева, причем совершенно безуспешно - инерционность системы такая, что ее влияние будет воспринято гораздо позже того момента, когда оно было применено. И будет скорее вредно, чем полезно. В некоторых реализациях алгоритма даже встречается ее расчет, исходящий из среднего значения производной скорости изменения ошибки за несколько периодов. Извращение-с, но в пределах допустимого.
В итоге правильно настроенный PID-алгоритм в данном случае вырождается в PI-алгоритм,
|
Последний раз редактировалось ALEGYR; 12.12.2017 в 21:23.
|
|
|
|
12.12.2017, 21:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от ALEGYR
|
Ну да, ну да! При аномалиях или неправильной настройке коэффициентов вся работа агрегата стопорится, а в другом месте программы поставим костылек и это будет восприниматься как аварийный сигнал! Как будто другое место программы знает, что изменение переменной integral_err прекратилось от аномалии, а не от того что агрегат достиг уставки, и спокойненько выполняет свою работу!
Ведь изменение переменной integral_err происходит либо по условию
if (integral_err‹(EE_PID_TIME*2000)) integral_err += PID_curr_err;
либо по изменению переменной PID_curr_err, которая определяется по формуле
PID_curr_err = EE_FUEL_TARGET_TEMP - temp;
Вы фантазер, батенька!
|
Продолжаешь демонстрировать дебилизм. В другом месте программы не "костылек", моллюск ты двустворчатый, а проверка, не превысило ли накопление в интегральной составляющей вот именно этой самой величины : EE_PID_TIME*2000. Да-да, это служит флагом аварийной ситуации с нагревом. Можно было бы истратить лишнюю ячейку памяти, и поставить флаг непосредственно по месту. Или городить вообще отдельный счетчик времени нагрева, и по его превышению падать в аварию. Но зачем, если у меня есть отличный индикатор, нормально ли идет нагрев, или аномально - интегральная ошибка. До определенных пределов ее накопление соответствует нормальной работе, после определенного предела - свидетельствует об аномалии, а по любой аномалии нагрева надо установку вырубать, ибо Так Хочет Заказчик.
То что ты, тупорылая чувырла, уже полгода не можешь понять, как работает эта строчка - это только твои проблемы.
|
|
|
|
12.12.2017, 21:42
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от ALEGYR
|
Это как раз и объяснение! Я в своем коде ввел условие
if (error ›= 20 ){ Output = 255 ; }
чтобы оператором
analogWrite(HEATER_PIN_OUTPUT, Output);
нагревать фен максимально быстро пока температура нагрева не достигнет значения на 20 градусов меньше уставки!
Если я этого на сделаю, то нагревания фена не произойдет, так как управляющий сигнал пида Output равен 0!
|
Ты идиот штоле? Ах да, я забыл ![Мистер Грин](images/smilies/icon_smilegreen.gif)
С какого органа управляющий сигнал ПИДа у тебя будет ноль? при первой же итерации сравнится уставка (190) с ОС (25), посчитается ошибка (165), умножится на твой кеф (30) и залупит выходной сигнал Output по самые помидоры, так, что придется работать ограничителю в конце алгоритма, чтоб насчитанные 4950 превратить в максимально допустимые 255.
Сообщение от ALEGYR
|
Что касается твоего вопроса
то я истратил СВОЕ время на написание лишнего кода, чтобы сократить время выполнения программы! Я то ведь потрачу свое время только один раз, а бедненькой ардуине придется тратить свое время и силенки всю ее жизнь, пока она будет работать в агрегате!
|
О да, тут не поспоришь. Сократил.
Только вместо того, чтобы сократить правильно (убрать идиотские сложения-вычитания-умножения флоатов), ты их все оставил - бедненькая ардуина "сократилась" на менее, чем трех минутах прогрева, а потом оставшиеся от 6-8 минут (твои слова) 3-4 минуты таки бесмыссленно и беспощадно множит, плюсует и вычитает числа с плавающей точкой... чтобы выработать 8-битный, однобайтовый целый, сигнал управления
А еще ты своим "сокращением" повесил себе на шею гирю, значение которой, возможно, ощутишь, когда твое теоретическое устройство начнет принимать формы практического воплощения. Ты на разных участках нагрева сделал разную скорость выполнения программы. Ты сам себе выкопал яму, в которой долго будешь спотыкаться, когда твоя мега по непонятной для тебя причине "вот тут работает нормально, а вот тут пропустила G-код/прощелкала срабатывание концевика/не успела чего-то-там-еще". Если бы ты оставил нагрев с самого начала с ПИД-алгоритмом, твоя программа, всегда вела бы себя одинаково, и когда ей станет не хватать силенок меги тоже и бы не хватало в любом сосо=тоянии одинкаово. А так как ты сделал - не будет.
Резюме. Выгоды от этого решения ноль. Все равно тебе в какой-то момент становится надо считать этот ПИД - так что или ты успеваешь его считать всегда, и мега ворочает дурацкими флоатами вместо пустого цикла, что ей, кстати, по барабану, или начинает не успевать все посчитать (движение фена по квадрату 20х20мм, ага), когда заработал ПИД, и эта ситуация все равно неприемлема. Недостатки этого решения - очевидны.
Внимание, вопрос: так скажи теперь уже правду, зачем ты сделал плохое решение вместо правильного (использовать ПИД всегда?) Если настаиваешь на предыдущем ответе - это точно такая же глупость, что "фен бы грелся медленно". НО может, скажешь уже правду?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:31.
|
|