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

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

Сб май 14, 2022 22:32:31

А для вас сильно принципиально написать функцию ПИД регулятора самостоятельно?


Моя задача не столько сделать готовое работающее устройство, сколько разобраться, как это все работает. Поэтому мне хотелось бы написать все самому. Именно для наглядности для меня я не убираю dt из I и D составляющих. Поэтому прошу всех присутствующих больше не указывать мне, что код неоптимален с точки зрения производительности. Если бы это была реальная задача, я бы взял какого-нибудь монстра PIC32 с FPU, а не STM32 низшего сегмента. Скажу лишь то, что за период дискрета в 10 мс я успеваю 20 раз передать данные по SPI с термопары, посчитать все float'ы от ПИД-регулятора, и вывести 35 символов на LCD. И все это вместе взятое не занимает и 5 мс, то есть запас еще 5 мс до следующего срабатывания таймера. Напомню, что МК у меня не делает больше ничего кроме перечисленного. За наводку на готовый алгоритм Вам спасибо, гляну.

Неужели так сложно найти и прочитать статьи о настройке ПИД-регуляторов?


Пример можно? В том, что читал я, нет ни слова о выборе времени дискрета. Везде говорят, что чем оно меньше, тем лучше.

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

Вс май 15, 2022 08:16:44

Однако, согласитесь, что выполнять ПИД-регулирование в 10 раз чаще чем можно выдать регулирующий импульс на тиристор - это не дело. 9 из 10 подсчетов пропадут даром.

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

Вс май 15, 2022 09:55:06

да, слишком часто - тоже плохо, нотне с математической т.з., а с инженерной:
1) нагрузка на процессор (иногда бесполезная, как в данном случае)
2) шумы и дискретизация данных - т.к. в компоненте Д, dt стоит в знаменателе, то уменьшение шага увеличивает влияние dL на выход ПИД и если величина изменений пропорционально прошедшему времени и компенсирует уменьшение dt, то ошибки измерения не зависят от прошедшего времени и при уменьшении dt зтановятся заметнее

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

Вс май 15, 2022 10:14:15

Скажем проще: слишком частое ПИД-ирование по отношению к отклику системы, когда разница соседних замеров измеряемой величины нулевая (или почти нулевая) при любых условиях, приводит к неиспользованию дифф.компоненты, а ПИД превращается в ПИ, у которого коэфф Ki нужно занизить и ввести ограничение на макс. I. При этом, из-за пониженного Ki вклад отдельных измерений весьма незначителен.

А в библиотеке CMSIS DSP действительно есть ф-ции готового ПИД, можете оттудава взять.

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

Вс май 15, 2022 11:27:49

Скажем проще: слишком частое ПИД-ирование по отношению к отклику системы, когда разница соседних замеров измеряемой величины нулевая (или почти нулевая) при любых условиях, приводит к неиспользованию дифф.компоненты, а ПИД превращается в ПИ, у которого коэфф Ki нужно занизить и ввести ограничение на макс. I. При этом, из-за пониженного Ki вклад отдельных измерений весьма незначителен.
Примерно так и есть. Ki должен быть очень малым (много меньше Kp). Потому и говорю, что дифф.компоненту можно выкинуть, функционирование упростится, станет более предсказуемым, устойчивее к случайным шумам и настройка регулятора упростится.
А "плохо с инженерной точки зрения" - легко решаемо, оптимизацией алгоритма. Которую ТС никак не хочет. Как уже показал выше - легко оптимизировать на много порядков по скорости.

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

Вс май 15, 2022 12:01:40

Есть ПИД регулятор, а есть ПИ-регулятор. У каждого свои плюсы и минусы, своё применение. Но это ещё не значит, что из ПИД получится сделать ПИ просто сократив интервалы вызова алгоритма до исчезновения дифф.составляющей.
То есть, ПИ должен делаться методом Kd = 0 и убиранию расчёта дифф., а не получением нулевой разницы между соседними выборками.

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

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

Вс май 15, 2022 14:02:02

Lum1noFor писал(а): В том, что читал я, нет ни слова о выборе времени дискрета. Везде говорят, что чем оно меньше, тем лучше.

Значит, не то читали. Период расчёта выходного воздействия зависит, например, от транспортной задержки.

Добавлено after 40 minutes 8 seconds:
Ну, если в Гугле вас всех забанили, то можете как пример почитать тут:
Вложения
30-33.PDF
(280.05 KiB) Скачиваний: 173
Последний раз редактировалось tonyk Вс май 15, 2022 15:23:08, всего редактировалось 1 раз.

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

