Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

Re: PID-регулятор на языке C.

Пт май 13, 2022 16:10:59

dt это время прошедшее между замерами - чтобы узнать скорость, нужно знать путь и время, можно измерять скорость за весь путь, а можно за короткий его участок, причём чем эти участки короче, тем "живей" (менее сглаженным) будет график скорости, математики хотят убавить этот участок до нуля, но на нулевом участке не измерить скорости, поэтому математики согласились просто сделкть его очень маленьким.... а инженеры (и программисты) оптимальным - чтобы и обсчитывать было проще и "задумчивости" не возникало

Добавлено after 3 minutes 21 second:
dt из программы выкинуть ни-как не получится! но, если dt всегда равен 0,01с (или другому значению, важно, что он постоянен) то его можно учесть в прикомпонентных коэффициентах вот и весь фокус...



Это более-менее понятно, но почему его тогда можно исключить?

dt из программы выкинуть ни-как не получится! но, если dt всегда равен 0,01с (или другому значению, важно, что он постоянен) то его можно учесть в прикомпонентных коэффициентах вот и весь фокус...


Ага, вот это я уже понял! Из аппнота ATMEL'а. Спасибо! Моя задача сейчас разобраться, как работает PID-алгоритм, а не сделать сверхэффективную программу. Почему я делаю это так? Без понтов типа структур и тому подобного? Потому что так нагляднее лично для меня. Я много лет писал ПИКи на ассемблере, и язык C для меня пока сложноват. Поэтому я принципиально не использую HAL, структуры и тому подобное - мне это глаз режет. Пишу только на регистрах.
Последний раз редактировалось Lum1noFor Пт май 13, 2022 16:15:46, всего редактировалось 1 раз.

Re: PID-регулятор на языке C.

Пт май 13, 2022 16:15:04

так-же я крайне не рекомендую выкидывать дифференцикльную компоненту из расчетов на любых инерционных процессах:
если тэн в паяльнике имеет ощутимую массу и способен остатками запасенного тепла после отключения ещё поднять температуру жала, то компонента Д необходима как для подавления этого эффекта, так и для устранения вызванных им колебаний.

Re: PID-регулятор на языке C.

Пт май 13, 2022 16:17:04

так-же я крайне не рекомендую выкидывать дифференцикльную компоненту из расчетов на любых инерционных процессах:
если тэн в паяльнике имеет ощутимую массу и способен остатками запасенного тепла после отключения ещё поднять температуру жала, то компонента Д необходима как для подавления этого эффекта, так и для устранения вызванных им колебаний.



Убрал D-компоненту. Происходит именно то, что Вы описали - ткнул паяльником в Розе, температура упала на 15 градусов ниже уставки, а затем взлетела на 80 градусов выше уставки.

Re: PID-регулятор на языке C.

Пт май 13, 2022 16:26:01

Lum1noFor, вы не попробовали мною подправленный код? я там какраз ввел мягкую подрезку интегральной составляющей... сначала режется сильно (возможно даже слишком, надо будет проверить граничные условия), затем по мере прогрева паяльника хватка корректора ослабевает до 0. позволяя регулятору работать самостоятельно

Re: PID-регулятор на языке C.

Пт май 13, 2022 16:34:45

Пробовал, на первый взгляд работает. Но мне не хотелось бы бездумно копировать чужой код, поэтому сначала нужно обдумать, что же всё-таки Вы там наделали :). Теперь уже до понедельника, ушел с работы. А таскать с собой 250-ваттный трансформатор - то ещё удовольствие. Пока будет время проанализировать Ваше решение

Re: PID-регулятор на языке C.

Пт май 13, 2022 18:02:42

почему Вы говорите, что можно просто взять и убрать dt. Если есть время и возможность - объясните, пожалуйста!
Ув. Ivanoff-iv уже объяснил. Вкратце, если переписать вычисление интегральной как я советовал, то будет:
Integral += error * dt * Ki;
где: dt * Ki - const. А зачем многократно вычислять одно и то же, если его можно вычислить только один раз - при настройке Ki? А если учесть, что само значение Ki - это просто безразмерный коэффициент, не имеющий физического выражения (в метрах/кг/etc.) и Вы его просто подбираете каким-то методом, то просто отбрасывайте dt из формулы и подбирайте Ki.

Во-вторых: Здесь интегральную составляющую лучше считать так:
Integral += error * Ki;
Далее - ограничение. Это и будет I.

А почему именно так? Из соображений производительности, или есть какие-то другие причины? Почему не "в лоб", вот так:

