Курилка – ПИД-управление – или танцы с бубном

Схематические решения и решение проблем по обвязке микроконтроллера. Схемотехника программаторов.

Re: Курилка – ПИД-управление – или танцы с бубном

Сообщение masivnik (Иван Николаевич) » 22 ноя 2016, 17:34

Начало на предыдущей странице

2. Пропорционально-Дифференциальное управление
Продолжим наши рассуждения относительно качества регулятора. Очевидно, что П-регулятор не может удовлетворить все наши потребности. Представим себе ситуацию, в которой ошибка управления начинает резко возрастать. Например, мы въезжаем на участок трассы с резкими поворотами. В такой ситуации надо реагировать как-то иначе. Более извилистый участок означает, что "крутить руль" надо более интенсивно. Более того, здесь уже не до точности управления – здесь важнее как можно быстрее отреагировать на поворот и не сойти с трассы (не потерять ее). Это означает, что надо уметь реагировать не только на ошибку управления, но и на скорость ее изменения.
Нам очень важно знать не только настоящее (текущую ошибку), но и будущую ошибку (знание о скорости изменения ошибки и даст нам эту информацию). Если мы знаем, что ошибка увеличивается (это и есть скорость изменения ошибки), то надо увеличивать управляющее воздействие.
Элементом, способным измерить эту скорость, является т.н. дифференциатор.
Дифференциатор – это достаточно простой в реализации элемент. Его задача – умножить разность между текущим значением выходного сигнала и значением выхода в предыдущий момент времени на какой-то постоянный коэффициент:
ud(t) = kd*(y(t) - y(t-1)), где
ud(t) – значение управляющего сигнала,
kd – постоянный коэффициент,
y(t) – текущее значение выходного сигнала (в момент времени t),
y(t-1) – предыдущее значение выходного сигнала (в момент времени t-1)
y(t) и y(t-1) можно заменить соответственно на e(t) и e(t-1), т.е. на текущее и предыдущее значения сигналов ошибки.
Работает эта компонента (Д-компонента) достаточно очевидно. Если на выходе у нас постоянный сигнал (y(t)=y(t-1)), то значение ud(t) равно нулю и никакого изменения не происходит. Если же что-то начинает меняться (y(t)≠y(t-1)), то соответственно начинает изменяться величина дифференциальной компоненты. Причем, чем больше разнятся между собой значения выходного сигнала, тем больше будет вклад этой компоненты.
Отсюда, кстати, следует вывод о том, что использование одной лишь Д-компоненты в регуляторе совершенно неприемлемо. Если ошибка управления постоянна (всегда y(t)=y(t-1)), то эта компонента никак не прореагирует на это. Поэтому Д-компонента работает в паре с пропорциональной компонентой.
И тогда мы получаем следующую схему регулятора, который называется пропорционально-дифференциальным (ПД-регулятором):
11.png
Здесь сигнал ошибки поступает как на пропорциональное звено (усилитель), так и на дифференцирующее звено (дифференциатор). Далее выходные сигналы этих компонент складываются, формируя управляющее воздействие upd(t). Таким образом, работа ПД-регулятора описывается следующим соотношением:
upd(t) = up(t) + ud(t) = kp*e(t) + kd*(e(t) - e(t-1)).
Пропорционально-дифференциальный закон управления уже более интересен, нежели просто пропорциональное управление. Но есть у него и свои серьезные особенности.
Достоинства: Этот закон управления имеет наивысшее быстродействие. ПД-регулятор реагирует не только на величину отклонения e(t), но, что наиболее важно, на скорость ее изменения.
Недостатки: малая точность и чувствительность к шумам. Как водится, с достоинствами все гораздо проще, чем с недостатками. О недостатках надо поговорить подробнее. Дело в том, что дифференциальная компонента управления является самой проблемной и капризной из всех типов управления. И связано это как раз с тем, что Д-компонента очень чувствительна к скорости изменения ошибки, ведь, как ни странно, не на каждую ошибку надо реагировать.
a. Проблема шумов: Дело в том, что все шумит. Шумят датчики, выдавая не всегда то, что необходимо. Шумит трасса (линия нарисована не всегда четко, имеются всякие неоднородности), шумят исполнительные схемы и механизмы. Д-компонента реагирует на все эти шумы, заставляя систему совершать ненужные действия, реагировать на то, на что реагировать вовсе не обязательно. Особенно остро эта проблема касается высокочастотных шумов. Перечисленные выше шумы относятся как раз к категории высокочастотных – они возникают на короткое время, но могут иметь большое значение. А Д-регулятор упорно будет на них реагировать. В то же время изгибы трассы относятся к низкочастотным помехам (по сравнению со скоростью процессов в системе управления), и регулятору надо бы реагировать именно на них. Выходом является установка низкочастотного фильтра на входе Д-компоненты (этот фильтр будет отсекать высокочастотные помехи).
b. Чувствительность к частоте сбора информации. Поскольку в ПД-законе фигурирует сигнал "в предыдущий момент времени" (y(t-1)), то очень важно, чтобы интервал времени сбора информации выдерживался как можно более строго. Если время "будет плавать", то ни о какой адекватности реакции системы речи быть не может. Считается, что временные интервалы должны выдерживаться с точностью не менее 1%. Это само по себе не так просто. При программной реализации выходом может является использование прерываний. Именно в обработчике прерываний должна содержаться короткая (и быстрая) процедура сбора информации от датчиков.
Таким образом, главная проблема ПД-регулятора заключается в том, что он усиливает шумы. И если от сильных шумов в системе не удается избавиться, то Д-компоненту, пожалуй, лучше вовсе не использовать.

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