Вс май 15, 2022 14:23:29

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

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

Вс май 15, 2022 16:28:03

Прошу помощи в настройке PID-регулятора

https://habr.com/ru/post/145991/

http://pidcontrol.narod.ru/

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

Вс май 15, 2022 17:21:44

Прошу помощи в настройке PID-регулятора

https://habr.com/ru/post/145991/

http://pidcontrol.narod.ru/


По этим ссылкам нет методик определения параметров регулятора, посему и ценность их, увы, нулевая.

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

Вс май 15, 2022 18:24:33

По этим ссылкам нет методик определения параметров регулятора, посему и ценность их, увы, нулевая.

Для кого как... :)

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

Вс май 15, 2022 19:59:37

По этим ссылкам нет методик определения параметров регулятора, посему и ценность их, увы, нулевая.

Для кого как... :)

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

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

Вт май 17, 2022 11:50:04

Всех благодарю - ответы на интересующие меня вопросы я получил. Дальше только практика.

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

Пт май 20, 2022 11:02:32

Тоже заинтересовала эта тема. Как советовали скачал библиотеку CMSIS DSP. Интересная там формула
y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]
A0 = Kp + Ki + Kd
A1 = (-Kp ) - (2 * Kd )
A2 = Kd

Я таких не видел. И как она в действии?

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

Чт июн 02, 2022 16:40:47

А попробуй раскрыть скобки и увидишь, то это всё та-же, только оптимизированная для вычисления контроллером формула ПИД регулятора...

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

Сб июн 04, 2022 15:59:02

Сколько не раскрывал скобок, так и не понял логику этих формул. Заработало только с классическим видом формул регулятора.

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

Сб июн 04, 2022 18:19:46

перепишем, вставивив все переменные:
Y:=Y+(Kp+Ki+Kd)*(X2)+(-Kp-2Kd)*(X1)+Kd*(X0);
X2 - текущее, X1 - прошлое, X0 - позапрошлое положения.
приведем переменные к одной точке:
X1=X2-V2*dt; X0=X1-V1*dt; V1=V2-A2*dt;
X0=X2-2*V2*dt+A2*dt^2;
вставим в уравнение:
dY*dt=(Kp+Ki+Kd)*(X2)+(-Kp-2Kd)*(X2-V2*dt)+Kd*(X2-2*V2*dt+A2*dt^2);
чтоб проще было считать — упростим, примем:
dt=1 и.е.
dY*dt=Vy; скорость изменения выхода
X2=X; текущее отклонение
V2*dt=V; текущая скорость изменения отклонения
A2*dt^2=A; текущая скорость изменения скорости (ускорение) отклонения
тогда:
Vy=(Kp+Ki+Kd)*(X)+(-Kp-2Kd)*(X-V)+Kd*(X-2*V+A);
Vy=KpX+KiX+KdX -KpX-2KdX+KpV+2KdV +KdX-2KdV+KdA;
Vy=Ki*X+Kp*V+Kd*A; вуаля! ;)
если всё это проинтегрировать:
Y=Ki*I+Kp*X+Kd*V; где I — первообразная от X
П.С.знаю, что с т.з. строгой математики тут не совсем всё точно (но в данном контексте оно не сильно испортило бы картину)

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

Вс июн 05, 2022 07:16:59

Ivanoff-iv, Большое спасибо за разъяснения. Стало намного понятнее. Однако, в этих формулах жёстко закреплены постоянные времени интегрирования и дифференцирования. И они напрямую связаны с периодом работы самого ПИД регулятора. Мне для настройки было понятнее задавать постоянные интегрирования и дифференцирования независимо от периода работы ПИД регулятора. Также приходилось периодически обнулять И составляющую для уменьшения колебательного процесса.
Но я всё равно благодарен вам за точные разъяснения, сам не додумался бы до такого.
ЗЫ. Так это ПИД по скорости регулирования! Я то разбирался с ним, как с ПИД по смещению :(

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

Вс июн 05, 2022 07:27:21

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

Добавлено after 8 minutes 4 seconds:
я И не обнуляю, а только ограничиваю...
раньше ограничивал константой, теперь придумал новый, более гибкий способ (который я тут, на 1 странице предложил) только его надо немного допилить - ввести граничные условия, чтобы П+Д компонентами И в минуса не угнало...
Ответить