Для таких отладок очень удобно юзать STMStudio, которая строит график изменения переменной во времени. Наглядно все будет видно. Ну и очень не хватило рекомендаций как выбирать начальные коэффициенты либо как автоматизировать их выбор на основе первых же экспериментальных прогонов. Вам повезло, что система отрабатывает достаточно быстро. А вот если объект регулирования тормозной, то такой вот подбор может занять туевую хучу времени, измеряемое иногда часами.
Поддерживаю! Видео хорошее, но для наглядности не хватает графиков. На микроконтроллерах с выводом SWO для этого можно так же использовать Logic Analyzer в Keil и SWV Data Trace Timeline Graph в STM32CubeIDE.
Ну по хорошему вам нужно моделирование ситуации с сильно инерциальной системой и на листочке выводить приблизительные коэффициенты. И их уже подкорректировать на первых прогонах. Эт как бэ очень не простая фигня и за пять минут не расскажешь.
Владимир! Введите ограничение по насыщению интегральной составляющей. Иначе, если будет открыта дверца шкафа и потом Вы ее закроете, будет большое перерегулирование из-за "выходящего из насыщения" интегратора... Счастливо! Удачи Вам в проектах!
Да это крайне хорошая идея. Вы мне идею подкинули с трендом затрачиваемой на поддержание температуры энергии. При его изменении без изменения целевой температуры можно говорить о потере энергии и принимать меры. Спасибо. Хорошая идея.
@@VladimirMedintsev Владимир, Большое Спасибо за материал! применил и настроил ПИД для управления электромотором, но на определенных скоростях мотор коллеблется вокруг заданного значения. Например: 20об/м - колебания +-0.5об/м; 25+-2об/м; 50 +-1об/м... не могу найти решение как сгладить эти колебания. частота дискретизации системы - 128мс.
@@kdmytrosНадо экспериментировать с параметром мощности. Возможно это низкочастотная раскачка. Очень помогает если вы отладчиком поссотрите какой из параметров в момент раскачки доминирует в регулировании и из этого сделаете выводы.
@@VladimirMedintsev Большое спасибо! а частоту дискретизации системы можно ли как то учитывать ? эксперементирую тоже с частотой ШИМ, добавил остановку регулирования если ошибка меньше порогового значения..
Собрал регулятор оборотов коллекторного двигателя и замучался настраивать его. С функцией start - при включении решил просто добавлять тихонечко мощность, затем режим work с которой проблема. Получалось либо огромная реакция не снижение оборотов ( двигатель с перебоями работал, как бы периодически подгазовывая(- - - - - - ), либо терял обороты при нагрузке т.е. не достаточная реакция. Спасибо. Попробую применить ПИД.
Спасибо автору за видео. Данная настройка справедлива для очень простого устройства. Есть пару дополнений к настройке. Диф. составляющая без отдельного импульса, почти бесполезна и даже избыточна. Для реальных условий желательно ставить доп. термопару на входе или выходе (тут зависит от процесса ) и отдельно дифференцировать этот вход. Настраивать коэф. лучше с предварительно расчета и при установке их, делать регулятор сначала более медленным, а потом выводить ку за грань устойчивости процесса и снижать ку на 10-15%.
Следует внимательно отнестись к вычислению интегральной составляющей, т.к. в определённых ситуациях (невозможность системы компенсировать ошибку), в Int со временем может накопиться большая целая часть и из-за особенностей дискретного вычисления чисел с плавающей точкой будет происходить накопление ошибки. Особенно при использовании 32-х битного float. В таких случаях лучше использовать алгоритмы компенсационного суммирования.
Интегральное насыщение нужно учитывать. Без этого система может уйтив раскачку. На пальцах - интеграл нужно ограничивать, иначе он наберет огромное значение если к примеру он раьотает, а питание на нагреватель не дали. If (integral > integralMax) integral = integralMax; If (integral < integralMin) integral = integralMin; Как выбирать величины макс и мин значения в литературе практически не описано, но по опыту обычно делпют в половину величины максимального управляющего воздействия.
Ой, намучился я когда-то с ПИД регуляторами, когда квадрокоптер свой программировал))) Но как оказалось, причины мучений были не в самом ПИД регуляторе, а типе данных, которые подавались на его вход. Ну и конечно не сразу к применению кватернионов пришел, казалось слишком сложно, но на самом деле как раз наоборот. В итоге с третьего раза только написал, чтоб всё красиво летало и даже в ветер не страшно, что перевернется или расколбасит...
Вот тут я узнал про оптосемистор. Очень пригодилось бы мне в самом начале постройки станочка для переработки пластика для 3d печати. Но уже нагородил с помощью обычного семистора со всеми вытекающими с переходом через 0.
Если мы говроим о температуре спекания компонентов на плате то самы длительный вариант процесса происходит до 5-ти минут, это повышение температуры до спекания, отключение нагрева, охлаждение до температуры около 150 градусов, далее в течении нескольких минут охлаждение до температуры при которой можно платы вытянуть с печки.
А вот за пид регулятор, и за его код в описании отдельный респект, уважуха и всех блага цивилизованного мира. Года два назад была попытка реализовать пид регулятор на ардуино, с целью понять что это. Но в сети кроме "библиотека PID.h помогает нам..." ничего не было. Я конечно в итоге допер до всего этого, не без помощи знаний из универа конечно, и код написал. НОООО... Наконец-то в интернете появилось нормальное видео о пид регуляторе, которое не поймет если только глухой и слепой. Нужно теперь попробовать сделать ещё раз пид регулятор, только на стмке. Глядишь, гроу бокс для выращивания семляники к зиме сделаю...
Лайк,!!! Где же Вы были раньше! Этак в 1975 году, Когда нам, студентам КПИ приходилось моделировать ПИД на аналоговой машине. Спасибо за лекцию.! Где можно скачать ваши исходники по МАХ и ПИД (по вашим лекциям).
Здравствуйте! Спасибо за видео. Верно ли я понял, что 3999 на шим - это у вас будет 100% коэф заполнения? Для чего Вы умножали результат ПИД на 4, тоже вот не совсем ясно... Благодарю заранее за ответ!
есть ограничение в значениях таймера на шим (есть максимум). вообще можно все изначально умношить на 4 (значение термопары с резолюцией в 0,25) и работать только в int16_t\int32_t. это быстрее и экономичнее.
снимите дополнительный ролик в котором будет заложен алгоритм /идеология автоматической калибровки PID регулятора. я строю график температуры относительно времени. даю системе остыть полностью и меняю коэффиценты и снова запускаю и строю график. и сравниваю графики. меня интересует алгоритм/наработка/идея по автоматической корректировки. пусть это займет 10 часов но что бы система сама себя настроила до идеала в своей модели
@@VladimirMedintsev В строке кода : cDif = td*(E-E0); // Дифференциальный вклад в регулирование E-E0 - скорость изменения рассогласования: в полном виде должно быть (E-E0)/T, но в нашем случае T=1, как я понял, поэтому шаг по времени можно опустить. Таким образом у нас тут рассчитывается скорость: ед/сек. Для реализации же ПИД-регулятора необходимо вести расчёт по трём измерениям: cDif = td*(E-2*E0+E1); // Дифференциальный вклад в регулирование где E - текущее значение ошибки регулирования, E0 - в предыдущий момент времени, E1 - в предшествующий E0 момент времени. Тут уже рассчитывается ускорение: ед/сек^2. Обратите внимание на рекуррентный вид формулы на википедии: там так же по трём измерениям рассчитывается дифференциальная часть.
Здравствуйте. Если Вы читаете это сообщение, ответьте пож. : Почему при расчете дифференциальной части ПИД надо использовать не скорость, а ускорение? В чем будут различия? Поясните чайнику, а то кто что пишет.
Спасибо за полезное видео! Было бы интересно, в дополнении, узнать про настройки выходного ШИМ сигнала. Какая частота работы таймера и собственно почему Power = 3999? И кстати, коэффициенты подбираются не только опытным путем, есть также и достаточно сложные математические формулы описывающие каждый параметр, с учетом минимального времени реакции системы. Тема интересная и сложная.
А все достаточно просто. Я делал ролик про ПИД-регулятор. По этой причине решил не заморачиваться и не делать полноценную регулировку мощности. Т.е. в данном видео частота следования импульсов ШИМ - 1 Герц. На результат регулирования это не повлияло. А мне существенно упростило жизнь. А т.к. ролик носил информационный характер то в нем нет каких-либо математических моделей автоподстройки параметров. Их на самом деле сделать не так сложно как кажется. Более того я в видео сказал с чего начинать - запуск источника на полную мощность и измерение скорости увеличения регулируемой величины. Это позволит узнать инертность системы и максимальную (на практике не достижимую) скорость набора температуры. Дальше не особо сложный алгоритм фильтрации по различным частотам (зависящим от инерции) и автоматическая подстройка параметров в заданном (разрешенном) диапазоне.
Спасибо. Познавательно. Можно сделать автонастройку ПИД? В том же REX-C100 есть эта фишка и это очень облегчает настройку под разные типы нагревателей. И еще. Без детекции нуля практически невозможно пользоваться нагревателями в видимом спектре, например на основе галогенок. Ослепнешь нафиг :) Всеж интересно увидеть ПИД регуляцию с детектором перехода через ноль. Если использовать PC814, то там всего 4 детали нужно. Два 1W резистора на вход, один подтягивающий на выход и сам PC814.
О чем видео и так ясно. Было предложение о дальнейшем развитии этой темы, а не о том, что есть или чего нет в видео. И если нет диммирования зачем там MOC3021? Может лучше MOC3063 со встроенным детектором?
Задача регулятора (любого, ПИД, АПИД, нечёткой логики итд итп.) : Максимально быстро, довести систему до нужного уровня, не выходя за пределы (наперёд оговорённые). А двигаться медленно можно, но это не интересно. К примеру: Нужно за синхронизировать водяную турбину гидроэлектростанции. Можно неделю, можно месяц. Кто быстрее?
Очень понравилось грамотное техническое объяснение простыми словами. Хочется спросить. Можно ли (плагинами, экспортом и тд) нужные нам значения показывать графически? В идеале 3 одновременно наложенных графика наших значение во времени?
Спасибо. Однако не совсем понятно в алгоритме связь "задержки" со временем интегрирования и дифференцирования :) Можно как то прозрачнее определить это? Другими словами задать масштабы коэффициентов. Если пропорциональный в масштабе от температуры (при какой дельте температуры мощность изменится на 100%), то в каком масштабе I и D? В масштабе от периода (цикла) расчета PID регулятора? 1 сек в данном случае? Задают на какую величину изменяются корректировки за один цикл? Я в прошлый раз вам написал какой то бред? Это был коммент по ошибке не в тот адрес, там один экспериментатор грел датчик галогенкой без экрана. У Вас правда тоже возможен инфракрасный нагрев через тонкий экран изменяющий инерционность обратной связи? Я для экспериментов наклеил термистор на керамический резистор (для диапазона 25-40 град.С). А в реальности инерционность намного больше.
@@VladimirMedintsev В видео вы говорите что максимальное значение у вас PID одна тысяча ? Из чего это берется ? И почему умножаете на 4 для записи в PWM. У меня PWM настроен так -Prescaler 36000, Counter period 1000.Получается у меня максимальны импульс это при значении 1000.а у вас я так понял в 4 раза больше , не пойму как лучше сделать
Пид.. что-т новенькое, спасибо за инфу. А вот цепочка у триака - не для индуктивных нагрузок, а для того, чтобы схема не реагировала на помехи из сети(в прочем, от индуктивных нагрузок) просто им не обязательно быть в цепи включения самого триака. Достаточно быть подключенными параллельно. Я так убрал эту цепочку, тоже подумав, что лишнее привинтил производитель. Как итог, при включении холодильника мигал свет :))) Так что убирать её не рекомендую, особенно если в доме не очень хорошая проводка....
Vladimir Medintsev, выложите пожалуйста код управления трехпозиционным ПИД регулятором (например для управления трехходовым смесительным краном отопления с эл.приводом)
Int = Int+(E + E0)/2; // Интеграл разсогласования cInt = Int*(1/ti); // Интегральный вклад в регулирование Вот эти формулы у меня вопрос а тогда чему равен просто Int с правой стороны.И 1/ti-Это период ti-время интегрироания?
Интегральная составляющая регулятора является определённым интегралом. За какой период времени должен быть рассчитан этот интеграл? Как определить это время? Хочется получить конкретный ответ и пояснения.
Владимир, подскажите, каким образом в своих программах Вы обрабатываете ситуации-исключения? Например, Вым нужно записать значение в EEPROM, а функция записи возвращает ошибку. Либо термопара отпала. Т.е. когда события развиваются не по плану... Например, в этом случае можно было бы вывести в терминал код ошибки место в программе, где она возникла.
У меня нет универсального ответа на ваш вопрос. Реакция на возникающие проблемы очень сильно зависит от устройства. Если устройство по своей схемотехнике позволяет ликвидировать проблему, то конечно это делается. Если же функционирование невозможно, то формируется сигнал ошибки. А иногда, как в случае "термопара отвалилась" сделать ничего нельзя. Приходится тупо выключать нагревательный элемент до возобновления правдивых показаний термопары. Ну иными словами на этот вопрос нельзя ответить в рамках одного абзаца. Но уж чего я точно никогда не делаю это не выдаю в терминал код ошибки и место в программе. Я лучше как-нибудь проиллюстрирую на примере какого-нибудь устройства.
Подскажите пожалуйста, есть ли готовые примеры кода где МК сам видит что коэффициенты не подходят и сам подстраивает их(при изменении регулируемого параметра система не быстро балансируется и нескольлко раз прыгает вверх вниз)
1) если бы поясняли выбор значения П регулятора в форме передаточных функций, то было бы сразу все понятно откуда там статическая ошибка, ведь показав замкнутую систему в виде ПФ по ошибке сразу видно, почему регулятор выбранной структуры будет работать не верно 2) если совсем придираться, ПИД регулятор рассчитывается не верно, у вас коэф регулятора не зависят от шага квантования по времени, но это справедливо, если шаг квантования равен 1 сек, а у вас 0.98 сек...мелочь, для инерционного процесса сильно не скажется, но, если у платформы переменный шаг расчета? если процесс не такой инерционный как этот тепловой, то шаг квантования принципиален, и там уже систему нужно рассматривать как цифровую, а не аналоговую. 3) опустили вопрос с производной, да, вы сгладили сигнал с датчика, но важно показать как шумит производная, часто она так гадит, что нужно крепко задуматься над структурой фильтра
Уверяю вас, если на некоторые процессы смотреть проще и не относиться к ним так серьезно мир вокруг не станет хуже. Не ну я бы понял управляй мы башней Арматы, а нам в мирных целях... Я уж тогда лучше видео сниму "увеличение инерции системы как способ повышения ее устойчивости".
@@VladimirMedintsev 1) безусловно!! городить огород нужно только там где это необходимо! НО, когда вас смотрят те, кто ничего не понимает в ТАУ, то многие важные моменты остаются за скобками. Это как смотреть на дом через щелку забора. Хотя покажи матаппарат, то все играет другими красками. Посмотрел несколько видео практиков по ПИД-регулятору, так все авторы интуитивно настраивают регулятор. ПИД!!!! хоть бы один сказал, что возможен П, ПИ, ПД регулятор..нет, сразу ПИД...знали бы, что еще ПИДД есть, ведь структура регулятора не с потолка берется, а определяется структурой объекта и требованиям к системе....2) армата говорите? а это здесь причем? если нет внятных требований к качеству переходных процессов, то все понятно, накидал коэф, получил статическую ошибку близкую к нулю, небольшое перерегулирование - норм. А если указаны требования к статической ошибке и времени отработки ошибки? то здесь без идентификации структуры и параметров объекта, моделирования и синтеза регулятора не обойтись. Я понимаю, что вы делаете, но мне кажется, что нужно четко очерчивать границы применимости подхода "вот ЗДЕСЬ так делать можно, а вот ЗДЕСЬ нельзя потому что...". 3) Увеличение инерции, для повышения устойчивости? у вас есть структурно неустойчивый объект? или регулятор с бесконечной мощностью? наверное, имеете в виду, принудительное затягивание переходного процесса, чтобы добиться апериодического переходного процесса в замкнутой системе? так достаточно выбрать требуемую структуру регулятора и настроить параметры регулятора, так, чтобы система находилась на апериодической границе устойчивости - там всего лишь одно требование - отрицательная вещественная часть нулей характеристического полинома и равенство нулю мнимой части всех корней. или проще, снять переходную характеристику объекта, датчик описывается апериодическим звеном первого порядка, К=1, Т - одна треть от тепловой инерции по паспорту датчика. В вашем случае объект тоже будет описываться апериодическим звеном первого порядка, только K и T нужно будет определить на основе экспериментальных данных, здесь без пакета моделирования не обойтись. А дальше выбираем структуру регулятора, составляем ПФ замнутой системы, скорее всего там будет ПФ в знаменателе полином 3 порядка, дело техники (но только аналитически) найти такие параметры регулятора, при которых их изменение приводит к появлению мнимых корней. Да, это все сложно, но как раз это показывает силу теории, а не просто тыкать пальцем в небо...конечно, проделав всю эту теоретическую работу может не получится))) модель будет не верна или поведение системы будет отличаться от той, на которой снимались первичные экспериментальные данные. В этом случае нужно рассматривать модель как нелинейную, ведь динамика системы зависит от возмущения, то есть температуры окружающего воздуха ...это еще то веселье)...чет меня понесло...3) вангую, что вам нужен всего лишь ПД регулятор...сами подумайте, зачем вам И составляющая, когда у вас на выходе регулятора ШИМ? интегральная составляющая накапливает ошибку, выходит, что интегральная составляющая обнулится только при наличии перерегулирования. Поэтому только П и Д составляющие должны остаться для вашего объекта с таким исполнительным механизмом
Здравствуйте. Есть микросхема MOC3063, внутри которой заявлен определитель нуля. Можно ли на ней получить полноценный регулятор с определителем нуля, с простым включением как у вас?
Это зависит от того, для чего вы ее собираетесь использовать. Я не буду сейчас тут читать лекцию, но добрая половина людей рассуждающие об определении перехода через ноль не совсем понимают для чего это нужно. Дело в том, что упомянутая вами оптопара она определяет ноль для того, чтобы в нем включить нагрузку. Таким образом нагрузка включится действительно в самый оптимальный момент времени. А вот для полноценного ШИМ управления мощностью этого как раз и не надо. Иными словами если вам надо только вкл./выкл. то да эта оптопара вам очень даже подходит и можете использовать схему из ее даташита. А если вам делать ШИМ регулирование то она вам не подходит.
@@VladimirMedintsev хочется сделать нагреватель из утюга, детектор нуля - как минимум чтобы меньше помех было отдано в сеть 220. Мне представляется регулятор, отсчитывающий только целые полупериоды сетевого напряжения, так сказать, ШИМ с минимальным импульсом в 10мС. Пока не знаю какое тут соотношение оправданности к трудоёмкости, если сильно сложно, то может быть и не стоит заморачиваться
Да. Вы верно мыслите. MOC306x для Вашего случая подойдет идеально. Нагреватели очень инерционны и поэтому применять полноценный быстрый ШИМ для включения меньше чем на полупериод смысла мало. Синхронизация микроконтроллера с сетевым напряжением так же не нужна, т.к. +-1 полупериод на точность сильно не повлияет. Если будете использовать симистор, то не перепутайте местами аноды, иначе симистор будет постоянно открыт.
По опыту в настройке регуляторов для технологических объектов традиционный способ не подходит ( настройка П составляющей, а после подстройка И составляющей ). Более лучший результат дает настройка от И составляющей, а после подстройка П. Конечно для электроники это не показатель, поскольку можно свободно рвать управлящеее воздействие 0-100-0-100%
Это всё дело привычки. Я например начинаю настройку ПИД-регулятора вообще не с ПИД-регулятора =) А с оценки реакции системы на вручную созданное управляющее воздействие. Последнее предложение про электронику вообще не понял. Далеко не все технологические объекты имеют плавное (аналоговое) управление. Релейное управление (вкл/выкл, 0%/100%) встречается довольно часто и прекрасно работает с ПИД-регуляторами.
Владимир здравствуйте, не могу понять 131 строку Int = Int + (Е + Eo) / 2; // интеграл рассогласования переменная с названием Int - объявлена но не заполнена в правой части = Int + (Е + Eo) объясните зачем Int справо. спасибо
Так мы реально здесь интегральное значение считаем. Выражение в скобках ведь может отказаться и нулевым и отрицательным. Т.е. int будет увеличиваться до тех пор пока не станет оптимальным. Такой подход к интегралу вполне оправдан когда у нас постоянный интервал между выборками.
есть реле. раз в секунду берется температура... реле 100 процентов мощности... чем мне управлять(временем включения ???) кстати сделал регулятор для плитки для пайки по профилю на есп8266 прошивка esp easy...(на правилах) пока в п пежиме
Владимир, на применяемой Вами плате нет кварца. На сколько он нужен в "боевых условиях" на той же самой печи для пайки ПП? Как я понимаю, отсчет времени будет плавать. Ведь так?
Внутри контроллера стоит RC цепочка она на заводе калибрована. Так что это "плавать" не превысит пары секунд в сутки. Что не имеет никакого значения для ПИД-регулятора. Иными словами это от применения зависит. Особая точность нужна не везде.
@@VladimirMedintsev , если вопрос действительно стоит в нескольких секундах в сутки, это приемлемо для большинства задач. Кстати, у серии G0 точность внутреннего генератора , по заявлению STM кратно возросла. Уже сейчас на рынке доступны аналоги того же stm32f030f4p6, но со значительно улучшенными характеристиками. Обратите на них внимание!
Здравствуйте! Переменная ti стоит в знаменателе. Разве ее можно ставить равной 0 ? Ведь будет деление на ноль и бесконечно большая величина PID? А в примере, когда вы показываете настройку коэффициентов, этого не происходит?
Как всегда, отличное видео! Владимир, а что, если требуется не просто нагреть до заданной температуры, но и сделать это за конкретный промежуток времени (условно, до 50 градусов за 10 минут)? Как изменится программа? Есть ли типовое решение этой задачи?
Тогда по времени меняйте целевую температуру. Т.е. сделайте некоторый цикл в котором плавно повышайте температуру которая должна быть в каждый момент времени, а ПИД регулятор будет стараться за вами успевать. Если ему конечно же мощности хватит.
Владимир, подскажите вот что. Я или прослушал, или в видео не было этого - вы сказали, что предельное выходное значение регулятора равно тысяче, поэтому надо умножить на 4. А откуда эта тысяча взялась? Как вы её посчитали? Сейчас пишу свой ПИД со всей шелухой типа сглаживаний, линейных преобразований для АЦП и ЦАП/ШИМ, и тут-то вот и напоролся на то, что надо по-честному как-то пересчитать управляющий сигнал.
Приветствую, подскажите тут cInt = Int*(1/ti); - еденица это время как я понимаю опроса dt Int = Int+(E + E0)/2 - а что такое 2 ? и везде читал, что Int надо ограничивать или по этим формулам он уже будет ограничен?
У меня вопрос а как же Ki ?Я имею ввиду что формулв PID=Kp*(set-real)+Ki*(Is*(set-real)*T)+Kd*((setn-realn)-(set_pr-real_pr))*1/T вот такая формула правильно я понял.У вас нет коэффициентов.
на реальной конструкции заметил что время dt все же меняется , как выяснил это влияние вызвано самой матиматикой тоесть иногда вычисления проходять чуть дольше иногда чуть меньше есть ли какие способы борьбы с этим?
Это никак не может быть вызвано математикой. Операции сложения, умножения, деления в микроконтроллерах занимают одно и то же количество тактов не зависимо от погоды.
Заводим еще один таймер на микросекунды, и с помощью его перед самим пид вычисляем реальное время . примерно так. Dt_baro = TIM4->CNT; Dt_baro_fin = 0.000001f * (uint16_t)(Dt_baro - Dt_baro_old); Dt_baro_old = Dt_baro; переменная Dt_baro_fin будет имет нужное время.
@@VladimirMedintsev открытие симистора в связке с оптотриаком типа MOC3023 происходит в произвольный момент синусоиды в сети, стало быть синус ломается, что вызывает сильные помехи для других потребителей энергии. Однако, если управлять симистором в момент прохождения синусоиды через ноль вольт - помех не будет, но есть свои ограничения на использование такого метода :) (Брезенхема) Ну, вы же всё и так знаете, это я не вам, скорее, а зрителям :). Как смотрите на вопрос искоренения float и приведение вычислений PID к полностью целым числам: проводить 1 расчет PID за 1 замер температуры (для MX6675 это период 250мс), т.е. 4 раза в секунду меряем температуру и столько же раз в секунду считаем PID, что мгновенно повысит производительность на слабых платформах и повысит точность регулирования.
@@stubbornlifeseeker Да, разумеется гораздо правильнее проводить вычисление не 1 раз в секунду, а чаще. И в исходном коде PID у меня uint16_t но тогда слишком много придется рассказывать магии и отвечать на вопросы целочисленной математики. В видео про ПИД-регуляторы в этом нет никакой необходимости. В принципе вопросы оптимизации кода и подстройки под свои нужды это уже личное дело каждого. С другой стороны я сейчас не помню, но за сколько тактов там умножение с плавающей запятой? За 8 или 12 тактов, ну будет 8 строчек выполняться на 10 микросекунд дольше. Сильно тут выгоды я не вижу. Я вот честно скажу. За годы была только одна задача связанная с генерацией шумоподобного сигнала через DAC в которой пришлось сильно напрягаться с оптимизацией чтобы успеть все посчитать и сгенерировать сигнал на-лету. А в задачах ПИД-регулирования ну лично я не сталкивался.
а как ведет себя пид-регулятор, если сама система быстро меняется (в отношении печки пример сложно придумать - но если я хочу регулировать давление жидкости в системе, где ее расход неравномерный и непредсказуемый)
В случае с давлением есть более простые и понятные решения это специальные насосы, клапаны и прочее. С технологиями водоснабжения ПИД просто не нужен. Но с другой стороны в непредсказуемых системах к примеру авиа и квадрокоптеры ПИД чудесно справляется. Да и в космос ПИД летает. Так что нет там ничего сложного.
@@VladimirMedintsev горючие жидкости (бензин), форсункой и планируется стравливать давление через пид в зависимости от температуры ОЖ (тут инерция большая) и вакуума в коллекторе (а тут может скакать быстро и в широких пределах - но от него зависит как сама уставка, так и текущее давление бензина). короче, похоже, не попробуешь - не поймешь.
@@ljuberzy Вот стою сейчас смотрю на топливную рампу моего дизельного автомобиля и думаю а нафига же тупорылые инженеры сзади топливной рампы вставили клапан сбрасывающий давление в обратку... Это я к тому, что изготавливая стенд для форсунок надо делать топливную систему как в автомобиле. Иначе тест лажа полная будет. Взгляните как нормальные стенды сделаны... Там и электроника тоже срисована с ЭБУ.
Нагреватель самый легкий именно для демонстрации пример. С двигателем там не сложнее, там просто труднее показывать новичкам. Ну и с полетом коптера, точно так же. Но было бы труднее снимать и больше было бы не адекватных комментариев. Сам регулятор от этого не меняется совсем. И смысл не меняется.
Спасибо за практический пример! По интрегральной подскажите пожалуйста? Int = Int+(E + E0)/2 - Это сумма, которая постоянно возрастает. В вашем примере, получается, за каждый цикл(пусть 1 секунда для простоты) на величину E (пусть 5 градусов). Тоеть, каждую секунду это 5,10,15,20,25... Потом. cInt = Int*(1/ti) =Int /ti (ti=10) То есть каждую секунду мы должны видеть на экране 5/10=0,5; 10/10=1; 15/10=1,5; 20/10=2; 25/10=2,5 ... А мы видим, в разделе cInt, число близкое к 50, которое меняется +- 1. Подскажите пожалуйста, как правильно понимать? Можете написать маленький пример в числах, как получается значение в разделе cInt ?
Боюсь что у вас ошибка в логике. Е - это ошибка. Она может быть как положительной так и отрицательной. Возьмите данный код и прогоните в каком-нибудь симуляторе. Соответственно как только вы поймёте, что ошибка бывает и отрицательной, вы поймёте и почему моя программа в отладчике так себя вела.
@@VladimirMedintsev Задание 65, текущие значение 50. Пока не дойдем до 65, ошибка Е будет положительной. А значит сумма должна расти, а у вас нет. Такое впечатление, что есть разница между самим процесом и вашим объяснением процесса.
@@Sergnavin По сути все что я хотел в этом видео сказать, я сказал. Как показывает статистика 18 тысяч зрителей это обьяснение вполне устроило. Возвращаться к данному вопросу и как-то детализировать этот алгоритм я не вижу необходимости. Тем более что я даже показываю где можно почитать более детально о ПИД регулировании.
@@kdmytros Это уже обсуждалось. Не нужна ни какая защита. Будет сформировано исключение и обработчик исключения вернет 0. Т.е. это штатная ситуация для языка Си.
Хорошо рассказываете, я уже всё про STM32 смотрю ваше :) Меня только одно мучало.. почему контроллер делил на ноль и не падал ,там было (11:24) когда ti равен 0, и в формуле PID (1/ti) , чего оно не падало ? или висло. Это так.. мысли в слух :D Спасибо за видео. и нет совсем не внапряг слушать на скорости x1
Вы пока единственный кто это заметил. На самом деле если разделить на 0 целочисленный тип данных то взорвется, а я использовал возможность IEEE 754 который предусматривает возможность такой операции.
На сколько я знаю, на такие случаи есть обработчик исключений. Если происходит "невозможное" , то микроконтроллер выполняет переход в часть кода, который отработает в таком случае. А эта часть кода вам подвластна. Как напишете обработчик исключения так и будет работать, ничего не зависнет
@@VladimirMedintsev Вы не правы, стандарт предусматривает генерацию исключения при выполнении такой операции. То что у вас не падает программа, объясняется совсем иначе. ARM контроллеры предусматривают возможность настройки исключений, в частности можно включить/отключить генерацию исключения при делении на 0, так же ARM -овская реализация C-шной библиотеки предлагает возможности переопределения поведения при делении на 0. По умолчанию исключение отключено и деление на ноль возвращает 0, как для целых чисел так и для чисел с плавающей точкой.
Так а чего сложного? Перевести в целочисленную математику не сложно. Тут правда вопрос в другом, а float чем смущает? Ну вроде процессор не ATmel чтобы плавающей точки бояться.
@@VladimirMedintsev в системе команд STM32f030 так то нет VDIV. И UDIV, SDIV тоже нет. Вообще нет инструкций деления, не говоря уже о флоатах. У вас ведь используется F0, а там всего-то 54 инструкции ¯\_(ツ)_/¯
Говорят же опытные блогеры не отвечать на комментарии пользователей, нет не слушаюсь. Испорченный телефон получается. Я построил пример из видео на том процессоре который был под рукой. Это не значит что алгоритм PID-регулятора можно напускать только на F0 серии. Без разницы что в системе команд происходит. Скорость процессора достаточная и он ничем не занят. Сколько он там микросекунд потратит на эти вычисления в принципе никого не волнует. На выполняемой задаче это не скажется.
@@VladimirMedintsev странная у вас реакция какая-то. Вам про размер программы, вы про скорость проца, про не сложность математики... Ок, забота о энергопотреблении и размере прошивки - это для зануд. Покупаем F4 и не паримся :-D
@@DePyton F030 выполняет целочисленное деление за 1 такт, кстати. По спецификации Cortex-M0 целочисленное деление занимает от 1 до 32 тактов в зависимости от реализации чипа производителем. STM заявляет что их F030 делит за 1 такт.
для полного повторения нужно брать код из видео. В описании только краткое пояснение:В видеоролике показана работа вот этого кода PID регулятора. В качестве параметров используются переменные p, ti, td. tT - целевая температура, а cT - текущая температура. --------- float E, E0, Int, ti, td, p, cInt, cDif, PID; -------- tT = 65; p = 240; ti = 19; td = 600; --------- E0 = E; // Предыдущее значение ошибки E = tT - cT; // Текущая ошибка в градусах Int = Int+(E + E0)/2; // Интеграл разсогласования cInt = Int*(1/ti); // Интегральный вклад в регулирование cDif = td*(E-E0); // Дифференциальный вклад в регулирование PID = (p*E + cInt + cDif); // Регулятор
Для таких отладок очень удобно юзать STMStudio, которая строит график изменения переменной во времени. Наглядно все будет видно. Ну и очень не хватило рекомендаций как выбирать начальные коэффициенты либо как автоматизировать их выбор на основе первых же экспериментальных прогонов. Вам повезло, что система отрабатывает достаточно быстро. А вот если объект регулирования тормозной, то такой вот подбор может занять туевую хучу времени, измеряемое иногда часами.
Поддерживаю! Видео хорошее, но для наглядности не хватает графиков. На микроконтроллерах с выводом SWO для этого можно так же использовать Logic Analyzer в Keil и SWV Data Trace Timeline Graph в STM32CubeIDE.
Ну по хорошему вам нужно моделирование ситуации с сильно инерциальной системой и на листочке выводить приблизительные коэффициенты. И их уже подкорректировать на первых прогонах. Эт как бэ очень не простая фигня и за пять минут не расскажешь.
Владимир! Введите ограничение по насыщению интегральной составляющей. Иначе, если будет открыта дверца шкафа и потом Вы ее закроете, будет большое перерегулирование из-за "выходящего из насыщения" интегратора... Счастливо! Удачи Вам в проектах!
Да это крайне хорошая идея. Вы мне идею подкинули с трендом затрачиваемой на поддержание температуры энергии. При его изменении без изменения целевой температуры можно говорить о потере энергии и принимать меры. Спасибо. Хорошая идея.
@@VladimirMedintsev Владимир, Большое Спасибо за материал! применил и настроил ПИД для управления электромотором, но на определенных скоростях мотор коллеблется вокруг заданного значения. Например: 20об/м - колебания +-0.5об/м; 25+-2об/м; 50 +-1об/м... не могу найти решение как сгладить эти колебания. частота дискретизации системы - 128мс.
@@kdmytrosНадо экспериментировать с параметром мощности. Возможно это низкочастотная раскачка. Очень помогает если вы отладчиком поссотрите какой из параметров в момент раскачки доминирует в регулировании и из этого сделаете выводы.
@@VladimirMedintsev Большое спасибо! а частоту дискретизации системы можно ли как то учитывать ? эксперементирую тоже с частотой ШИМ, добавил остановку регулирования если ошибка меньше порогового значения..
Грамотно, четко, полезно! Лайк!
Отлично! То что надо, большое спасибо за работу!
Собрал регулятор оборотов коллекторного двигателя и замучался настраивать его.
С функцией start - при включении решил просто добавлять тихонечко мощность, затем режим work с которой проблема.
Получалось либо огромная реакция не снижение оборотов ( двигатель с перебоями работал, как бы периодически подгазовывая(- - - - - - ), либо терял обороты при нагрузке т.е. не достаточная реакция.
Спасибо. Попробую применить ПИД.
Спасибо автору за видео. Данная настройка справедлива для очень простого устройства. Есть пару дополнений к настройке. Диф. составляющая без отдельного импульса, почти бесполезна и даже избыточна. Для реальных условий желательно ставить доп. термопару на входе или выходе (тут зависит от процесса ) и отдельно дифференцировать этот вход. Настраивать коэф. лучше с предварительно расчета и при установке их, делать регулятор сначала более медленным, а потом выводить ку за грань устойчивости процесса и снижать ку на 10-15%.
Доброго, спасибо Вам за видео .Просто и понятно ,всегда с интересом смотрю ваши видео!
Следует внимательно отнестись к вычислению интегральной составляющей, т.к. в определённых ситуациях (невозможность системы компенсировать ошибку), в Int со временем может накопиться большая целая часть и из-за особенностей дискретного вычисления чисел с плавающей точкой будет происходить накопление ошибки. Особенно при использовании 32-х битного float. В таких случаях лучше использовать алгоритмы компенсационного суммирования.
Абсолютно верно. Ее необходимо ограничивать.
Интегральное насыщение нужно учитывать. Без этого система может уйтив раскачку.
На пальцах - интеграл нужно ограничивать, иначе он наберет огромное значение если к примеру он раьотает, а питание на нагреватель не дали.
If (integral > integralMax) integral = integralMax;
If (integral < integralMin) integral = integralMin;
Как выбирать величины макс и мин значения в литературе практически не описано, но по опыту обычно делпют в половину величины максимального управляющего воздействия.
А как вам вариант, например, просто останавливать интегрирование по достижению пределов управляющей величины?
Огромное спасибо за объяснение PID на пальцах)) Скачаю видео себе на телефон в качестве памятки! (если можно)
Ой, намучился я когда-то с ПИД регуляторами, когда квадрокоптер свой программировал))) Но как оказалось, причины мучений были не в самом ПИД регуляторе, а типе данных, которые подавались на его вход. Ну и конечно не сразу к применению кватернионов пришел, казалось слишком сложно, но на самом деле как раз наоборот. В итоге с третьего раза только написал, чтоб всё красиво летало и даже в ветер не страшно, что перевернется или расколбасит...
Слушай, а есть вариант код показать, очень нужно для курсовой по квадрокоптерам
Вот тут я узнал про оптосемистор. Очень пригодилось бы мне в самом начале постройки станочка для переработки пластика для 3d печати. Но уже нагородил с помощью обычного семистора со всеми вытекающими с переходом через 0.
Если мы говроим о температуре спекания компонентов на плате то самы длительный вариант процесса происходит до 5-ти минут, это повышение температуры до спекания, отключение нагрева, охлаждение до температуры около 150 градусов, далее в течении нескольких минут охлаждение до температуры при которой можно платы вытянуть с печки.
А вот за пид регулятор, и за его код в описании отдельный респект, уважуха и всех блага цивилизованного мира. Года два назад была попытка реализовать пид регулятор на ардуино, с целью понять что это. Но в сети кроме "библиотека PID.h помогает нам..." ничего не было. Я конечно в итоге допер до всего этого, не без помощи знаний из универа конечно, и код написал. НОООО... Наконец-то в интернете появилось нормальное видео о пид регуляторе, которое не поймет если только глухой и слепой. Нужно теперь попробовать сделать ещё раз пид регулятор, только на стмке. Глядишь, гроу бокс для выращивания семляники к зиме сделаю...
а зачем там пид? темп-ру воздуха регулировать? или свет тоже?
а чем нагреваете?
Благодарю 🙏 полезно
Спасибо, отличное видео!
Наконец то я понял) спасибо)
Лайк,!!! Где же Вы были раньше! Этак в 1975 году, Когда нам, студентам КПИ приходилось моделировать ПИД на аналоговой машине. Спасибо за лекцию.! Где можно скачать ваши исходники по МАХ и ПИД (по вашим лекциям).
В те годы был "компьютер" Проминь-2. Хорошая машина для развития логики программирования, кто помнит
Здравствуйте! Спасибо за видео.
Верно ли я понял, что 3999 на шим - это у вас будет 100% коэф заполнения?
Для чего Вы умножали результат ПИД на 4, тоже вот не совсем ясно...
Благодарю заранее за ответ!
Лучшее объяснение с практическим примером . Чем определяется максимальное значение PID ? Почему у Вас 1000?
есть ограничение в значениях таймера на шим (есть максимум). вообще можно все изначально умношить на 4 (значение термопары с резолюцией в 0,25) и работать только в int16_t\int32_t. это быстрее и экономичнее.
снимите дополнительный ролик в котором будет заложен алгоритм /идеология автоматической калибровки PID регулятора. я строю график температуры относительно времени. даю системе остыть полностью и меняю коэффиценты и снова запускаю и строю график. и сравниваю графики. меня интересует алгоритм/наработка/идея по автоматической корректировки. пусть это займет 10 часов но что бы система сама себя настроила до идеала в своей модели
За одну итерацию самонастройка проходит, не надо 10 часов.
@@SIM31r как. поясните
@@Александр-и5я9о старый метод Циглера-Никольса, можно автоматизировать подбор коэффициентов. Есть релейный метод Åström-Hägglund
При расчете дифференциальной части надо использовать не скорость, а ускорение.
Я человек простой, этим вашим ускорениям не обучен. Вы на пальцах обьясните чо писать.
@@VladimirMedintsev В строке кода :
cDif = td*(E-E0); // Дифференциальный вклад в регулирование
E-E0 - скорость изменения рассогласования: в полном виде должно быть (E-E0)/T, но в нашем случае T=1, как я понял, поэтому шаг по времени можно опустить.
Таким образом у нас тут рассчитывается скорость: ед/сек.
Для реализации же ПИД-регулятора необходимо вести расчёт по трём измерениям:
cDif = td*(E-2*E0+E1); // Дифференциальный вклад в регулирование
где E - текущее значение ошибки регулирования, E0 - в предыдущий момент времени, E1 - в предшествующий E0 момент времени.
Тут уже рассчитывается ускорение: ед/сек^2.
Обратите внимание на рекуррентный вид формулы на википедии: там так же по трём измерениям рассчитывается дифференциальная часть.
@@JustADigga-l4v Спасибо огромное, теперь понятно и мне и другим. И люди думаю вам еще не раз спасибо скажут.
Здравствуйте. Если Вы читаете это сообщение, ответьте пож. : Почему при расчете дифференциальной части ПИД надо использовать не скорость, а ускорение? В чем будут различия? Поясните чайнику, а то кто что пишет.
Спасибо за полезное видео! Было бы интересно, в дополнении, узнать про настройки выходного ШИМ сигнала. Какая частота работы таймера и собственно почему Power = 3999? И кстати, коэффициенты подбираются не только опытным путем, есть также и достаточно сложные математические формулы описывающие каждый параметр, с учетом минимального времени реакции системы. Тема интересная и сложная.
А все достаточно просто. Я делал ролик про ПИД-регулятор. По этой причине решил не заморачиваться и не делать полноценную регулировку мощности. Т.е. в данном видео частота следования импульсов ШИМ - 1 Герц. На результат регулирования это не повлияло. А мне существенно упростило жизнь. А т.к. ролик носил информационный характер то в нем нет каких-либо математических моделей автоподстройки параметров. Их на самом деле сделать не так сложно как кажется. Более того я в видео сказал с чего начинать - запуск источника на полную мощность и измерение скорости увеличения регулируемой величины. Это позволит узнать инертность системы и максимальную (на практике не достижимую) скорость набора температуры. Дальше не особо сложный алгоритм фильтрации по различным частотам (зависящим от инерции) и автоматическая подстройка параметров в заданном (разрешенном) диапазоне.
Спасибо. Познавательно. Можно сделать автонастройку ПИД? В том же REX-C100 есть эта фишка и это очень облегчает настройку под разные типы нагревателей. И еще. Без детекции нуля практически невозможно пользоваться нагревателями в видимом спектре, например на основе галогенок. Ослепнешь нафиг :) Всеж интересно увидеть ПИД регуляцию с детектором перехода через ноль. Если использовать PC814, то там всего 4 детали нужно. Два 1W резистора на вход, один подтягивающий на выход и сам PC814.
Видео не про детектирование 0 и особенности работы с оптопарами. Видео про ПИД регулятор.
О чем видео и так ясно. Было предложение о дальнейшем развитии этой темы, а не о том, что есть или чего нет в видео. И если нет диммирования зачем там MOC3021? Может лучше MOC3063 со встроенным детектором?
Задача регулятора (любого, ПИД, АПИД, нечёткой логики итд итп.) :
Максимально быстро, довести систему до нужного уровня, не выходя за пределы (наперёд оговорённые).
А двигаться медленно можно, но это не интересно.
К примеру: Нужно за синхронизировать водяную турбину гидроэлектростанции. Можно неделю, можно месяц. Кто быстрее?
Очень понравилось грамотное техническое объяснение простыми словами. Хочется спросить. Можно ли (плагинами, экспортом и тд) нужные нам значения показывать графически? В идеале 3 одновременно наложенных графика наших значение во времени?
Да, можно. Есть же даже видео на эту тему - th-cam.com/video/qGrLT99kzbg/w-d-xo.html
Спасибо.
Однако не совсем понятно в алгоритме связь "задержки" со временем интегрирования и дифференцирования :) Можно как то прозрачнее определить это?
Другими словами задать масштабы коэффициентов. Если пропорциональный в масштабе от температуры (при какой дельте температуры мощность изменится на 100%), то в каком масштабе I и D? В масштабе от периода (цикла) расчета PID регулятора? 1 сек в данном случае? Задают на какую величину изменяются корректировки за один цикл?
Я в прошлый раз вам написал какой то бред? Это был коммент по ошибке не в тот адрес, там один экспериментатор грел датчик галогенкой без экрана.
У Вас правда тоже возможен инфракрасный нагрев через тонкий экран изменяющий инерционность обратной связи? Я для экспериментов наклеил термистор на керамический резистор (для диапазона 25-40 град.С). А в реальности инерционность намного больше.
Я так понял у вас таймер настроен на частоту ШИМ 1 герц и вы скважностью регулируете накал ламы ?
Абсолютно верно. Именно так.
@@VladimirMedintsev В видео вы говорите что максимальное значение у вас PID одна тысяча ? Из чего это берется ? И почему умножаете на 4 для записи в PWM. У меня PWM настроен так -Prescaler 36000, Counter period 1000.Получается у меня максимальны импульс это при значении 1000.а у вас я так понял в 4 раза больше , не пойму как лучше сделать
Пид.. что-т новенькое, спасибо за инфу.
А вот цепочка у триака - не для индуктивных нагрузок, а для того, чтобы схема не реагировала на помехи из сети(в прочем, от индуктивных нагрузок) просто им не обязательно быть в цепи включения самого триака. Достаточно быть подключенными параллельно. Я так убрал эту цепочку, тоже подумав, что лишнее привинтил производитель. Как итог, при включении холодильника мигал свет :))) Так что убирать её не рекомендую, особенно если в доме не очень хорошая проводка....
А не.. чот припоминаю о самом принципе.. надо было чаще на лекции ходить в своё время))
какие Вы знаете методы построения графиков? кроме Cube монитора и SWV Data trace timeline graph
Vladimir Medintsev, выложите пожалуйста код управления трехпозиционным ПИД регулятором (например для управления трехходовым смесительным краном отопления с эл.приводом)
Начал копить на кран, открыл сбор средств. Надеюсь как деньги появятся обязательно купить и снять видео.
Int = Int+(E + E0)/2; // Интеграл разсогласования
cInt = Int*(1/ti); // Интегральный вклад в регулирование Вот эти формулы у меня вопрос а тогда чему равен просто Int с правой стороны.И 1/ti-Это период ti-время интегрироания?
Просто Int с правой стороны это предыдущее значение.
@@chibyshev а на самой первой итерации, Int какое значение имеет??
Интегральная составляющая регулятора является определённым интегралом. За какой период времени должен быть рассчитан этот интеграл? Как определить это время? Хочется получить конкретный ответ и пояснения.
Время интегрирования связано с постоянной времени процесса нагрева (для нагревателя) ?
Хорошо бы посмотреть с графиками как что отрабатывает.
Да в принципе и в отладке на видео все хорошо видно.
Владимир, подскажите, каким образом в своих программах Вы обрабатываете ситуации-исключения? Например, Вым нужно записать значение в EEPROM, а функция записи возвращает ошибку. Либо термопара отпала. Т.е. когда события развиваются не по плану... Например, в этом случае можно было бы вывести в терминал код ошибки место в программе, где она возникла.
У меня нет универсального ответа на ваш вопрос. Реакция на возникающие проблемы очень сильно зависит от устройства. Если устройство по своей схемотехнике позволяет ликвидировать проблему, то конечно это делается. Если же функционирование невозможно, то формируется сигнал ошибки. А иногда, как в случае "термопара отвалилась" сделать ничего нельзя. Приходится тупо выключать нагревательный элемент до возобновления правдивых показаний термопары. Ну иными словами на этот вопрос нельзя ответить в рамках одного абзаца. Но уж чего я точно никогда не делаю это не выдаю в терминал код ошибки и место в программе. Я лучше как-нибудь проиллюстрирую на примере какого-нибудь устройства.
Есть ломовое решение - освоить freertos. это неизбежное решение. рано или поздно с этим приходится сталкиваться.
Было бы здОрово ознакомиться с "простой" симисторно-тиристорной схемой. Ни когда с таким не сталкивался. Можно ссылочку попросить?
В конце предыдущего видео про термопару я показывал номиналы опто-семистора и силового семистора. В их даташитах легко все найти.
Подскажите пожалуйста, есть ли готовые примеры кода где МК сам видит что коэффициенты не подходят и сам подстраивает их(при изменении регулируемого параметра система не быстро балансируется и нескольлко раз прыгает вверх вниз)
Есть несколько математических подходов к построению самонастраивающегося ПИД-регуляторов, это видео пока только в планах.
@@VladimirMedintsev Пренепременно жду
1) если бы поясняли выбор значения П регулятора в форме передаточных функций, то было бы сразу все понятно откуда там статическая ошибка, ведь показав замкнутую систему в виде ПФ по ошибке сразу видно, почему регулятор выбранной структуры будет работать не верно
2) если совсем придираться, ПИД регулятор рассчитывается не верно, у вас коэф регулятора не зависят от шага квантования по времени, но это справедливо, если шаг квантования равен 1 сек, а у вас 0.98 сек...мелочь, для инерционного процесса сильно не скажется, но, если у платформы переменный шаг расчета? если процесс не такой инерционный как этот тепловой, то шаг квантования принципиален, и там уже систему нужно рассматривать как цифровую, а не аналоговую.
3) опустили вопрос с производной, да, вы сгладили сигнал с датчика, но важно показать как шумит производная, часто она так гадит, что нужно крепко задуматься над структурой фильтра
Уверяю вас, если на некоторые процессы смотреть проще и не относиться к ним так серьезно мир вокруг не станет хуже. Не ну я бы понял управляй мы башней Арматы, а нам в мирных целях...
Я уж тогда лучше видео сниму "увеличение инерции системы как способ повышения ее устойчивости".
@@VladimirMedintsev 1) безусловно!! городить огород нужно только там где это необходимо! НО, когда вас смотрят те, кто ничего не понимает в ТАУ, то многие важные моменты остаются за скобками. Это как смотреть на дом через щелку забора. Хотя покажи матаппарат, то все играет другими красками. Посмотрел несколько видео практиков по ПИД-регулятору, так все авторы интуитивно настраивают регулятор. ПИД!!!! хоть бы один сказал, что возможен П, ПИ, ПД регулятор..нет, сразу ПИД...знали бы, что еще ПИДД есть, ведь структура регулятора не с потолка берется, а определяется структурой объекта и требованиям к системе....2) армата говорите? а это здесь причем? если нет внятных требований к качеству переходных процессов, то все понятно, накидал коэф, получил статическую ошибку близкую к нулю, небольшое перерегулирование - норм. А если указаны требования к статической ошибке и времени отработки ошибки? то здесь без идентификации структуры и параметров объекта, моделирования и синтеза регулятора не обойтись. Я понимаю, что вы делаете, но мне кажется, что нужно четко очерчивать границы применимости подхода "вот ЗДЕСЬ так делать можно, а вот ЗДЕСЬ нельзя потому что...". 3) Увеличение инерции, для повышения устойчивости? у вас есть структурно неустойчивый объект? или регулятор с бесконечной мощностью? наверное, имеете в виду, принудительное затягивание переходного процесса, чтобы добиться апериодического переходного процесса в замкнутой системе? так достаточно выбрать требуемую структуру регулятора и настроить параметры регулятора, так, чтобы система находилась на апериодической границе устойчивости - там всего лишь одно требование - отрицательная вещественная часть нулей характеристического полинома и равенство нулю мнимой части всех корней. или проще, снять переходную характеристику объекта, датчик описывается апериодическим звеном первого порядка, К=1, Т - одна треть от тепловой инерции по паспорту датчика. В вашем случае объект тоже будет описываться апериодическим звеном первого порядка, только K и T нужно будет определить на основе экспериментальных данных, здесь без пакета моделирования не обойтись. А дальше выбираем структуру регулятора, составляем ПФ замнутой системы, скорее всего там будет ПФ в знаменателе полином 3 порядка, дело техники (но только аналитически) найти такие параметры регулятора, при которых их изменение приводит к появлению мнимых корней. Да, это все сложно, но как раз это показывает силу теории, а не просто тыкать пальцем в небо...конечно, проделав всю эту теоретическую работу может не получится))) модель будет не верна или поведение системы будет отличаться от той, на которой снимались первичные экспериментальные данные. В этом случае нужно рассматривать модель как нелинейную, ведь динамика системы зависит от возмущения, то есть температуры окружающего воздуха ...это еще то веселье)...чет меня понесло...3) вангую, что вам нужен всего лишь ПД регулятор...сами подумайте, зачем вам И составляющая, когда у вас на выходе регулятора ШИМ? интегральная составляющая накапливает ошибку, выходит, что интегральная составляющая обнулится только при наличии перерегулирования. Поэтому только П и Д составляющие должны остаться для вашего объекта с таким исполнительным механизмом
@@andrewmandra311 ух-ты. Может у вас канал есть с видео на данную тему? Интересует.
Можете дать ссылочку на код целиком, буду признателен)
В этом нет никакого смысла. Необходимый фрагмент кода находится в описании под видео.
Здравствуйте. Есть микросхема MOC3063, внутри которой заявлен определитель нуля. Можно ли на ней получить полноценный регулятор с определителем нуля, с простым включением как у вас?
Это зависит от того, для чего вы ее собираетесь использовать. Я не буду сейчас тут читать лекцию, но добрая половина людей рассуждающие об определении перехода через ноль не совсем понимают для чего это нужно. Дело в том, что упомянутая вами оптопара она определяет ноль для того, чтобы в нем включить нагрузку. Таким образом нагрузка включится действительно в самый оптимальный момент времени. А вот для полноценного ШИМ управления мощностью этого как раз и не надо. Иными словами если вам надо только вкл./выкл. то да эта оптопара вам очень даже подходит и можете использовать схему из ее даташита. А если вам делать ШИМ регулирование то она вам не подходит.
@@VladimirMedintsev хочется сделать нагреватель из утюга, детектор нуля - как минимум чтобы меньше помех было отдано в сеть 220. Мне представляется регулятор, отсчитывающий только целые полупериоды сетевого напряжения, так сказать, ШИМ с минимальным импульсом в 10мС. Пока не знаю какое тут соотношение оправданности к трудоёмкости, если сильно сложно, то может быть и не стоит заморачиваться
Да. Вы верно мыслите. MOC306x для Вашего случая подойдет идеально. Нагреватели очень инерционны и поэтому применять полноценный быстрый ШИМ для включения меньше чем на полупериод смысла мало. Синхронизация микроконтроллера с сетевым напряжением так же не нужна, т.к. +-1 полупериод на точность сильно не повлияет. Если будете использовать симистор, то не перепутайте местами аноды, иначе симистор будет постоянно открыт.
Я сделал такой регулятор с обратной связью еще. Пока на макетке, заказал еще 10 плат в китае.
Регулирует мощность от 1 до 100 полупериодов в секунду.
По опыту в настройке регуляторов для технологических объектов традиционный способ не подходит ( настройка П составляющей, а после подстройка И составляющей ).
Более лучший результат дает настройка от И составляющей, а после подстройка П.
Конечно для электроники это не показатель, поскольку можно свободно рвать управлящеее воздействие 0-100-0-100%
Это не верный способ в принципе. Но спорить мы пожалуй не будем. Если вам так больше нравится, то настраивайте.
Это всё дело привычки. Я например начинаю настройку ПИД-регулятора вообще не с ПИД-регулятора =) А с оценки реакции системы на вручную созданное управляющее воздействие.
Последнее предложение про электронику вообще не понял. Далеко не все технологические объекты имеют плавное (аналоговое) управление. Релейное управление (вкл/выкл, 0%/100%) встречается довольно часто и прекрасно работает с ПИД-регуляторами.
Владимир здравствуйте, не могу понять 131 строку Int = Int + (Е + Eo) / 2; // интеграл рассогласования
переменная с названием Int - объявлена но не заполнена в правой части = Int + (Е + Eo) объясните зачем Int справо. спасибо
Так мы реально здесь интегральное значение считаем. Выражение в скобках ведь может отказаться и нулевым и отрицательным. Т.е. int будет увеличиваться до тех пор пока не станет оптимальным.
Такой подход к интегралу вполне оправдан когда у нас постоянный интервал между выборками.
Владимир я понимаю когда так
Int = (Е + Eo) / 2;
но когда так
Int = Int + (Е + Eo) / 2;
не понимаю
Накопительная величина.
Это же второй компонент пИд
Просто в уме просчитайте пару итераций цикла. Вы увидите что Int будет увеличиваться от 0 до некоторой величины и на ней остановится
Ви наверное не поняли вопрос. Если к мусору в памяти прибавить 50 неизвестно что получиться. Int = мусор + (50)/2; или Int = (50)/2;
есть реле. раз в секунду берется температура... реле 100 процентов мощности... чем мне управлять(временем включения ???) кстати сделал регулятор для плитки для пайки по профилю на есп8266 прошивка esp easy...(на правилах) пока в п пежиме
А какого типа переменная tT и сT? Cels типа unsigned int ? Немного не пойму как все привести к правильному типу , чтоб все нормально вычислялось .
Да, это integer
Владимир, на применяемой Вами плате нет кварца. На сколько он нужен в "боевых условиях" на той же самой печи для пайки ПП? Как я понимаю, отсчет времени будет плавать. Ведь так?
Внутри контроллера стоит RC цепочка она на заводе калибрована. Так что это "плавать" не превысит пары секунд в сутки. Что не имеет никакого значения для ПИД-регулятора. Иными словами это от применения зависит. Особая точность нужна не везде.
@@VladimirMedintsev , если вопрос действительно стоит в нескольких секундах в сутки, это приемлемо для большинства задач. Кстати, у серии G0 точность внутреннего генератора , по заявлению STM кратно возросла. Уже сейчас на рынке доступны аналоги того же stm32f030f4p6, но со значительно улучшенными характеристиками. Обратите на них внимание!
Здравствуйте! Переменная ti стоит в знаменателе. Разве ее можно ставить равной 0 ? Ведь будет деление на ноль и бесконечно большая величина PID? А в примере, когда вы показываете настройку коэффициентов, этого не происходит?
Вы же видите что в показанном примере ничего вами описываемого не случается. Формируется исключение.
@@VladimirMedintsev Спасибо, теперь все встало на свои места. Просто код на экране без исключений вот и не было понимания.
Как всегда, отличное видео! Владимир, а что, если требуется не просто нагреть до заданной температуры, но и сделать это за конкретный промежуток времени (условно, до 50 градусов за 10 минут)? Как изменится программа? Есть ли типовое решение этой задачи?
Тогда по времени меняйте целевую температуру. Т.е. сделайте некоторый цикл в котором плавно повышайте температуру которая должна быть в каждый момент времени, а ПИД регулятор будет стараться за вами успевать. Если ему конечно же мощности хватит.
@@VladimirMedintsev, спасибо. Я примерно так себе это и видел.
Подскажите еще момент PID это значение воздействия или это проценты?
Если у меня шим сигнал 255 то надо что то переводить?
Вообще выход сигнала будет от 0 до 1 , а там вы преобразовываете в нужный вам интервал
Владимир, подскажите вот что. Я или прослушал, или в видео не было этого - вы сказали, что предельное выходное значение регулятора равно тысяче, поэтому надо умножить на 4. А откуда эта тысяча взялась? Как вы её посчитали?
Сейчас пишу свой ПИД со всей шелухой типа сглаживаний, линейных преобразований для АЦП и ЦАП/ШИМ, и тут-то вот и напоролся на то, что надо по-честному как-то пересчитать управляющий сигнал.
1000 миллисекунд. Регулирование в моем примере 1 раз в секунду. Боюсь вы ничего не поняли из видео, раз последовал такой вопрос.
@@VladimirMedintsev ну нет же. Смотрите на 10:10. "Значение пид-регулятора..."
Приветствую, подскажите тут cInt = Int*(1/ti); - еденица это время как я понимаю опроса dt
Int = Int+(E + E0)/2 - а что такое 2 ?
и везде читал, что Int надо ограничивать или по этим формулам он уже будет ограничен?
Нет, необходимо ограничивать. На канале, среди недавних, есть видео, где это сделано еще раз.
У меня вопрос а как же Ki ?Я имею ввиду что формулв PID=Kp*(set-real)+Ki*(Is*(set-real)*T)+Kd*((setn-realn)-(set_pr-real_pr))*1/T вот такая формула правильно я понял.У вас нет коэффициентов.
на реальной конструкции заметил что время dt все же меняется , как выяснил это влияние вызвано самой матиматикой тоесть иногда вычисления проходять чуть дольше иногда чуть меньше есть ли какие способы борьбы с этим?
Это никак не может быть вызвано математикой. Операции сложения, умножения, деления в микроконтроллерах занимают одно и то же количество тактов не зависимо от погоды.
Заводим еще один таймер на микросекунды, и с помощью его перед самим пид вычисляем реальное время . примерно так.
Dt_baro = TIM4->CNT;
Dt_baro_fin = 0.000001f * (uint16_t)(Dt_baro - Dt_baro_old);
Dt_baro_old = Dt_baro;
переменная Dt_baro_fin будет имет нужное время.
Доброго времени суток ,а что у Вас в watch1 выведено ?
Переменные там.
Здравствуйте! Оптопара moc3021 не детектирует переход через 0 , лучше мощные нагрузки так не коммутировать.
Почему?
@@VladimirMedintsev в сеть гадит помехой тем больше чем мощнее нагрузка. С нагреваетелями используют пррпуски периодов
@@VladimirMedintsev открытие симистора в связке с оптотриаком типа MOC3023 происходит в произвольный момент синусоиды в сети, стало быть синус ломается, что вызывает сильные помехи для других потребителей энергии. Однако, если управлять симистором в момент прохождения синусоиды через ноль вольт - помех не будет, но есть свои ограничения на использование такого метода :) (Брезенхема) Ну, вы же всё и так знаете, это я не вам, скорее, а зрителям :). Как смотрите на вопрос искоренения float и приведение вычислений PID к полностью целым числам: проводить 1 расчет PID за 1 замер температуры (для MX6675 это период 250мс), т.е. 4 раза в секунду меряем температуру и столько же раз в секунду считаем PID, что мгновенно повысит производительность на слабых платформах и повысит точность регулирования.
@@stubbornlifeseeker Да, разумеется гораздо правильнее проводить вычисление не 1 раз в секунду, а чаще. И в исходном коде PID у меня uint16_t но тогда слишком много придется рассказывать магии и отвечать на вопросы целочисленной математики. В видео про ПИД-регуляторы в этом нет никакой необходимости. В принципе вопросы оптимизации кода и подстройки под свои нужды это уже личное дело каждого. С другой стороны я сейчас не помню, но за сколько тактов там умножение с плавающей запятой? За 8 или 12 тактов, ну будет 8 строчек выполняться на 10 микросекунд дольше. Сильно тут выгоды я не вижу. Я вот честно скажу. За годы была только одна задача связанная с генерацией шумоподобного сигнала через DAC в которой пришлось сильно напрягаться с оптимизацией чтобы успеть все посчитать и сгенерировать сигнал на-лету. А в задачах ПИД-регулирования ну лично я не сталкивался.
Vladimir Medintsev спасибо
а как ведет себя пид-регулятор, если сама система быстро меняется (в отношении печки пример сложно придумать - но если я хочу регулировать давление жидкости в системе, где ее расход неравномерный и непредсказуемый)
В случае с давлением есть более простые и понятные решения это специальные насосы, клапаны и прочее. С технологиями водоснабжения ПИД просто не нужен. Но с другой стороны в непредсказуемых системах к примеру авиа и квадрокоптеры ПИД чудесно справляется. Да и в космос ПИД летает. Так что нет там ничего сложного.
@@VladimirMedintsev горючие жидкости (бензин), форсункой и планируется стравливать давление через пид в зависимости от температуры ОЖ (тут инерция большая) и вакуума в коллекторе (а тут может скакать быстро и в широких пределах - но от него зависит как сама уставка, так и текущее давление бензина). короче, похоже, не попробуешь - не поймешь.
@@ljuberzy Вот стою сейчас смотрю на топливную рампу моего дизельного автомобиля и думаю а нафига же тупорылые инженеры сзади топливной рампы вставили клапан сбрасывающий давление в обратку... Это я к тому, что изготавливая стенд для форсунок надо делать топливную систему как в автомобиле. Иначе тест лажа полная будет. Взгляните как нормальные стенды сделаны... Там и электроника тоже срисована с ЭБУ.
@@VladimirMedintsev это не стенд. это типа электронный регулятор управляющего давления на k-jetronic.
ljuberzy выкини ты этот древний, механический, глючный впрыск и поставь нормальный, дешевле будет.
А стабилизация скорости двигателя.Нужно обратную связь.
Почему везде в пример приводится именно нагреватель? Все про терморегулятор снимают.
Нагреватель самый легкий именно для демонстрации пример. С двигателем там не сложнее, там просто труднее показывать новичкам. Ну и с полетом коптера, точно так же. Но было бы труднее снимать и больше было бы не адекватных комментариев. Сам регулятор от этого не меняется совсем. И смысл не меняется.
Спасибо за практический пример! По интрегральной подскажите пожалуйста?
Int = Int+(E + E0)/2 - Это сумма, которая постоянно возрастает. В вашем примере, получается, за каждый цикл(пусть 1 секунда для простоты) на величину E (пусть 5 градусов). Тоеть, каждую секунду это 5,10,15,20,25... Потом.
cInt = Int*(1/ti) =Int /ti (ti=10) То есть каждую секунду мы должны видеть на экране 5/10=0,5; 10/10=1; 15/10=1,5; 20/10=2; 25/10=2,5 ...
А мы видим, в разделе cInt, число близкое к 50, которое меняется +- 1.
Подскажите пожалуйста, как правильно понимать?
Можете написать маленький пример в числах, как получается значение в разделе cInt ?
Боюсь что у вас ошибка в логике. Е - это ошибка. Она может быть как положительной так и отрицательной.
Возьмите данный код и прогоните в каком-нибудь симуляторе. Соответственно как только вы поймёте, что ошибка бывает и отрицательной, вы поймёте и почему моя программа в отладчике так себя вела.
@@VladimirMedintsev Задание 65, текущие значение 50. Пока не дойдем до 65, ошибка Е будет положительной. А значит сумма должна расти, а у вас нет.
Такое впечатление, что есть разница между самим процесом и вашим объяснением процесса.
@@Sergnavin По сути все что я хотел в этом видео сказать, я сказал. Как показывает статистика 18 тысяч зрителей это обьяснение вполне устроило. Возвращаться к данному вопросу и как-то детализировать этот алгоритм я не вижу необходимости. Тем более что я даже показываю где можно почитать более детально о ПИД регулировании.
@@VladimirMedintsev Огромное Спасибо за объяснение ! может я ошибаюсь но если ti = 0 в Int*(1/ti) там должна какая то защита стоять от деления на 0 ..
@@kdmytros Это уже обсуждалось. Не нужна ни какая защита. Будет сформировано исключение и обработчик исключения вернет 0. Т.е. это штатная ситуация для языка Си.
Владимир, как вы вычислили, что максимальное значение PID, у вас 1000 (10:18)? На 8:00 проскакивает 1468.
P.S. обожаю комментировать древние видосы
за три года в теории пид регулятора врятли чтото поменялось)))
Меняете на 50 It а говорите про градусы - wtf? и про время интегрирования и дифф ни слова. Зато простыня про донаты
Бля@! Как же всё просто! Спасибо!
Хорошо рассказываете, я уже всё про STM32 смотрю ваше :)
Меня только одно мучало.. почему контроллер делил на ноль и не падал ,там было (11:24) когда ti равен 0, и в формуле PID (1/ti) , чего оно не падало ? или висло. Это так.. мысли в слух :D
Спасибо за видео. и нет совсем не внапряг слушать на скорости x1
Вы пока единственный кто это заметил. На самом деле если разделить на 0 целочисленный тип данных то взорвется, а я использовал возможность IEEE 754 который предусматривает возможность такой операции.
@@VladimirMedintsev строка 133, cInt = Int * ( 1/ti);
при этом ti = 0. деление на 0. Я просто ожидал что хоть как-то глюкнет
@@VladimirMedintsev Ясно.. спасибо за пояснение
На сколько я знаю, на такие случаи есть обработчик исключений. Если происходит "невозможное" , то микроконтроллер выполняет переход в часть кода, который отработает в таком случае. А эта часть кода вам подвластна. Как напишете обработчик исключения так и будет работать, ничего не зависнет
@@VladimirMedintsev Вы не правы, стандарт предусматривает генерацию исключения при выполнении такой операции. То что у вас не падает программа, объясняется совсем иначе. ARM контроллеры предусматривают возможность настройки исключений, в частности можно включить/отключить генерацию исключения при делении на 0, так же ARM -овская реализация C-шной библиотеки предлагает возможности переопределения поведения при делении на 0. По умолчанию исключение отключено и деление на ноль возвращает 0, как для целых чисел так и для чисел с плавающей точкой.
А чего PID получается не больше 1000?
Ну почему же? Может и больше. Это же "желание" регулятора. Т.е. там может быть любое число.
вот бы с целыми числами было, без всяких там флоатов....
Так а чего сложного? Перевести в целочисленную математику не сложно.
Тут правда вопрос в другом, а float чем смущает? Ну вроде процессор не ATmel чтобы плавающей точки бояться.
@@VladimirMedintsev в системе команд STM32f030 так то нет VDIV. И UDIV, SDIV тоже нет. Вообще нет инструкций деления, не говоря уже о флоатах. У вас ведь используется F0, а там всего-то 54 инструкции ¯\_(ツ)_/¯
Говорят же опытные блогеры не отвечать на комментарии пользователей, нет не слушаюсь. Испорченный телефон получается.
Я построил пример из видео на том процессоре который был под рукой. Это не значит что алгоритм PID-регулятора можно напускать только на F0 серии. Без разницы что в системе команд происходит. Скорость процессора достаточная и он ничем не занят. Сколько он там микросекунд потратит на эти вычисления в принципе никого не волнует. На выполняемой задаче это не скажется.
@@VladimirMedintsev странная у вас реакция какая-то. Вам про размер программы, вы про скорость проца, про не сложность математики... Ок, забота о энергопотреблении и размере прошивки - это для зануд. Покупаем F4 и не паримся :-D
@@DePyton F030 выполняет целочисленное деление за 1 такт, кстати. По спецификации Cortex-M0 целочисленное деление занимает от 1 до 32 тактов в зависимости от реализации чипа производителем. STM заявляет что их F030 делит за 1 такт.
Я извиняюсь но.... ничего не понимаю.. а где код-то ? Вижу только с десяток первых строк
А сам ПИД регулятор это и есть 5-6 строк. Вам какой код нужен?
А где код?
В описании под роликом.
а слона то я не увидел))
для полного повторения нужно брать код из видео. В описании только краткое пояснение:В видеоролике показана работа вот этого кода PID регулятора.
В качестве параметров используются переменные p, ti, td. tT - целевая температура, а cT - текущая температура.
---------
float E, E0, Int, ti, td, p, cInt, cDif, PID;
--------
tT = 65;
p = 240;
ti = 19;
td = 600;
---------
E0 = E; // Предыдущее значение ошибки
E = tT - cT; // Текущая ошибка в градусах
Int = Int+(E + E0)/2; // Интеграл разсогласования
cInt = Int*(1/ti); // Интегральный вклад в регулирование
cDif = td*(E-E0); // Дифференциальный вклад в регулирование
PID = (p*E + cInt + cDif); // Регулятор