Функция для контроллера, реализующего ПД-управление, может выглядеть так:
/* замена для ПД -управления */
#define Kp 20 // коэффициент пропорционального усиления
#define Kd 3 // коэффициент дифференциального усиления
/* определяем переменные для П-управления */
volatile int16_t Treb_znah; // требуемое значение (xз(t))
volatile int16_t Rez_izmer; // результат измерения – выходной сигнал (y(t))
volatile int16_t Error; // текущее значение сигнала ошибки (e(t))
volatile int16_t Pred_Error; // предыдущее значение сигнала ошибки (e(t-1))
/* функция для ПД-управления */
int16_t OUT_PD_upr(void) // функция возвращает значение управляющего сигнала upd(t)
{
int16_t P, D; // локальные переменные
Error = Treb_znah - Rez_izmer; // сумматор – сигнал ошибки e(t)=xз(t)-y(t)
/* Пропорциональная компонента */
P = Kp * Error; // up(t) = kp * e(t)
/* Дифференциальная компонента */
D = Kd * (Error - Pred_Error); // ud(t) = kd * (e(t) - e(t-1))
Pred_Error = Error; // e(t-1) = e(1) – предыдущее равно текущему
return P + D; // возвращаем функции значение сигнала ошибки upd(t) = up(t) + ud(t)
}

3. Пропорционально-Интегральное управление
Итак, основная проблема, рассмотренного выше, ПД-регулятора заключается в чувствительности к шумам. Можно ли сделать так, чтобы шумы сглаживались и при этом точность регулирования, в установившемся режиме, была максимальна? Видимо, да. Для этого можно использовать т.н. интегрирующее звено (или просто интегратор).
Интегратор занимается тем, что складывает (накапливает, суммирует, интегрирует) сигнал ошибки e(t). Управляющий сигнал u(t) в каждый момент времени пропорционален интегралу ошибки e(t). Из этого можно сделать вывод о том, что И-регулятор реагирует на длительные отклонения управляемой величины, а кратковременные отклонения им сглаживаются.
Действительно, если считать, что интеграл – это площадь фигуры, определяемой некоторой функцией (в нашем случае мы интегрируем ошибку – функцией e(t)), то площади фигур «а» и «б», на указанном ниже рисунке, примерно одинаковы.
12.png
На данном рисунке интегралы от функции ошибки примерно равны:
а) функция ошибки без высокочастотных помех;
б) функция ошибки с высокочастотными помехами.
Итак, интегральный закон управления (И-регулятор) выглядит следующим образом:
ui(t) = ki * ∫e(t)dt ≈ ki * ∑e(t)∆t,
т.е. управляющий сигнал ui(t) складывает (накапливает, суммирует) сигнал ошибки e(t).
Однако интеграция ошибок – это процесс опасный. Ошибки имеются всегда, и простое их накопление приводит к снижению стабильности системы или вообще делает систему нестабильной. А это значит, что чистое И-регулирование приведет к тому, что колебания системы будут становиться все больше и больше, пока система не пойдет вразнос.
Именно поэтому интегратор используется вместе с пропорциональным звеном. В этом случае мы получаем пропорционально-интегральный закон управления (ПИ-регулятор):
upi(t) = up(t) + ui(t) = kp * e(t) + ki * ∫e(t)dt ≈ kp * e(t) + ki * ∑e(t)∆t
13.png
Итак, интегральное управление используется, чтобы добавить "долгосрочной точности" управлению и практически всегда используется совместно с пропорциональным управлением. Параллельное соединение двух звеньев позволяет использовать достоинства П- и И- регуляторов.
Кстати, ПИ-регуляторы имеют наибольшее распространение в промышленной автоматике.
Преимущества: лучшая по сравнению с П-регулятором точность в установившемся режиме, а при определенном соотношении коэффициентов kп и kи ПИ-регулятор обеспечивает хорошие показатели и в переходных режимах.
Недостатки: худшие свойства в переходных режимах (меньшее быстродействие и большая колебательность).
Для того, чтобы система не шла вразнос из-за постоянного накопления ошибок, работу интегратора обычно ограничивают, т.е. определяют минимальное и максимальное значения накопленного сигнала. Это обычно позволяет предотвратить т.н. "вылет системы" - неограниченный рост управляющего воздействия.

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