Код:
Integral += error * dt;

if (Integral > max/Ki) {
   Integral = max/Ki;
} else if (Integral < -max/Ki) {
   Integral = -max/Ki;
}

I = Ki*Integral;

Ну во-первых: значительно меньше вычислений. Сами сравните.
Во-вторых: в этом Вашем коде - представьте, что система регулирования в каком-то режиме не может обеспечить минимизацию error. Например - из-за ограничений интегральной составляющей. Тогда ошибка будет всегда присутствовать. Integral будет расти и расти постоянно со знаком направленным в сторону error. И в конце-концов всё равно произойдёт или переполнение Integral (float тоже не бесконечен). Или потеря точности (тогда содержимое Integral дорастёт до такого уровня, что оно перестанет реагировать на изменение входного error, так как величина error будет меньше веса минимального разряда Integral) и интегральная составляющая вашего ПИД-регулятора навечно защёлкнется в фиксированном положении. Это как раз тот момент, о котором я говорил:
И к тому же - в плавающей точке приколов тоже не меньше. И переполнения там имеются, и всякие особые значения (денормированные, "нечисла", +-бесконечности). Только начинающие о них никогда не задумываются.


Но даже если переполнения или потери точности не произойдёт, то в вашем методе ограничения Integral, будет присутствовать значительный гистерезис. Например долго стояла положительная ошибка, Integral выросло (например стало == +1e6), но ограничение стоит например == +100. А потом error стало отрицательным, но небольшим по величине. И теперь пока оно не выберет весь этот накопленный +1e6, на входе у вас будет стоять максимальное положительное значение == +100.
Последний раз редактировалось jcxz Пт май 13, 2022 18:24:12, всего редактировалось 1 раз.

Re: PID-регулятор на языке C.

Пт май 13, 2022 18:21:10

нет, тут защелкивания не произойдёт, т.к. ограничитель срезает именно аккумулятор, а не вычисляемую из него величину I.
а вот вычислений, действительно, в несколько раз больше...

Re: PID-регулятор на языке C.

Пт май 13, 2022 18:42:49

то компонента Д необходима как для подавления этого эффекта, так и для устранения вызванных им колебаний.
Не очень понятно как тут поможет Д? Оно тут, имхо, вообще не при чём.
Дифференциальная компонента нужна для ускорения реакции на быстропроисходящие процессы. В задаче ТС она просто приведёт к увеличению шума.

Добавлено after 3 minutes 26 seconds:
нет, тут защелкивания не произойдёт, т.к. ограничитель срезает именно аккумулятор, а не вычисляемую из него величину I.
Да, сорри, это я просмотрел что ТС потом в этот же Integral и сохраняет.
Отвлекают, блин....... :dont_know:

Добавлено after 2 minutes 2 seconds:
а вот вычислений, действительно, в несколько раз больше...
И к тому-же: среди них присутствуют деления, что ещё хуже.

Re: PID-регулятор на языке C.

Сб май 14, 2022 07:26:40

Вкратце распишуткомпоненты и приведу их аналоги в физическом мире:

P=L*Kp; (где L - отклонение от цели), аналогия - пружина с жесткостью Kp.
В устаканенном состоянии (при L=0) бездействует. Колебания не подавляет (вспомните пружинный маятник), а может даже усиливать из-за того, что реакция регулятора, в отличии от пружины, не мгновенна.

I=En*Ki; En=E(n-1)+L*dt; аналогия - воздушный шар, его подъёмная сила не зависит от положения, а зависит от наполненности теплым воздухом, скорость наполнения/опорожнения пропорциональна отклонению.
(переход от скорости изменения состояния к состоянию есть первообразная).
(воздушный шар ведёт себя лучше, чем И компонента регулятора из-за того, что наполнение его происходит по более сложным алгоритмам, чем простое сложение отклонений), ещё: если бы шар, находящийся в точке равновесия не остужался внешним воздухом, то для его удержания не потребовалась бы работа горелок, так и в регуляторе в устаканенном состоянии (скорость и отклонение равны 0) всё воздействие берёт на себя И компоента. Колебания не подавляет т.к. слишком инерционна.

D=V*Kd; V=dL/dt =(L(n-1) - Ln)/(t(n-1)-tn); (V - расстояние, пройденное за единицу времени, т.е. скорость, скорость - есть производная от положения) т.е. компонента Д "борется" только со скоростью, пытаясь затормозить объект, куда бы тот ни двигался. аналогия - вязкая среда или амортизатор.
В устаканенном состоянии бездействует, но первая начнёт компенсировать внешнее воздействие, если правильно настроена - подавляет колебания, не требуется если регулируемый объект сам не склонен к колебаниям (медленные безинерционные процессы).