Функция для контроллера, реализующего ПИ-управление:
/* замена для ПИ-управления */
#define Kp 10 // коэффициент пропорционального усиления
#define Ki 0.02 // коэффициент интегрального усиления
#define iMin -2 // минимальное значение интегратора
#define iMax 2 // максимальное значение интегратора
/* определяем переменные для П-управления */
volatile int16_t Treb_znah; // требуемое значение (xз(t))
volatile int16_t Rez_izmer; // результат измерения – выходной сигнал (y(t))
volatile int16_t Error; // текущее значение сигнала ошибки (e(t))
volatile int16_t Summa_Error; // сумма ошибок (∫e(t)dt ≈ ∑e(t)∆t)
/* функция для ПД-управления */
int16_t OUT_PI_upr(void) // функция возвращает значение управляющего сигнала upi(t)
{
int16_t P, I; // локальные переменные
Error = Treb_znah - Rez_izmer; // сумматор – сигнал ошибки e(t)=xз(t)-y(t)
/* Пропорциональная компонента */
P = Kp * Error; // up(t) = kp * e(t)
/* Интегральная компонента */
Summa_Error = Summa_Error + Error; // накапливаем (суммируем) = ∫e(t)dt ≈ ∑e(t)∆t
if(Summa_Error < iMin) Summa_Error = iMin; // проверяем граничные значение
if(Summa_Error > iMax) Summa_Error = iMax;
I = ki * Summa_Error; // ui(t) = ki * ∫e(t)dt ≈ ki * ∑e(t)∆t
return P + I; // возвращаем функции значение сигнала ошибки upi(t) = up(t) + ui(t)
}
Переменная Summa_Error – это наш интегратор, который хранит сумму всех предыдущих ошибок. Величины iMin и iMax - это минимальное и максимальное разрешенные значения состояния интегратора. Они-то и ограничивают интегральное воздействие.

4. Пропорционально-Интегрально-Дифференциальное управление
Осталось собрать все воедино, и мы получим, наконец, наиболее гибкий закон управления – пропорционально-интегрально-дифференциальный. Варьирование его параметров позволяет реализовывать все остальные законы. Он объединяет, естественно, все достоинства и недостатки законов, его составляющих.

Каждый из элементов регулятора (пропорциональное, интегральное и дифференциальное звенья) выполняет свою задачу и оказывает свое специфическое воздействие на функционирование системы: пропорциональный закон отвечает за настоящее (реагирует на текущую ошибку), дифференциальный – за будущее (реагирует на тенденцию изменения ошибки), а интегральный – за прошлое (накапливая предыдущие ошибки и сглаживая высокочастотные шумы).
14.png
Выходы этих элементов складываются между собой и формируют управляющий сигнал для устройства - upid(t) = up(t) + ui(t) + ud(t).

Закон ПИД-управления выглядит как сумма входящих в состав ПИД-регулятора управляющих компонент:
upid(t) = up(t) + ui(t) + ud(t) = kp * e(t) + ki * ∫e(t)dt + kd*(e(t) - e(t-1))

ПИД-регулятор – это старое изобретение. Он был создан еще в 1910 году, однако значительно позже, лишь в 1942 г. была разработана методика его настройки (Зиглер и Никольс).

Функция для контроллера, реализующего ПИД-управление:
Функция, реализующая ПИД-управление, представляет собой простую композицию всех рассмотренных выше компонент.
/* замена для ПИД-управления */
#define Kp 5 // коэффициент пропорционального усиления
#define Ki 0.003 // коэффициент интегрального усиления
#define iMin -1 // минимальное значение интегратора
#define iMax 1 // максимальное значение интегратора
#define Kd 2 // коэффициент дифференциального усиления
/* определяем переменные для П-управления */
volatile int16_t Treb_znah; // требуемое значение (xз(t))
volatile int16_t Rez_izmer; // результат измерения – выходной сигнал (y(t))
volatile int16_t Error; // текущее значение сигнала ошибки (e(t))
volatile int16_t Summa_Error; // сумма ошибок (∫e(t)dt ≈ ∑e(t)∆t)
volatile int16_t Pred_Error; // предыдущее значение сигнала ошибки (e(t-1))
/* функция для ПД-управления */
int16_t OUT_PID_upr(void) // функция возвращает значение управляющего сигнала upid(t)
{
int16_t P, I, D; // локальные переменные
Error = Treb_znah - Rez_izmer; // сумматор – сигнал ошибки e(t)=xз(t)-y(t)
/* Пропорциональная компонента */
P = Kp * Error; // up(t) = kp * e(t)
/* Интегральная компонента */
Summa_Error = Summa_Error + Error; // накапливаем (суммируем) = ∫e(t)dt ≈ ∑e(t)∆t
if(Summa_Error < iMin) Summa_Error = iMin; // Проверяем граничные значения
if(Summa_Error > iMax) Summa_Error = iMax;
I = ki * Summa_Error; // ui(t) = ki * ∫e(t)dt ≈ ki * ∑e(t)∆t
/* Дифференциальная компонента */
D = Kd * (Error - Pred_Error); // ud(t) = kd * (e(t) - e(t-1))
Pred_Error = Error; // e(t-1) = e(1) – предыдущее равно текущему
return P + I + D; // возвращаем функции значение ошибки upid(t) = up(t) + ui(t) + ud(t)
}
Функция ПИД-регулятора действительно очень проста. Основной же проблемой при реализации ПИД-управления является настройка его параметров.

Думаю, теперь более чем понятно, что такое ПИД-управление/регулирование и соответственно можно смело приступать к изучению дальнейшего материала…
С уважением – Иван Николаевич (masivnik).
У вас нет доступа для просмотра вложений в этом сообщении.
Аватар пользователя
Ник: masivnik
Имя: Иван Николаевич
(Междуреченск)
Суперконсульт
Суперконсульт
Информация о пользователе

Re: Курилка – ПИД-управление – или танцы с бубном

Сообщение Enigm (Enigm) » 10 дек 2016, 01:29

Функция ПИД-регулятора действительно очень проста. Основной же проблемой при реализации ПИД-управления является настройка его параметров.


Вот читаю читаю , и вроде даже как понимание какое то приходит, но стоит взяться и попробовать переложить все это на программу в фловкоде, и все полный затык, что до настройки и не доходит )))
Есть какой нить пример в фловкоде подходящий например для сервопривода ?
Матриксовский пример вкурить так и не смог :cry:
Вот курю пример МИМ , думаю как его изменить под сервопривод, прогресса пока нету :cry:
Аватар пользователя
Ник: Enigm
Имя: Enigm
(Сочи)
Суперконсульт
Суперконсульт
Информация о пользователе

Re: Курилка – ПИД-управление – или танцы с бубном

Сообщение masivnik (Иван Николаевич) » 15 дек 2016, 19:59

Enigm писал(а):Вот читаю читаю , и вроде даже как понимание какое то приходит, но стоит взяться и попробовать переложить все это на программу в фловкоде, и все полный затык, что до настройки и не доходит )))
Есть какой нить пример в фловкоде подходящий например для сервопривода ?
Выложенного материала - в принципе, для начального понимания, вполне достаточно. Но только для начала... Вопрос микропрограммного управления - гораздо и очень гораздо шире и разнообразнее, соответственно и подходов реализации, ПИД-управления, множество...
У меня, пока, не хватает время дальше подготовить и выложить следующий материал-продолжение...
Что касается реализации в FC и не только, то это не проблема - все реализуемо, только зависит от задачи и желательно начать понимать сам СИ...
Enigm писал(а):Вот курю пример МИМ
Все примеры сводятся к одному - нужно хорошо понять теорию - иначе "танцы с бубном" и обсолютно неизвестный и не понятый результат...
Что касается примера, то я конечно мог бы выложить уже готовый вариант ПИД-управления запущенного мотора боговой дорожки, но:
1. Пример полностью написан на СИ и нет ни какого желания переносить его в FC...
2. Думаю, что рано выкладывать свой пример, т.к. прежде чем переходить к нему - нужно много что обсудить, разжевать, выложить... Уж очень много нюансов и соответственно различных подходов в решении поставленной задачи... Тут уж точно не обойтись без множества расчетов, формул... - хотя все это уже давно придумано до нас...
Enigm писал(а):Матриксовский пример вкурить так и не смог
Так называемые "Матриксы" ничего сами не придумывали - все уже придумано до них... Они, уже готовое, вносят в "свою" оболочку - очень удобную и наглядную для начального понимания...
Что касается "Матриксовский пример", то недавно переписывался с одним очень хорошим человеком и как раз ему отправлял пример - откуда у "Матриксов" появилась данная формула... Вот пример для размышлений:
Формулы_ПИД_для_МК.png

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