Re: PID-регулятор на языке C.

Сб май 14, 2022 08:23:45

ТС рулит синусоидой пропорционально шимом, вроде. Что даст сильно нелинейную зависимость задание-мощность. Тяжко пиду будет. А в целом - главное уже описали, но немного добавлю. Д компонента сильно не любит шум, особенно если разрешение сигнала грубое. Может сильно дёргать задание. Танцы с интегральный суммой есть суть защита от насыщения регулятора. Вариантов масса, в т. Ч. Фирменные патентованные. Например: если общее задание вылазит за пределы-приближаем интегральную сумму к 0 тем или иным способом (отнять или прибавить удвоенную текущую ошибку).

Re: PID-регулятор на языке C.

Сб май 14, 2022 09:35:13

Н-да-а-а-а... А чё, почитать учебники впадлу?

Откуда взялся период в 10мс? Вообще-то, период вычисления- это величина расчётная. Неужели так сложно почитать об инженерных методах настройки регуляторов? В любом случае, вне зависимости от метода настройки, сначала снимается разгонная характеристика объекта, по которой определяется период регулирования и тем или иным методом первое приближение коэффициентов ПИД-регулятора. Кстати, и период снятия отсчётов с АЦП тоже берётся не от фонаря, а связан и с периодом регулирования, и с частотой сети.

На практике я пользовался методами Зиглера-Никольсона и Астрома-Хагглунда. З-Н относится к числу "жёстких" методов, поэтому даёт быстрый выход на режим, но большое перерегулирование и склонен к колебаниям. А-Х относится к "мягким", в которых перерегулирование меньше, но время выхода больше. На печках А-Х давал мне сразу очень хорошие значения коэффициентов регулятора, близкие к оптимальным для решения задачи. Как верно замечено выше, Д-компонента очень чувствительна к шуму, поэтому с ней нужно быть внимательным, возможно, даже занулить, а потом добавлять понемногу и смотреть реакцию объекта.

Добавлено after 2 minutes 4 seconds:
Проблему интегрального насыщения решал простым ограничением значения интегральной составляющей, ибо это предельно просто и не требует серьёзных вычислений..

Re: PID-регулятор на языке C.

Сб май 14, 2022 10:13:54

И в конце-концов всё равно произойдёт или переполнение Integral (float тоже не бесконечен).

Не вникая в конкретную программу, а чисто по логике: для переполнения float при суммировании не заоблачных значений понадобятся годы сутки как минимум :o

Re: PID-регулятор на языке C.

Сб май 14, 2022 11:10:55

jcxz писал(а):Ув. Ivanoff-iv уже объяснил. Вкратце, если переписать вычисление интегральной как я советовал, то будет:
Integral += error * dt * Ki;
где: dt * Ki - const. А зачем многократно вычислять одно и то же, если его можно вычислить только один раз - при настройке Ki? А если учесть, что само значение Ki - это просто безразмерный коэффициент, не имеющий физического выражения (в метрах/кг/etc.) и Вы его просто подбираете каким-то методом, то просто отбрасывайте dt из формулы и подбирайте Ki.


Вот Ваше бы это объяснение, да на недельку пораньше мне! Я столько времени потратил на то, чтобы это найти и понять. А то, думаю, в каких-то статьях dt есть, в каких-то нету. На eevblog народ тоже долго разбирался, почему так. Спасибо!

rusl32 писал(а):ТС рулит синусоидой пропорционально шимом, вроде. Что даст сильно нелинейную зависимость задание-мощность. Тяжко пиду будет.


Да, это я понимаю. Ибо прирост мощности не линеен после половины полупериода. Но в этом-то и есть интерес, как это будет работать. Это мой личный проект, ни на работу, ни на учебу, никуда. Не получится - ну и фиг с ним. Главное, опыт получен, что так делать не надо :).

Остался один непонятный для меня вопрос: ув. tonyk говорил, что:

Откуда взялся период в 10мс? Вообще-то, период вычисления- это величина расчётная. Неужели так сложно почитать об инженерных методах настройки регуляторов?


Но во всех источниках, которые я читал по ПИД-регуляторам (книжек там не было, да, ибо там жесткий матанализ), рекомендуют как можно чаще вызывать ПИД-алгоритм. В некоторых случаях он даже крутится в бесконечном цикле. А здесь, благодаря вам всем, я начинаю что-то подозревать, что это далеко не так. Вы можете мне ткнуть носом, какие книжки читать, либо вкратце рассказать, как выбирать этот самый дискрет? Методом тыка я понял, что 1 мс и 10 мс - слишком мало для моего случая, и незначительное изменение измеряемой величины за время dt приводит к сильному "дерганию" регулятора. При значении 100 мс все гораздо лучше.

Кстати, и период снятия отсчётов с АЦП тоже берётся не от фонаря, а связан и с периодом регулирования, и с частотой сети.


Я выкладывал уже код, в котором показано, как у меня это работает. Значение с термопары считывается по срабатыванию таймера дискрета, и сразу же передается в PID-алгоритм. Это правильно? А вот как это может быть связано с частотой сети - я не понимаю. У меня Zero-cross работает вообще независимо от пида, это железка. Он только 50 раз в секунду берет высчитанное значение с выхода ПИД-алгоритма.

Re: PID-регулятор на языке C.

Сб май 14, 2022 12:17:36

Не вникая в конкретную программу, а чисто по логике: для переполнения float при суммировании не заоблачных значений понадобятся годы сутки как минимум :o
О размерах входной ошибки и входного значения dt в задаче ТС - нам ничего не известно. Поэтому не знаю как Вы смогли посчитать скорость переполнения. :dont_know:
К тому же (как писал уже): кроме переполнения собственно всего float, может быть переполнение только его мантиссы. Возможно это правильнее назвать "потеря точности". Мантисса всего = 23 бита размером. Поэтому если предположим: какое-то время будет (error * dt)==1000 и всё это время Integral наращивать на +1000 каждую итерацию, то примерно через всего ~84 секунды (2^23/1000*.01=~84), содержимое Integral превысит 2^23 и если после этого вдруг (error * dt) станет небольшой отрицательной величиной, например ==-1, то прибавление оного к Integral не должно никак изменять его значения. Может это случится чуть позже (на один двоичный порядок позже, не через 84 секунды, а через 168 секунд - это не принципиально), но явно - годы не нужны для этого.
Это я и имел в виду, говоря о "защёлкивании".

PS: Как писал выше - всё это справедливо если бы ограничение выполнялось для Integral, используемого для дальнейших расчётов, не влияя на само значение Integral. Если ограничивать саму Integral, то тогда такого эффекта не будет. В последнем коде ТС ограничение Integral выполняется правильно. Только неоптимально.

Re: PID-регулятор на языке C.

Сб май 14, 2022 12:47:40

переполнение только его мантиссы. Возможно это правильнее назвать "потеря точности".

Вот о таком явлении "переполнение мантиссы" впервые слышу. Это, наверно, какая-то супер-новая плавучка (причём сделанная через ###у). В нормальной - мантисса сдвигается вправо, инкрементируется порядок - и все довольны. "Потеря точности" - да, это серьёзно... при расчёте траектории "Прогресса" для стыковки с МКС. А когда входные данные о температуре - плюс-минус лапоть... Да, получить точность в 0.01 градуса - сложняк неимоверный.
:(
Это сарказм. :(

Re: PID-регулятор на языке C.

Сб май 14, 2022 13:01:01

Но во всех источниках, которые я читал по ПИД-регуляторам (книжек там не было, да, ибо там жесткий матанализ), рекомендуют как можно чаще вызывать ПИД-алгоритм. В некоторых случаях он даже крутится в бесконечном цикле. А здесь, благодаря вам всем, я начинаю что-то подозревать, что это далеко не так. Вы можете мне ткнуть носом, какие книжки читать, либо вкратце рассказать, как выбирать этот самый дискрет? Методом тыка я понял, что 1 мс и 10 мс - слишком мало для моего случая, и незначительное изменение измеряемой величины за время dt приводит к сильному "дерганию" регулятора.
Вообще-то - это так и есть: чем чаще вызывать алгоритм - тем лучше. А дёрганья - это видимо реакция дифф.составляющей на шумы во входном сигнале (как уже писали выше).
Частота вызова ПИД-регулятора должна быть намного выше инерционности управляемой системы.
Я у себя не использую дифф.компоненту. И наблюдаю, что чем выше частота обработки ПИ-регулятора -> тем лучше работает регулирование. Правда у меня не нагреватель управляется, но тоже довольно инерционная система. И у меня ПИ-регулятор вызывается с частотой ~10кГц. :)

Re: PID-регулятор на языке C.

Сб май 14, 2022 13:56:03

чем чаще вызывать алгоритм - тем лучше.

Да прям уж :) Температуру кубового бойлера каждые 10 мс ПИД-ить? :))) Отсюда и растет безмерно интегральная составляющая. Интерг.сост. - это же сумма ошибки регулирования при каждом вызове алгоритма. Представляете, сколько там наберется, если за 20 минут, требуемые для нагрева, каждые 10 мс будет суммироваться ошибка регулирования. Поэтому, нет никакого смысла вызывать очень часто алгоритм, если инерция системы настолько высока, что дифф.составляющая будет почти нулевая, а интегр.составляющая будет овер-дофига. Время интегрирования и интервал дифференцирования - это расчетные величины, а не взятые отфанаря и как можно чаще.