Re: Курилка – ПИД-управление – или танцы с бубном

Сообщение masivnik (Иван Николаевич) » 01 янв 2017, 18:48

Теперь хотелось бы поговорить про настройку ПИД-управления/регулирования.

Но прежде чем переходить к данному разделу, хотелось бы немного остановиться на одном моменте – насыщение или перерегулирование:

В любой системе существует некоторые максимальные и минимальные значения, за приделы которых она не должна выходить. К примеру, если поместит большой холодный металлический блок, в систему с нагревателем, система может решить, что для установления необходимой температуры потребуется чрезмерно высокая сила тока. Данная величина силы тока может оказаться за пределами возможностей источника питания и нагревателя. Либо, слишком мощный источник может в таком случае вывести нагреватель из строя.
Таким образом, система должна точно знать максимальные и минимальные значения за приделы которых она не должна выходить - насыщение или перерегулирование, т.е. она должна ограничивать сигнал управления, выходящий за данные приделы.
Проблема, связанная с насыщением, заложена в интегральном слагаемом. Если нагреватель будет работать на 100% мощности, интегральная погрешность будет расти со временем. Как следствие, интегральная погрешность может оказаться слишком большой и система не сможет среагировать так быстро, если бы она находилась не в насыщении. А это значит, что при достижении системой требуемой величины интегральное слагаемое будет продолжать заставлять работать систему в том же направлении.
Для того чтобы избежать насыщения или перерегулирования, программное обеспечение должно ограничивать интегральное слагаемое при обнаружении насыщения выходного сигнала или сигнала с датчика. К тому же реальное ПО в отличие от математической модели, работает с регистрами конечных размеров. Следует предусмотреть, чтобы ограниченный размер регистров не привел к сбою системы.
Иногда вычисление интеграла запрещается, если величина погрешности отличается на доли процента от искомой величины. Это позволяет избежать больших интегральных оценок, когда устанавливаемая величина находится вблизи требуемой.
01.png

В прошлых рассматриваемых примерах ПИ и ПИД управления/регулирования, если вы обратили внимание, применялись максимальное и минимальное значение интеграла: iMin, iMax и проверка граничных значений. Это и есть, один из вариантов, применения ограничения интегральной составляющей.

Ниже привожу пример кода, где, помимо уже применяемого ранее ограничения интегральной составляющей, применяется еще и ограничение значения выходного результата в большую и меньшую стороны, таким образом, в ПО, предусматривается защита выхода переменной (регистра) за конечный размер:
Код: выделить все
/* замена для ПИД-управления */
#define      Kp      1   // коэффициент пропорционального усиления
#define      Ki      0.7   // коэффициент интегрального усиления
#define      iMin      -10     // минимальное значение интегратора
#define      iMax      10      // максимальное значение интегратора
#define      Kd      0.4   // коэффициент  дифференциального усиления
#define      pidMin   0     // минимальное значение управляющего сигнала
#define      pidMax   120     // максимальное значение управляющего сигнала

/* определяем переменные для П-управления */
volatile  int8_t    Treb_znah;   // требуемое значение (xз(t))
volatile  int8_t    Rez_izmer;   // результат измерения – выходной сигнал (y(t)) 
volatile  int8_t    Error;      // текущее значение сигнала ошибки (e(t))
volatile  int8_t    Summa_Error;   // сумма ошибок  (∫e(t)dt ≈ ∑e(t)∆t)
volatile  int8_t    Pred_Error;   // предыдущее значение сигнала ошибки (e(t-1))

/* функция  для ПИД-управления */
int 8_t OUT_PID_upr(void) // функция возвращает значение управляющего сигнала upid(t)
   {
   int8_t  P, I, D;   // локальные переменные
   int16_t  PID;   // локальная переменная
   Error = Treb_znah - Rez_izmer;   // сумматор – сигнал ошибки e(t)=xз(t)-y(t)
   /* Пропорциональная компонента */
   P = Kp * Error;    // up(t) = kp * e(t)
   /* Интегральная компонента */
   Summa_Error = Summa_Error + Error; // накапливаем (суммируем) = ∫e(t)dt ≈ ∑e(t)∆t
   
   // Проверка выхода интегральной составляющей за граничные значения - насыщение
   if(Summa_Error  < iMin) {Summa_Error = iMin;}  // Проверяем граничные значения
   if(Summa_Error  > iMax) {Summa_Error = iMax;}
   
   I = ki * Summa_Error;    // ui(t) = ki * ∫e(t)dt ≈ ki * ∑e(t)∆t
   /* Дифференциальная компонента */
   D = Kd * (Error - Pred_Error);    // ud(t) = kd * (e(t) - e(t-1))
   Pred_Error = Error;    // e(t-1) = e(1) – предыдущее равно текущему
   PID = P + I + D;
   
   // Проверка выхода выходного результата за приделы граничных значений
   if(PID > pidMax) {PID = pidMax;} // если больше максимального значения
   else if(PID < pidMin) {PID = pidMin;} // если меньше максимального значения
   
   return PID;   // возвращаем функции значение ошибки upid(t) = up(t) + ui(t) + ud(t)
   }
Функция для ПИД-управления.png
Выкладывать код с запрещением вычисления интеграла – не буду, т.к. если немного поразмыслить, то, Вы, сами его напишите… Ничего сложного – нет…

Настройка ПИД-регулятора

Общие соображения
Настройка параметров ПИД-регулятора (коэффициентов kp, ki и kd) – это самый сложный процесс. Эта настройка зависит от состава нашей системы, характеристик ее составных частей, от решаемой задачи. Даже одна и та же тележка должна иметь свои настройки для каждой трассы. Для извилистых трасс с резкими поворотами должна активно работать дифференциальная компонента (большой коэффициент kd), для трасс с плавными поворотами и прямыми участками важнее интегральная компонента.

Рассмотрим, как должна выглядеть настройка коэффициентов.
1. Настройка теоретическая (как решает эту задачу математик). Для настройки необходимо нарисовать структурную схему системы. При этом необходимо знать все характеристики всех входящих в систему компонент (для сведущих: надо знать передаточные функции всех звеньев). Далее вычисляется то, что называется передаточной функцией системы. По этой передаточной функции можно определить качество переходных процессов, точность и т.п. Т.е. рассчитать коэффициенты регулятора так, чтобы наша задача решалась оптимальным образом.
Это – идеальная ситуация. На практике все выглядит гораздо хуже. Основная проблема в том, мы вряд ли сможем получить адекватную математическую модель системы, вряд ли мы учтем все нелинейности, случайности и т.п. А если учитывать и описывать все по максимуму, то мы просто погрязнем в математических расчетах.
2. Настройка инженерная (как должна решаться задача грамотным специалистом). Необходимо создать отладочный стенд, состоящий из тестового оборудования, системы его связи с компьютером, осциллографом и прочими полезными измерительными приборами. Далее следует подавать на вход системы ступенчатое воздействие (ту самую единичную функцию, которую мы как-то упоминали выше) и анализировать отклик системы. Этот отклик, называемый переходной функцией, и будет анализироваться, по нему и будут подбираться коэффициенты регулятора.
Этот путь пригоден для грамотных инженеров, обладающих и познаниями в ТАР, и временем, и оборудованием.
3. Настройка реальная (как это обычно делается). На практике (если только мы имеем дело не со специалистом в теории управления, которому все то, что здесь написано читать вовсе не нужно) все выглядит гораздо примитивнее. Коэффициенты будут определяться сугубо экспериментальным путем, используя натурные испытания. Просто-напросто, тележка будет ставиться на линию, а мы будем смотреть, как она едет. И изменять значения коэффициентов до тех пор, пока она не поедет как надо (или мы поймем, что на этой кривой трассе это убогое оборудование лучше уже не поедет).