И совершенно верно там tonyk пишет. Вначале надо определить свойства объекта регулирования, его инертность, отклик на регулирующее воздействие. И интервалы вызова алгоритма ПИД должны быть равномерными, поскольку параметр времени в регулировании играет далеко не последнюю роль. Прокручивание алгоритма в цикле main не будет давать постоянного интервала между вызовами. А если у вас интервалы времени будут плавать, тогда и значения дифф. и интегр. так же будут плавать, выдавая на выход ложную информацию. Как результат, система будет дергаться, и вы потратите много времени на попытки её отстроить, но результат будет случайным.

Re: PID-регулятор на языке C.

Сб май 14, 2022 14:47:44

Но во всех источниках, которые я читал по ПИД-регуляторам (книжек там не было, да, ибо там жесткий матанализ), рекомендуют как можно чаще вызывать ПИД-алгоритм. В некоторых случаях он даже крутится в бесконечном цикле. А здесь, благодаря вам всем, я начинаю что-то подозревать, что это далеко не так. Вы можете мне ткнуть носом, какие книжки читать, либо вкратце рассказать, как выбирать этот самый дискрет? Методом тыка я понял, что 1 мс и 10 мс - слишком мало для моего случая, и незначительное изменение измеряемой величины за время dt приводит к сильному "дерганию" регулятора. При значении 100 мс все гораздо лучше.


Чаще чем 1 раз в полупериод - нет смысла. Новое значение внутри полупериода никому не нужно. Это нижняя граница времени. Вместе с тем глупо запускать новый расчет если температура заведомо не успеет подняться, минимум, на один отсчет. Холодный паяльник ткнем на полную на 10с (для примера). Наблюдаем за температурой и находим на сколько в пике она поднимется (чуть позже момента выключения). Считаем на сколько единиц показания АЦП выросли и делим время включения на этот рост. Получим оценку времени включения на полную для роста на 1 значение АЦП. Чаще этого времени тоже нет смысла считать - температура не может вырасти на деление или более. Период в 3-7 таких интервалов - для начала будет неплохой оценкой периода расчета пид.

Re: PID-регулятор на языке C.

Сб май 14, 2022 15:44:52

Люди, вы чё в Инете только голых девок разглядывать умеете?

Неужели так сложно найти и прочитать статьи о настройке ПИД-регуляторов? Вы тут такую бредятину несёте, что открыв любую статью вам это сразу станет понятно. Наверно, поэтому боитесь читать что-то серьёзней журнала "Мурзилка"? Повторяю, нужно читать не учебники по ТАУ, а инженерные методики настройки по экспериментальным данным. Ничего сложного в этих методиках нет, собственно, они и созданы для быстрого получения первого приближения параметров регулятора, а именно частоты вычисления и коэффициентов. Не смотря на то, что в основе этих методов лежит серьёзная математическая база, для практических применений хватает арифметики 2 класса общеобразовательной школы. И графическая часть обработки результатов эксперимента не сложнее, чем написать на заборе слово "мир" с тремя ошибками.

Re: PID-регулятор на языке C.

Сб май 14, 2022 21:42:05

Lum1noFor, А для вас сильно принципиально написать функцию ПИД регулятора самостоятельно?
В пакете драйверов от СТМ есть DSP библиотека, в в ней уже готовая реализация ПИД регулятора, даже три - под разные типы переменных есть для float и для фиксированной точки на 16 и на 32 бита.
Расчет уже по максимуму оптимизирован - используется рекуррентная формула. Единственное о чем нельзя забывать - это при подборе коэффициентов нельзя обнулять Ki, потому что рекуррентная формула получается через подстановку интегральной составляющей с предыдущей итерации. Если обнулить Ki рекуррентная формула будет давать непредсказуемый результат.
Ответить