Настройка компонент
1. Настройка пропорциональной компоненты
Обнулим коэффициенты ki и kd. Они нас пока не интересуют. Будем разбираться с kp, варьируя его значение, скажем, от 1 до 100. Установим сначала значение kp, равное 1. Если система очень медленно выходит на линию, то kp надо увеличивать. Если же начинаются колебания, то kp надо уменьшать.
При этом некоторые рекомендуют следующую методику изменения значений коэффициента. Установим сначала маленькое значение kp. Допустим, колебаний еще нет. Далее увеличиваем это значение в 10 раз, пока не начнутся колебания. Теперь уменьшаем значение коэффициента kp, но не в 10 раз, а в 2 раза. И так до тех пор, пока колебания не прекратятся. И так далее. Т.е. мы ищем искомое начение, сначала используя большие шаги, а затем все меньшие.
2. Настройка интегральной компоненты
Значение коэффициента интегральной компоненты ki должно быть мало по сравнению c kp. В качестве начального значения коэффициента ki рекомендуется брать число от 0.0001 до 0.01. Процедура поиска (подбора) коэффициента ki точно такая же, как и коэффициента пропорциональной составляющей (сначала большие шаги, а затем маленькие). Слишком большое значение коэффициента ki также проявляется в появлении колебаний.
3. Настройка дифференциальной компоненты
Если мы уверены, что шумы в нашей системе на слишком велики, то можно ввести и дифференциальную компоненту. Для настройки kd установим сначала значение этого коэффициента, равное 0. Далее установим какое-нибудь небольшое значение коэффициента пропорционального звена kp (например, kp =1). Главное, что значение kp должно быть таким, чтобы система при нулевом значении kd не совершала колебаний. Далее установим какое-нибудь небольшое начальное значение коэффициента kd (например, kd =0.1). Будем увеличивать коэффициент kd до тех пор, пока не станут проявляться ошибочные колебания, вызванные малыми шумами. При этом колебания от слишком большого коэффициента происходят значительно быстрее, чем колебания от недостаточного коэффициента. Рекомендуется устанавливать коэффициент в половину или четверть от того, при котором начинаются колебания от слишком большой его величины. Главное в этом процессе – вовремя убедиться в том, что поведение системы является адекватным (машина ведет себя на трассе хорошо).

Замечания
Описанные процедуры настройки коэффициентов содержат много субъективизма. Главным критерием того, что мы нашли подходящие коэффициенты (не оптимальные, конечно), является внешнее поведение тележки. Но помимо таких сугубо экспериментальных подстроек, имеются и вполне объективные принципы, которые надо соблюдать при создании регулятора.
1. Скорость работы программы. Управляющая программа должна работать максимально быстро. Это означает, что необходимо использовать максимально лаконичные алгоритмы и простые операции.
2. Равномерность работы программы. Не менее важно то, чтобы формирование управляющего воздействия происходило в как можно более равномерные моменты времени. Нельзя допускать, чтобы программа "задумалась" на непредсказуемое время, т.к. в этом случае сбой дадут и интегральное, и дифференциальное звено. Для этого, повторим, можно использовать прерывания, которые гарантированно обеспечат нам равномерный сбор информации от датчиков.
3. Частота сбора данных и выполнения цикла управления. Помимо стабильности частоты сбора, необходимо определиться с тем, какова должна быть частота управления. Дело в том, что если частота управления слишком маленькая, то мы не получим эффективную систему. Более того, при малой частоте управления мы можем получить систему, которую вообще невозможно стабилизировать. Но и при слишком большой частоте мы тоже получим плохой результат: начнут возникать серьезные шумы в дифференциальной компоненте, а также начнет переполняться интегратор. Для определения частоты управления существует следующее правило: продолжительность итерации управляющего цикла должна быть между 1/10 и 1/100 желаемого времени стабилизации системы. Например, если мы хотим, чтобы система стабилизировалась за 0.1 с. (за 0.1 секунды тележка должна устойчиво выйти на центр трассы), то частота управления должна быть от 100 до 1000 Гц (время итерации от 0.01 до 0.001 сек.).

Очень часто, в различных источниках, при настройке параметров ПИД-регулятора, упоминается метод Зиглера и Никольса. Но не всегда понятно как именно пользоваться этим методом. Хотя, если брать во внимание мои практические реализации ПИД-управления, то настройка параметров по данному методу – всегда приводила к отрицательному результату, даже более того – к довольно негативному… Думаю не стоит вдаваться – почему именно получается отрицательный результат, кому нужно – сами найдут и поймут все причины. Изучая источники методики настройки по данному методу, нашел несколько вариантов и какой именно правильный - решайте сами:

Первый вариант – источник «Аналоговые интерфейсы микроконтроллеров» Р. Стюарт Болл:
1. Отключаем цепи интегрирующего и дифференцирующего сигналов, что превращает систему управления в систему с пропорциональным регулированием.
2. Увеличиваем усиление до тех пор, пока на выходе не установятся незначительные, либо затухающие колебания. Назовем такой уровень усиления К.
3. Измеряем период колебаний Р.
4. Устанавливаем коэффициент пропорционального усиления (G), а также коэффициенты усиления сигналов интеграла и производной (Ti, Td) в соответствии со следующими соотношениями:
• Если система управления только пропорциональная, то gain(G) = 0.5К.
• Если система пропорционально-интегрирующая, то G = 0.45K, Ti = 1.2/Р.
• Если мы создаем систему ПИД-управления, то G = 0.6K, Ti = 2/Р, Td = Р/8.
Результат данных вычислений, конечно, потребует дополнительной коррекции для оптимизации работы. В результате могут быть получены такие величины интеграла и производной (дифференциальной), которые неосуществимы при заданной частоте дискретизации. В этом случае, коэффициенты должны быть подобраны экспериментально.

Второй вариант – источник «ПИД-регуляторы: вопросы реализации» Виктор Денисенко:
Зиглер и Никольс предложили два метода настройки ПИД-регуляторов. Один из них основан на параметрах отклика объекта на единичный скачок, второй – на частотных характеристиках объекта управления.
Для расчёта параметров ПИД-регулятора по первому методу Зиглера-Никольса используются всего два параметра: a и L (смотреть рисунок ниже):
02.png

Формулы для расчёта коэффициентов ПИД-регулятора по первому методу сведены в таблице:
03.png

Второй метод Зиглера-Никольса (частотный метод) в качестве исходных данных для расчёта использует частоту ω180, на которой сдвиг фаз в разомкнутом контуре достигает 180°, и модуль коэффициента петлевого усиления на этой частоте K180. Зная параметр ω180, сначала находят период собственных колебаний системы, а затем, по таблице представленной ниже, определяют параметры регулятора:
04.png

Точность настройки регулятора и недостатки обоих методов Зиглера-Никольса одинаковы.
Метод Зиглера-Никольса даёт параметры, далёкие от оптимальных. Это объясняется не только упрощённостью самого метода (он использует только 2 параметра для описания объекта), но и тем, что параметры регулятора в этом методе определялись Зиглером и Никольсом, исходя из требования к декременту затухания, равному 4, что и даёт медленное затухание процесса колебаний.
Метод Зиглера-Никольса никак не учитывает требования к запасу устойчивости системы, что является вторым его недостатком. Судя по медленному затуханию переходного процесса в системе, этот метод даёт слишком малый запас устойчивости.

По поводу настройки – пока хватит…, «танцы с бубном» - в любом случае…
Обновил архив - добавил ПДФ с данным материалом.
С Новым 2017 годом!!!
У вас нет доступа для просмотра вложений в этом сообщении.
Аватар пользователя
Ник: masivnik
Имя: Иван Николаевич
(Междуреченск)
Суперконсульт
Суперконсульт
Информация о пользователе
Вернуться наверх

Re: Курилка – ПИД-управление – или танцы с бубном

Сообщение роман (роман) » 12 фев 2017, 21:23

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

Re: Курилка – ПИД-управление – или танцы с бубном

Сообщение masivnik (Иван Николаевич) » 21 фев 2017, 17:17

роман писал(а):Во расписали.
Это еще не все - только начало...
роман писал(а):В старые добрые времена когда не знали такого слова как ПИД и СПИД делалось всё проще, тогда ценилась простота и гениальность.
Старые, не старые - в этом плане ничего не поменялось... Все и так просто - гениально... - ПИД и СПИД это на панацея и не нужно на них зацикливаться, они не всегда актуальны - особенно если нужна регулировка и при этом много влияющих факторов, тогда нужен совсем другой подход... Но при реализации управления, регулирования - часто сталкиваешься с тем, что не можешь толком понять как подойти к правильному выбору... И зачастую многие зная, что есть так называемое ПИД-управление/регулирование - не знают где найти простую и понятную документацию по его применению и что это такое...
роман писал(а):Из личного опыта настройки подобных систем.
Допустим есть 20 тонная машина которая с пульта должна резко принять другую позицию.
Схему не рисую, так как всё было тогда на лампах. ...
Думаю, что тот же алгоритм работы прописать на контроллере не составит труда.
А ты попробуй - один процессор, в котором есть все, что было в старые времена и на лампах..., да так, чтобы все происходило автоматически - независимо от нагрузки/веса... и с минимальным человеческим фактором... Я помню - размер, вес, потребляемые мощности - гениально и не убиваемо... ;)
Аватар пользователя
Ник: masivnik
Имя: Иван Николаевич
(Междуреченск)
Суперконсульт
Суперконсульт
Информация о пользователе
Вернуться наверх

Пред.

Вернуться в Железо

Кто сейчас на форуме

Пользователь просматривает форум: нет зарегистрированных пользователей

cron