Статическая ошибка пид регулятора

Общие сведения

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

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

Математическое выражение ПИД-регулятора

где:

   Xp — полоса пропорциональности

   Ei = (SP-PV) = (уставка-тек) = ошибка (рассогласование)

   Тд — постоянная времени дифференцирования

   ∆Ei — разность ошибок соседних измерений (Ei — Ei-1)

   ∆tизм — время между соседними измерениями (ti — t i-1)

   Ти — постоянная времени интегрирования

— Накопленная к i-ому шагу сумма рассогласований (интегральная сумма)

   Легко заметить, что сигнал управления является суммой трех составляющих: пропорциональной (слагаемое 1), дифференциальной (слагаемое 2), и интегральной (слагаемое 3).

   Пропорциональная составляющая зависит от текущей ошибки Ei и компенсирует текущую ошибку пропорционально ее величине.

   Дифференциальная составляющая зависит от скорости изменения ошибки ∆Ei / ∆tизм и компенсирует резкие возмущения.

   Интегральная составляющая накапливает ошибку регулирования, что позволяет ПИД-регулятору поддерживать нулевую ошибку в установившемся режиме (устраняет статическую ошибку управления).

   Обычно ПИД-регулятор имеет дополнительные параметры помимо трех коэффициентов (Xp, Ти, Тд). Рассмотрим их более подробно на примере скриншота меню параметров ПИД-регулятора прибора “Параграф PL20”.

Рис. 1

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

    Источником обратной связи с объекта управления (текущая контролируемая величина) может быть любой измерительный канал прибора, поэтому необходимо выбрать желаемый измерительный канал в графе ВЛАДЕЛЕЦ.

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

    Уставка (SP) – это желаемая величина, на которую регулятор должен выйти в установившемся режиме.

    Xp – зона пропорциональности. Задается в единицах контролируемой величины (для терморегулятора в градусах). Зона пропорциональности называется так, потому что только в ней ((SP — Xp)…(SP + Xp)) пропорциональная составляющая ПИД-регулятора может формировать мощность выходного сигнала управления пропорционально ошибке. А за ее пределами мощность будет равна либо 0%, либо 100%. Таким образом, чем уже эта зона, тем быстрее отклик регулятора, но слишком высокое быстродействие может ввести систему в автоколебательный режим.

    Ти – постоянная времени интегрирования.

    Тд – постоянная времени дифференцирования.

    Текущая мощность – это информационный параметр.

    Минимальная и максимальная мощность определяют границы мощности выхода ПИД-регулятора.

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

   Последним параметром идет период ШИМ. Этот параметр один для всех ПИД-регуляторов, т.к. каналы ШИМ  синхронизированы между собой от одного таймера. ШИМ сигнал позволяет регулировать мощность посредством  регулировки скважности сигнала (регулируется ширина импульса при постоянной частоте модуляции). Разрядность ШИМ (число позиций мощности) равна 8192 дискреты (13 бит). Период ШИМ (от 1 мс до 250 сек). Этот параметр зависит от типа и коммутационных способностей силовых исполнительных ключей (м.б. реле, пускатель, твердотельное реле, симистор). Чем выше частота коммутации (чем меньше период) тем больше тепловые потери в ключах (квадратичная зависимость потерь от частоты) и больше износ механических коммутаторов, но лучше качество регулирования. Важно найти золотую середину.

Настройка пропорциональной компоненты (Xp)

   Перед настройкой зоны пропорциональности интегральная и дифференциальная компоненты отключаются, постоянная интегрирования устанавливается максимально возможной (Ти = макс), а постоянная дифференцирования минимально возможной (Тд = 0). Устанавливается безопасная величина уставки, равная (0,7…0,9)×SP, где SP – это реальная уставка настраиваемой системы. Зона пропорциональности устанавливается минимально возможной (Xp = 0).

   В этом случае регулятор выполняет функции двухпозиционного релейного регулятора с гистерезисом равным нулю. Регистрируется переходная характеристика.

Рис. 2

    Т0 — начальная температура в системе;

    ТSP — заданная температура (уставка);

    ∆T — размах колебаний температуры;

    ∆t — период колебаний температуры.

    Установить зону пропорциональности равной размаху колебаний температуры: Xp = ∆T. Это значение служит

первым приближением для зоны пропорциональности.

   Следует проанализировать переходную характеристики еще раз и при необходимости скорректировать значение зоны пропорциональности. Возможные варианты переходных характеристик показаны на рис. 3.

Рис. 3

   Переходная характеристика типа 1: Значение зоны пропорциональности очень мало, переходная характеристика далека от оптимальной. Зону пропорциональности следует значительно увеличить.

   Переходная характеристика типа 2: В переходной характеристике наблюдаются затухающие колебания (5 — 6 периодов).     Если в дальнейшем предполагается использовать и дифференциальную компоненту ПИД-регулятора, то выбранное значение зоны пропорциональности является оптимальным. Для этого случая настройка зоны пропорциональности считается законченной.

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

   Переходная характеристика типа 3: В переходной характеристике наблюдаются небольшой выброс (перерегулирование) и быстро затухающие колебания (1 — 2 периода). Этот тип переходной характеристики обеспечивает хорошее быстродействие и быстрый выход на заданную температуру. В большинстве случаев его можно считать оптимальным, если в системе допускаются выбросы (перегревы) при переходе с одной температуры на другую.

   Выбросы устраняются дополнительным увеличением зоны пропорциональности так, чтобы получилась переходная  характеристика типа 4.

   Переходная характеристика типа 4: Температура плавно подходит к установившемуся значению без выбросов и колебаний. Эта тип переходной характеристики также можно считать оптимальным, однако быстродействие регулятора несколько снижено.

   Переходная характеристика типа 5: Сильно затянутый подход к установившемуся значению говорит о том, что зона пропорциональности чрезмерно велика. Динамическая и статическая точность регулирования здесь мала.

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

Настройка дифференциальной компоненты (Tд)

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

   На предыдущем этапе была задана зона пропорциональности, соответствующая переходной характеристике типа 2, в которой присутствуют затухающие колебания (см. рис. 3, кривая 2, рис. 4, кривая 1.).

Рис. 4

   Следует установить постоянную времени дифференцирования Тд так, чтобы переходная характеристика имела вид кривой 2 на рис. 4. В качестве первого приближения постоянная времени дифференцирования делается равной Тд = 0,2×∆t.

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

  Настройка интегральной компоненты (Ти )

 

   После настройки пропорциональной компоненты (а при необходимости и дифференциальной компоненты) получается переходная характеристика, показанная на следующем рисунке, кривая 1.

Рис. 5

   Интегральная компонента предназначена для того, чтобы убрать остаточное рассогласование между установившимся в системе значением температуры и уставкой. Начинать настраивать постоянную времени интегрирования следует с величины Ти = ∆t.

   Переходная характеристика типа 2: Получается при чрезмерно большой величине постоянной времени интегрирования. Выход на уставку получается очень затянутым.

   Переходная характеристика типа 4: Получается при слишком малой величине постоянной времени интегрирования. Если постоянную времени интегрирования уменьшить еще, то в системе могут возникнуть колебания.

   Переходная характеристика типа 3: Оптимальная.

Использованные источники информации

  • Сабинин Ю.А. Ковчин С.А. “Теория электропривода”
  • Шрейнер Р. Т. “Системы подчиненного регулирования электроприводов”
  • Олссон, Пиани “Цифровые системы автоматизации и управления”
  • Материалы сайта www.asu-tp.org

Глава 8. Типовые законы регулирования. Одноконтурные САР

8.1. Основные типы автоматических регуляторов

Регулятор на основе усилительного звена называется П-регулятором (пропорциональный). Его положительной характеристикой является высокое быстродействие: при отклонении регулируемой величины от заданного значения регулятор выдает регулирующее воздействие, пропорциональное величине отклонения x, что обеспечивает быструю компенсацию возмущения. Существенным недостатком П-регулятора является наличие статической ошибки в переходном процессе АСР с П-регулятором (рис. 37). Статическая ошибка возникает потому, что у П-регулятора между регулируемой величиной x и регулирующим воздействием существует зависимость, однозначно определяемая коэффициентом K. Поэтому генерировать регулирующее воздействие для компенсации возмущения П-регулятор может только путем изменения регулируемой величины x, что и создает статическую ошибку.
Регулятор на основе интегрирующего звена (48) называется И‑регулятором:

Если xвых усилительного звена (П-регулятор) однозначно определяется величиной правой части уравнения, что является причиной возникновения статической погрешности в АСР с П-регулятором, то правая часть уравнения (48) интегрирующего звена (И-регулятор) определяет не величину, а скорость изменения xвых. Величина xвых будет изменяться до тех пор, пока правая часть уравнения (48) не станет равна нулю, т. е. пока регулируемая величина x при наличии возмущения не вернется к заданному значению. Следовательно, в АСР с И-регулятором не возникает статическая погрешность.
Однако у И-регулятора имеется свой недостаток сравнительно с П-регулятором: в случае возникновения возмущения регулирующее воздействие П-регулятора меняется быстрее, чем у И-регулятора с его конечной скоростью, что замедляет процесс компенсации возмущения и ухудшает критерии качества регулирования (рис. 40).

Рис. 40. Переходные процессы в АСР с П- и И-регуляторами

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

Рис. 41. Принципиальная схема АСР с ПИ-регулятором

Действительно, быстродействие ПИ-регулятора обеспечивает усилительное звено, а статическую ошибку снимает интегрирующее звено. Для управления производственными процессами чаще всего используются ПИ-регуляторы.
Кривая разгона идеального ПИ-регулятора показана на рис. 42 .
Уравнение ПИ-регулятора при нулевых начальных условиях имеет вид:

Отношение коэффициентов Kp1/Kp определяет степень влияния интегрирующей части, и его обратная величина называется временем изодрома Tи.

Время изодрома – это время, в течение которого интегрирующее звено изменяет регулирующее воздействие ПИ-регулятора на величину D, равную предварительному изменению D усилительного звена (рис. 42). Поэтому иногда время изодрома называют временем удвоения.

Рис. 42. График кривой разгона идеального ПИ-регулятора:

а – скачкообразное изменение входного воздействия x;

б – реакция (кривая разгона) ПИ-регулятора 

Уравнение ПИ-регулятора можно записать как

откуда передаточная функция

Амплитудно-фазовая характеристика:

В том случае, если рассмотренные регуляторы не обеспечивают требуемое качество регулирования, необходимо увеличить интенсивность процесса компенсации возмущения. Этого можно достигнуть увеличением регулирующего воздействия, которое в свою очередь определяется коэффициентом усиления автоматического регулятора Kp
. Однако ниже будет показано, что увеличение коэффициента усиления регулятора в АСР приводит к тому, что в системе начинают генерироваться незатухающие колебания.
В связи с этим представляет интерес рассмотреть алгоритм, который реализует дифференцирующее звено.
Входной величиной любого регулятора является кривая разгона регулируемой величины (рис. 27), которая определяется величиной возмущения и передаточной функцией объекта регулирования (9). В свою очередь, регулирующее воздействие xp (рис. 27) определяется кривой разгона x и передаточной функцией регулятора.
На рис. 43 показана реакция дифференцирующего звена (Д‑регулятора) на входное воздействие в виде кривой разгона в соответствии с уравнением (51).

Рис. 43. Реакция дифференцирующего звена на кривую разгона

а –изменение входного воздействия x в виде кривой разгона;

б – реакция   дифференцирующего звена

Из рис. 43,а следует, что дифференцирующее звено обеспечивает большее регулирующее воздействие в начале переходного процесса. Это означает, что дифференцирующий регулятор активно компенсирует возмущение и исключает возникновение незатухающих колебаний.
Если включить дифференцирующее звено параллельно ПИ‑регулятору (рис. 44), то получим ПИД-регулятор, обеспечивающий интенсивную компенсацию возмущений. При этом недостаток дифференцирующего звена (при Хвх = const, Хвых = 0 ) компенсируется усилительным и интегрирующим звеньями.

Рис. 44. Принципиальная схема АСР с ПИД-регулятором

На рис. 45 показана кривая разгона ПИД-регулятора.

Рис. 45. Кривая разгона ПИД-регулятора


На рис. 46 показаны переходные процессы на с различными регуляторами. ПИД-регулятор уменьшает динамическую ошибку сравнительно с ПИ-регулятором на 25–30%. Также можно объединить дифференцирующее звено с усилительным звеном и улучшить показатели П-регулятора, получив ПД-регулятор.

Все пять типов рассмотренных автоматических регуляторов имеют общую особенность своего функционирования – обеспечивают стабилизацию регулируемой величины после окончания переходного процесса.

8.2. Критерии качества регулирования

Качество процесса регулирования в АСР характеризуют следующие показатели (критерии) (рис. 16):

Рис. 16. Показатели качества регулирования:

1 – переходной процесс без статической ошибки;

2 – переходной процесс со статической ошибкой

1. Максимальное отклонение в процессе регулирования от заданного значения (динамическая ошибка) ΔХдин.
2. Статическая ошибка ΔХст — возможные отклонения от заданного значения по окончании переходного процесса при использовании некоторых типов регуляторов (подробнее такие АСР рассмотрены ниже).
3. Длительность переходного процесса Тр – период времени с момента начала отклонения регулируемого параметра от задания до возвращения его к заданному значению с определенной степенью точности регулирования ±Δ.
Например, если ±Δ=±25%, это означает, что для заданного значения температуры в 100 °С процесс регулирования будет завершен при достижении диапазона (100 ± 2,5) °С.
4. Степень затухания показывает характер затухания переходного процесса регулирования:

Для того, чтобы переходный процесс затухал за 2 ¸ 3 периода колебаний, степень затухания должна быть равна

5. Степень колебательности процесса m определяет характер колебательности процесса и равна отношению действительной части корня характеристического уравнения к коэффициенту при его мнимой части. Степень колебательности связана со степенью затухания следующим соотношением:

6. Интегральный квадратичный критерий – критерий, определяющий площадь под кривой переходного процесса, возведенной в квадрат (рис. 17):

Уменьшение интегрального критерия соответствует ускорению процесса регулирования.

Рис. 17. Интегральный квадратичный критерий качества регулирования

Однако все приведенные шесть критериев качества не определяют величину потерь производства при отклонениях регулируемой величины от оптимального значения в переходных процессах регулирования. Для определения таких потерь можно использовать экономический критерий.
7. Экономический критерий рассмотрим на примере, регулирования температуры химического реактора θ, когда степень превращения Q в реакторе определяется температурой (рис. 18а).
Разделим переходной процесс на равные интервалы времени Δt и запишем значения θ
в этих точках по графику (18, б). На графике (18, а) для этих температур определим уменьшение степени превращения вследствие отклонения от оптимального режима, а затем сделаем расчет потерь исходных продуктов для каждого интервала Δθ, суммируем эти потери для всего переходного процесса и представим потери в денежном выражении.

Рис. 18. Экономический критерий качества регулирования:

а – зависимость степени превращения Q от температуры θ;

б – переходный процесс регулирования температуры

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

8.3. Выбор закона регулирования

При выборе регулятора следует определиться с группой регулирующих устройств – непрерывного, релейного или импульсного действия. Такой выбор ориентировочно может быть сделан по величине отношения запаздывания к постоянной времени объекта τ/Tоб:
· при отношении τ/Tоб меньше 0.2 целесообразно использовать регулятор релейного действия;
· если отношение τ/Tоб от 0.2 до 1.0, то нужно использовать регулятор непрерывного действия;
· при отношении τ/Tоб больше единицы можно использовать регулятор импульсного действия, или специальные регуляторы, например, регулятор («предиктор») Смита.
Затем необходимо определиться с типом регулятора, т.е. выбрать определенный закон регулирования: П-, И-, ПИ-, ПД- или ПИД-закон

8.4. Методы расчета одноконтурных САР


Как указывалось выше, качество автоматического регулирования определяется свойствами системы в целом, т. е. суммарными свойствами объекта и регулятора. Поскольку объект обычно является неизменяемой частью системы, то обеспечить определенные свойства системы, а следовательно и заданное качество регулирования, можно соответствующим подбором свойств автоматического регулятора, что зависит от параметров его настройки. В свою очередь, параметры настройки являются коэффициентами передачи в уравнении автоматического регулятора.
Таким образом, параметры настройки автоматического регулятора определяются свойствами объекта регулирования, т. е. величинами τоб, Тоб, Коб.

8.4.1. Расчет по «приближенным» формулам

Приближенные формулы для расчета параметров настройки автоматических регуляторов (Kр – коэффициент усиления; Tи – время изодрома; Тд – время дифференцирования) сведены в следующую таблицу:

Таблица 8.1. Формулы для приближенного расчета

параметров настройки регуляторов

Формулы сгруппированы в столбцы в зависимости от характера переходного процесса, который желательно получить, используя рассчитанный таким образом регулятор: апериодический или с перерегулированием в 20 %. В формулы входят следующие свойства объекта регулирования: Коб – коэффициент усиления; Тоб – постоянная времени; τоб – время запаздывания (полного).

Рис. 53. Кривые разгона:

1 – фактическая кривая разгона промышленного объекта;

2 – аппроксимированная (приближенная) кривая разгона

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

Рассмотрим методику более точного определения параметров настройки на примере расчета наиболее «популярного» регулятора – ПИ-регулятора.

8.4.2. Метод незатухающих колебаний

(метод Циглера-Никольса)

При использовании метода незатухающих колебаний [6], который иногда также называется по именам авторов методом Циглера-Никольса, поиск оптимальных параметров настройки осуществляется по величине критического коэффициента усиления П-регулятора и величине периода автоколебательного процесса.

Рис. 54. К поиску параметров настройки методом Циглера-Никольса

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

Метод незатухающих колебаний не требует сложных вычислений, но имеет свои характерные недостатки:
· получить Кркр и Т можно только на действующем объекте, оснащенном АСР с П-регулятором;
· не все объекты химической технологии допускают режим автоколебаний;
· практически трудно уловить момент начала автоколебаний.
Данные недостатки имеют место лишь при настройке регулятора методом Циглера-Никольса непосредственно на действующем объекте. Если заменить реальный объект его математической моделью, данный метод лишается указанных недостатков, кроме того, моделирование позволяет на порядок ускорить процесс поиска параметров настройки. Но для выполнения моделирования требуется достаточно точное математическое описание объекта регулирования, а получить его удается не всегда.

8.4.3. Метод расширенных частотных характеристик

Уравнение ПИ-регулятора (65) или (66):

Передаточная функция ПИ-регулятора:

Знак «минус» указывает, что действие регулятора направлено против возмущения.
Из передаточной функции получаем амплитудно-фазовую характеристику ПИ-регулятора путем замены p на iw:

Так как по формуле Эйлера

с затуханием за три периода

Заменив iw на комплексную переменную (-mw+iw), получаем расширенную амплитудно-фазовую характеристику (РАФХ)Ю

Расширенными такие характеристики называются потому, что они как бы «расширены» по отношению к обычной АФХ (рис. 56).
Предположим, что объект регулирования имеет передаточную функцию второго порядка следующего вида:

Для дальнейшего математического моделирования АСР передаточную функцию необходимо преобразовать:

Рис. 56. АФХ объекта регулирования с самовыравниванием:

1 – обычная; 2 – расширенная

Расширенная амплитудно-фазовая характеристика объекта регулирования при замене p на (-mw+iw) будет иметь вид:

Где Rоб(m,w) -расширенная амплитудно-частотная характеристика объекта; Fоб(m,w) -расширенная фазочастотная харктеристика объекта. Величина 40w в выражении для Fоб (m,w) опеделяет угол в радианах и для пересчета в градусы неоходимо 40w умножить на 57,3

Условием нахождения замкнутой АСР на границе устойчивости является уравнение:

Аналогично, исходным уравнением для получения заданной степени колебательности m, а следовательно, определенной степени затухания y, является соотношение:

Это соотношение двух комплексных чисел возможно в том случае, если произведение модулей РАФХ равно единице, а аргументы (фазы) равны между собой, т. е.

Решая эти уравнения относительно S0 и Kp, получаем:

Обычно принимают степень колебательности m = 0,221, что соответствует степени затухания ψ=0,75 и обеспечивает затухание процесса регулирования примерно за три периода. Тогда

Уравнения для определения параметров настройки ПИ-регулятора можно преобразовать:

Подставляя в приведенные уравнения численные значения частоты w от 0 до значения, когда S0 становится отрицательной величиной, строим на плоскости параметров настройки кривую равной степени колебательности

Пример кривых равной степени колебательности в плоскости параметров настройки ПИ-регулятора показан на рис. 57. Графики процессов регулирования с различными параметрами настройки ПИ-регулятора при m = 0,221 показаны на рис. 58. Все процессы регулирования, показанные на рис. 58, реализованы ПИ-регулятором с параметрами настройки, полученными по кривой равной степени колебательности в точках 1, 2, 3, 4 (рис. 57), и все имеют m = 0,221, т. е. затухают примерно за три периода, но обладают существенно различным характером.
В связи с этим возникает задача определения оптимальных параметров настройки на кривой равной степени колебательности.

Рис. 57. Кривые равной степени колебательности

В качестве критерия оптимальности выбираем продолжительность переходного процесса – время регулирования (т. е. быстродействие АСР) и отсутствие постоянной или врéменной статической ошибки. Это исключает из рассмотрения параметры настройки в точке 4 (параметры настройки П-регулятора) и в точке 3 (врéменная статическая ошибка) (рис. 58).

Рис. 58. Графики процессов регулирования для ПИ-регулятора

с различными параметрами настройки в точках 1, 2, 3 и 4

при степени колебательности m =0,221

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

а затем начинает уменьшаться в связи с резким увеличением  (рис. 57).

Рис. 59. Выбор оптимальных параметров настройки

Таким образом, оптимальные параметры настройки ПИ-регулятора находятся в точке 2 на кривой равной степени колебательности (рис. 59).

Источник
Плютто В. П., Дубровский И. И. Элементы теории управления химико-технологическими процессами и системами. Конспект лекций: Учеб. пособие – М.: РХТУ им. Д. И. Менделеева, 2003. – 127 с.

Вместо введения

Системы автоматического управления (САУ) предназначены для автоматического изменения одного или нескольких параметров объекта управления с целью установления требуемого режима его работы. САУ обеспечивает поддержание постоянства заданных значений регулируемых параметров или их изменение по заданному закону либо оптимизирует определенные критерии качества управления. Например, к таким системам относятся:

  • системы стабилизации,
  • системы программного управления,
  • следящие системы

Это достаточно широкий класс систем, которые можно найти где угодно. Но какое это отношение имеет к Unity3D и вероятно к играм в частности? В принципе прямое: в любой игре так или иначе использующей симуляцию как элемент геймплея реализуются САУ, к таким играм относятся, например, Kerbal Space Programm, Digital Combat Simulator (бывший Lock On), Strike Suit Zero и т.д. (кто знает еще примеры — пишите в комментариях). В принципе любая игра, моделирующая реальные физические процессы, в том числе и просто кинематику с динамикой движения, может реализовывать те или иные САУ — этот подход проще, естественнее, а у разработчика уже есть есть набор готовых инструментов, предоставленных всякими Вышнеградскими, Ляпуновыми, Калманами, Чебышевами и прочими Коломогоровами, поэтому можно обойтись без изобретения велосипеда, т.к. его уже изобрели, да так, что получилась отдельная наука: Теория автоматического управления. Главное тут не переусердствовать. Одна тут только проблема: рассказывают про ТАУ не везде, не всем, зачастую мало и не очень понятно.

Немножко теории

Классическая система автоматического управления представленная на следующем рисунке:

image

Ключевым элементом любой САУ является регулятор представляющий из себя устройство, которое следит за состоянием объекта управления и обеспечивает требуемый закон управления. Процесс управления включает в себя: вычисление ошибки управления или сигнала рассогласования e(t) как разницы между желаемой уставкой (set point или SP) и текущей величиной процесса (process value или PV), после чего регулятор вырабатывает управляющие сигналы (manipulated value или MV).

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

image

Где, $e(t)$ ошибка рассогласования, а также, $ P = K_p cdot e(t)$ — пропорциональная, $ I = K_i cdot int_0^t e(tau)dtau$ — интегральная, $D = K_d cdot frac{de(t)}{dt}$ — дифференциальная составляющие (термы) закона управления, который в итоговом виде описывается следующими формулами

$ e(t) = SP(t) - PV(t), $

$ MV(t) = underbrace{K_p cdot e(t)}_{P} + underbrace{K_i cdot int_0^t e(tau)dtau}_{I} + underbrace{K_d cdot frac{de(t)}{dt}}_{D}, $

Пропорциональная составляющая P — отвечает за т.н. пропорциональное управление, смысл которого в том, что выходной сигнал регулятора, противодействует отклонению регулируемой величины (ошибки рассогласования или еще это называют невязкой) от заданного значения. Чем больше ошибка рассогласования, тем больше командное отклонение регулятора. Это самый простой и очевидный закон управления. Недостаток пропорционального закона управления заключается в том, что регулятор никогда не стабилизируется в заданном значении, а увеличение коэффициента пропорциональности всегда приводит к автоколебаниям. Именно поэтому в довесок к пропорциональному закону управления приходиться использовать интегральный и дифференциальный.

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

Дифференциальная составляющая D пропорциональна темпу изменения отклонения регулируемой величины и предназначена для противодействия отклонениям от целевого значения, которые прогнозируются в будущем. Примечательно то, что дифференциальная компонента устраняет затухающие колебания. Дифференциальное регулирование особенно эффективно для процессов, которые имеют большие запаздывания. Недостатком дифференциального закона управления является его неустойчивость к воздействую шумов (Differentiation noise).

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

Казалось бы, вопрос реализации ПИД-регуляторов уже давно избит и здесь на Хабре есть парочка неплохих статей на эту тему в том числе и на Unity3D, также есть неплохая статья PID Without a PhD (перевод) и цикл статей в журнале «Современные технологии автоматизации» в двух частях: первая и вторая. Также к вашим услугам статья на Википедии (наиболее полную читайте в английском варианте). А на форумах коммьюнити Unity3D нет-нет, да и всплывет PID controller как и на gamedev.stackexchange

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

Попытка номер раз

В качестве примера попытаемся реализовать схему регулирования на примере управления поворотом в простенькой космической 2D-аркаде, по шагам, начиная с самого начала (не забыли, что это туториал?).

Почему не 3D? Потому что реализация не измениться, за исключением того, что придется воротить ПИД-регулятор для контроля тангажа, рысканья и крена. Хотя вопрос корректного применения ПИД-регулирования вместе с кватернионами действительно интересный, возможно в будущем его и освящу, но даже в NASA предпочитают углы Эйлера вместо кватернионов, так что обойдемся простенькой моделью на двухмерной плоскости.

Для начала создадим сам объект игровой объект космического корабля, который будет состоять из собственно самого объекта корабля на верхнем уровне иерархии, прикрепим к нему дочерний объект Engine (чисто спецэффектов ради). Вот как это выглядит у меня:

image

А на сам объект космического корабля накидаем в инспекторе всяческих компонент. Забегая вперед, приведу скрин того, как он будет выглядеть в конце:

image
Но это потом, а пока в нем еще нет никаких скриптов, только стандартный джентльменский набор: Sprite Render, RigidBody2D, Polygon Collider, Audio Source (зачем?).

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

Т.к. помимо самого космического корабля есть куча других, менее умных космических объектов, то сначала опишем родительский класс BaseBody, который в себе будет содержать ссылки на на наши компоненты, методы инициализации и уничтожения, а также ряд дополнительных полей и методов, например для реализации небесной механики:

BaseBody.cs

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

namespace Assets.Scripts.SpaceShooter.Bodies
{
    [RequireComponent(typeof(SpriteRenderer))]
    [RequireComponent(typeof(AudioSource))]
    [RequireComponent(typeof(Rigidbody2D))]
    [RequireComponent(typeof(Collider2D))]

    public class BaseBody : MonoBehaviour
    {
        readonly float _deafultTimeDelay = 0.05f;

[HideInInspector]
        public static List<BaseBody> _bodies = new List<BaseBody>();

        #region RigidBody

        [HideInInspector]
        public Rigidbody2D _rb2d;

        [HideInInspector]
        public Collider2D[] _c2d;

        #endregion

        #region References

        [HideInInspector]
        public Transform _myTransform;

        [HideInInspector]
        public GameObject _myObject;

        /// <summary>
        /// Объект, который появляется при уничтожении
        /// </summary>
        public GameObject _explodePrefab;

        #endregion

        #region  Audio

        public AudioSource _audioSource;

        /// <summary>
        /// Звуки, которые проигрываются при получении повреждения
        /// </summary>
        public AudioClip[] _hitSounds;

        /// <summary>
        /// Звуки, которые проигрываются при появлении объекта
        /// </summary>
        public AudioClip[] _awakeSounds;

        /// <summary>
        /// Звуки, которые воспроизводятся перед смертью
        /// </summary>
        public AudioClip[] _deadSounds;

        #endregion

        #region External Force Variables
        /// <summary>
        /// Внешние силы воздйствующие на объект
        /// </summary>
        [HideInInspector]
        public Vector2 _ExternalForces = new Vector2();

        /// <summary>
        /// Текущий вектор скорости
        /// </summary>
        [HideInInspector]
        public Vector2 _V = new Vector2();

        /// <summary>
        /// Текущий вектор силы гравитации
        /// </summary>
        [HideInInspector]
        public Vector2 _G = new Vector2();
        #endregion

        public virtual void Awake()
        {
            Init();
        }

        public virtual void Start()
        {

        }

        public virtual void Init()
        {
            _myTransform = this.transform;
            _myObject = gameObject;

            _rb2d = GetComponent<Rigidbody2D>();
            _c2d = GetComponentsInChildren<Collider2D>();
            _audioSource = GetComponent<AudioSource>();

            PlayRandomSound(_awakeSounds);

            BaseBody bb = GetComponent<BaseBody>();
            _bodies.Add(bb);
        }

        /// <summary>
        /// Уничтожение персонажа
        /// </summary>
        public virtual void Destroy()
        {
            _bodies.Remove(this);
            for (int i = 0; i < _c2d.Length; i++)
            {
                _c2d[i].enabled = false;
            }
            float _t = PlayRandomSound(_deadSounds);
            StartCoroutine(WaitAndDestroy(_t));
        }

        /// <summary>
        /// Ждем некоторое время перед уничтожением
        /// </summary>
        /// <param name="waitTime">Время ожидания</param>
        /// <returns></returns>
        public IEnumerator WaitAndDestroy(float waitTime)
        {
            yield return new WaitForSeconds(waitTime);

            if (_explodePrefab)
            {
                Instantiate(_explodePrefab, transform.position, Quaternion.identity);
            }

            Destroy(gameObject, _deafultTimeDelay);
        }

        /// <summary>
        /// Проигрывание случайного звука
        /// </summary>
        /// <param name="audioClip">Массив звуков</param>
        /// <returns>Длительность проигрываемого звука</returns>
        public float PlayRandomSound(AudioClip[] audioClip)
        {
            float _t = 0;
            if (audioClip.Length > 0)
            {
                int _i = UnityEngine.Random.Range(0, audioClip.Length - 1);
                AudioClip _audioClip = audioClip[_i];
                _t = _audioClip.length;
                _audioSource.PlayOneShot(_audioClip);
            }
            return _t;
        }

        /// <summary>
        /// Получение урона
        /// </summary>
        /// <param name="damage">Уровень урона</param>
        public virtual void Damage(float damage)
        {
            PlayRandomSound(_hitSounds);
        }

    }
}

Вроде описали все что надо, даже больше чем нужно (в рамках этой статьи). Теперь отнаследуем от него класс корабля Ship, который должен уметь двигаться и поворачивать:

SpaceShip.cs

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

namespace Assets.Scripts.SpaceShooter.Bodies
{
    public class Ship : BaseBody
    {
        public Vector2 _movement = new Vector2();
        public Vector2 _target = new Vector2();
        public float _rotation = 0f;

        public void FixedUpdate()
        {
            float torque = ControlRotate(_rotation);
            Vector2 force = ControlForce(_movement);

            _rb2d.AddTorque(torque);
            _rb2d.AddRelativeForce(force);
        }

        public float ControlRotate(Vector2 rotate)
        {
            float result = 0f;

            return result;
        }

        public Vector2 ControlForce(Vector2 movement)
        {
            Vector2 result = new Vector2();

            return result;

        }
    }
}

Пока в нем нет ничего интересно, на текущий момент это просто класс-заглушка.

Также опишем базовый(абстрактный) класс для всех контроллеров ввода BaseInputController:

BaseInputController.cs

using UnityEngine;
using Assets.Scripts.SpaceShooter.Bodies;

namespace Assets.Scripts.SpaceShooter.InputController
{
    public enum eSpriteRotation
    {
        Rigth = 0,
        Up = -90,
        Left = -180,
        Down = -270
    }

    public abstract class BaseInputController : MonoBehaviour
    {
        public GameObject _agentObject;
        public Ship _agentBody; // Ссылка на компонент логики корабля
        public eSpriteRotation _spriteOrientation = eSpriteRotation.Up; //Это связано с нестандартной 
                                                                           // ориентации спрайта "вверх" вместо "вправо"

        public abstract void ControlRotate(float dt);
        public abstract void ControlForce(float dt);

        public virtual void Start()
        {
            _agentObject = gameObject;
            _agentBody = gameObject.GetComponent<Ship>();
        }

        public virtual void FixedUpdate()
        {
            float dt = Time.fixedDeltaTime;
            ControlRotate(dt);
            ControlForce(dt);
        }

        public virtual void Update()
        {
            //TO DO
        }
    }
}

И наконец, класс контроллера игрока PlayerFigtherInput:

PlayerInput.cs

using UnityEngine;
using Assets.Scripts.SpaceShooter.Bodies;

namespace Assets.Scripts.SpaceShooter.InputController
{
    public class PlayerFigtherInput : BaseInputController
    {
        public override void ControlRotate(float dt)
        {
            // Определяем позицию мыши относительно игрока
            Vector3 worldPos = Input.mousePosition;
            worldPos = Camera.main.ScreenToWorldPoint(worldPos);

            // Сохраняем координаты указателя мыши
            float dx = -this.transform.position.x + worldPos.x;
            float dy = -this.transform.position.y + worldPos.y;

            //Передаем направление
            Vector2 target = new Vector2(dx, dy);
            _agentBody._target = target;

            //Вычисляем поворот в соответствии с нажатием клавиш
            float targetAngle = Mathf.Atan2(dy, dx) * Mathf.Rad2Deg;
            _agentBody._targetAngle = targetAngle + (float)_spriteOrientation;
        }

        public override void ControlForce(float dt)
        {
            //Передаем movement
            _agentBody._movement = Input.GetAxis("Vertical") * Vector2.up 
                + Input.GetAxis("Horizontal") * Vector2.right;
        }
    }
}

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Assets.Scripts.Regulator
{
    [System.Serializable] // Этот атрибут необходим для того что бы поля регулятора 
                                   // отображались в инспекторе и сериализовывались
    public class SimplePID
    {
        public float Kp, Ki, Kd;

        private float lastError;
        private float P, I, D;

        public SimplePID()
        {
            Kp = 1f;
            Ki = 0;
            Kd = 0.2f;
        }

        public SimplePID(float pFactor, float iFactor, float dFactor)
        {
            this.Kp = pFactor;
            this.Ki = iFactor;
            this.Kd = dFactor;
        }

        public float Update(float error, float dt)
        {
            P = error;
            I += error * dt;
            D = (error - lastError) / dt;
            lastError = error;

            float CO = P * Kp + I * Ki + D * Kd;

            return CO;
        }
    }
}

Значения коэффициентов по умолчанию возьмем с потолка: это будет тривиальный единичный коэффициент пропорционального закона управления Kp = 1, небольшое значение коэффициента для дифференциального закона управления Kd = 0.2, который должен устранить ожидаемые колебания и нулевое значение для Ki, которое выбрано потому, что в нашей программной модели нет никаких статичных ошибок (но вы всегда можете их внести, а потом героически побороться с помощью интегратора).

Теперь вернемся к нашему классу SpaceShip и попробуем заюзать наше творение в качестве регулятора поворота космического корабля в методе ControlRotate:

 public float ControlRotate(Vector2 rotate)
 {
      float MV = 0f;
      float dt = Time.fixedDeltaTime;

      //Вычисляем ошибку
      float angleError = Mathf.DeltaAngle(_myTransform.eulerAngles.z, targetAngle);

      //Получаем корректирующее ускорение
      MV = _angleController.Update(angleError, dt);

      return MV;
 }

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

И без этих ваших Quaternion.Lerp

 if (!_rb2d.freezeRotation)
     rb2d.freezeRotation = true;

 float deltaAngle = Mathf.DeltaAngle(_myTransform.eulerAngles.z, targetAngle);
 float T = dt *  Mathf.Abs( _rotationSpeed / deltaAngle);

 // Трансформируем угол в вектор
Quaternion rot = Quaternion.Lerp(
                _myTransform.rotation,
                Quaternion.Euler(new Vector3(0, 0, targetAngle)),
                T);

 // Изменяем поворот объекта
 _myTransform.rotation = rot;

Получившейся исходный код Ship.cs под спойлером

using UnityEngine;
using Assets.Scripts.Regulator;

namespace Assets.Scripts.SpaceShooter.Bodies
{
    public class Ship : BaseBody
    {
        public GameObject _flame;

        public Vector2 _movement = new Vector2();
        public Vector2 _target = new Vector2();

        public float _targetAngle = 0f;
        public float _angle = 0f;

        [Header("PID")]
        public SimplePID _angleController = new SimplePID();

        public void FixedUpdate()
        {
            float torque = ControlRotate(_targetAngle);
            Vector2 force = ControlForce(_movement);

            _rb2d.AddTorque(torque);
            _rb2d.AddRelativeForce(force);
        }

        public float ControlRotate(float rotate)
        {
            float MV = 0f;
            float dt = Time.fixedDeltaTime;

            _angle = _myTransform.eulerAngles.z;

            //Вычисляем ошибку
            float angleError = Mathf.DeltaAngle(_angle, rotate);

            //Получаем корректирующее ускорение
            MV = _angleController.Update(angleError, dt);

            return MV;
        }

        public Vector2 ControlForce(Vector2 movement)
        {
            Vector2 MV = new Vector2();

            //Кусок кода спецэффекта работающего двигателя ради
            if (movement != Vector2.zero)
            {
                if (_flame != null)
                {
                    _flame.SetActive(true);
                }
            }
            else
            {
                if (_flame != null)
                {
                    _flame.SetActive(false);
                }
            }

            MV = movement;
            return MV;
        }
    }
}

Все? Расходимся по домам?

WTF! Что происходит? Почему корабль поворачивается как-то странно? И почему он так резко отскакивает от других объектов? Неужели этот глупый ПИД-регулятор не работает?

Без паники! Давайте попробуем разобраться что происходит.

В момент получения нового значения SP, происходит резкий (ступенчатый) скачок рассогласования ошибки, которая, как мы помним, вычисляется вот так: $e(t) = SP(t) - PV(t), $ соответственно происходит резкий скачок производной ошибки $frac{de(t)}{dt}$, которую мы вычисляем в этой строчке кода:

D = (error - lastError) / dt;

Можно, конечно, попробовать другие схемы дифференцирования, например, трехточечную, или пятиточечную, или… но все равно это не поможет. Ну вот не любят производные резких скачков — в таких точках функция не является дифференцируемой. Однако поэкспериментировать с разными схемами дифференцирования и интегрирования стоит, но потом и не в этой статье.

Думаю что настал момент построить графики переходного процесса: ступенчатое воздействие от S(t) = 0 в SP(t) = 90 градусов для тела массой в 1 кг, длинной плеча силы в 1 метр и шагом сетки дифференцирования 0.02 с — прям как в нашем примере на Unity3D (на самом деле не совсем, при построении этих графиков не учитывалось, что момент инерции зависит от геометрии твердого тела, поэтому переходный процесс будет немножко другой, но все же достаточно похожий для демонстрации). Все величены на грифике приведены в абсолютных значениях:
image
Хм, что здесь происходит? Куда улетел отклик ПИД-регулятора?

Поздравляю, мы только что столкнулись с таким явлением как «удар» (kick). Очевидно, что в момент времени, когда процесс еще PV = 0, а уставка уже SP = 90, то при численном дифференцировании получим значение производной порядка 4500, которое умножится на Kd=0.2 и сложится с пропорциональным теромом, так что на выходе мы получим значение углового ускорения 990, а это уже форменное надругательство над физической моделью Unity3D (угловые скорости будут достигать 18000 град/с… я думаю это предельное значение угловой скорости для RigidBody2D).

  • Может стоит подобрать коэффициенты ручками, так чтобы скачок был не таким сильным?
  • Нет! Самое лучше чего мы таким образом сможем добиться — небольшая амплитуда скачка производной, однако сам скачок как был так и останется, при этом можно докрутиться до полной неэффективности дифференциальной составляющей.

Впрочем можете поэкспериментировать.

Попытка номер два. Сатурация

Логично, что привод (в нашем случае виртуальные маневровые двигатели SpaceShip), не может отрабатывать сколько угодно большие значения которые может выдать наш безумный регулятор. Так что первое что мы сделаем — сатурируем выход регулятора:

public float ControlRotate(Vector2 rotate, float thrust)
{
    float CO = 0f;
    float MV = 0f;
    float dt = Time.fixedDeltaTime;

    //Вычисляем ошибку
    float angleError = Mathf.DeltaAngle(_myTransform.eulerAngles.z, targetAngle);

    //Получаем корректирующее ускорение
    CO = _angleController.Update(angleError, dt);

    //Сатурируем
    MV = CO;
    if (MV > thrust) MV = thrust;
    if (MV< -thrust) MV = -thrust;

    return MV;
}

А очередной раз переписанный класс Ship полностью выглядит так

namespace Assets.Scripts.SpaceShooter.Bodies
{
    public class Ship : BaseBody
    {
        public GameObject _flame;

        public Vector2 _movement = new Vector2();
        public Vector2 _target = new Vector2();

        public float _targetAngle = 0f;
        public float _angle = 0f;

        public float _thrust = 1f;

        [Header("PID")]
        public SimplePID _angleController = new SimplePID(0.1f,0f,0.05f);

        public void FixedUpdate()
        {
            _torque = ControlRotate(_targetAngle, _thrust);
            _force = ControlForce(_movement);

            _rb2d.AddTorque(_torque);
            _rb2d.AddRelativeForce(_force);
        }

        public float ControlRotate(float targetAngle, float thrust)
        {
            float CO = 0f;
            float MV = 0f;
            float dt = Time.fixedDeltaTime;

            //Вычисляем ошибку
            float angleError = Mathf.DeltaAngle(_myTransform.eulerAngles.z, targetAngle);

            //Получаем корректирующее ускорение
            CO = _angleController.Update(angleError, dt);

            //Сатурируем
            MV = CO;
            if (MV > thrust) MV = thrust;
            if (MV< -thrust) MV = -thrust;

            return MV;
        }

        public Vector2 ControlForce(Vector2 movement)
        {
            Vector2 MV = new Vector2();

            if (movement != Vector2.zero)
            {
                if (_flame != null)
                {
                    _flame.SetActive(true);
                }
            }
            else
            {
                if (_flame != null)
                {
                    _flame.SetActive(false);
                }
            }

            MV = movement * _thrust;

            return MV;
        }

        public void Update()
        {

        }        
    }
}

Итоговая схема нашего САУ тогда станет уже вот такой
image

При этом уже становится понятно, что выход контроллера CO(t) немного не одно и тоже, что управляемая величина процесса MV(t).

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

Запустив игру, мы обнаружим, что космический корабль стал наконец управляемым:

Если построить графики, то можно увидеть, что реакция контроллера стала уже вот такой:
image
Здесь уже используются нормированные величены, углы поделены на значение SP, а выход контроллера отнормирован относительно максимального значения на котором уже происходит сатурация.

Теперь на графике видно наличие ошибки перерегулирования (overshooting) и затухающие колебания. Уменьшая Kp и увеличивая Kd можно добиться уменьшения колебаний, но зато увеличится время реакции контроллера (скорость поворота корабля). И наоборот, увеличивая Kp и уменьшая Kd — можно добиться увеличения скорости реакции контроллера, но появятся паразитные колебания, которые при определенных (критических) значениях, перестанут быть затухающими.

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

А общий алгоритм ручной настройки ПИД-регулятора следующий:

  1. Подбираем пропорциональный коэффициенты при отключенных дифференциальных и интегральных звеньях до тех пор пока не начнутся автоколебания.
  2. Постепенно увеличивая дифференциальную составляющую избавляемся от автоколебаний
  3. Если наблюдается остаточная ошибка регулирования (смещение), то устраняем её за счет интегральной составляющей.

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

В общем не будем о грустном, дальше нас ждет самое интересное…

Попытка номер три. Еще раз производные

Приделав костыль в виде ограничения значений выхода контроллера мы так и не решили самую главную проблему нашего регулятора — дифференциальная составляющая плохо себя чувствует при ступенчатом изменении ошибки на входе регуляторе. На самом деле есть множество других костылей, например, в момент скачкообразного изменения SP «отключать» дифференциальную составляющую или же поставить фильтры нижних частот между SP(t) и операцией $SP(t)-PV(t)$ за счет которого будет происходить плавное нарастание ошибки, а можно совсем развернуться и впендюрить самый настоящий фильтр Калмана для сглаживания входных данных. В общем костылей много, и добавить наблюдателя конечно хотелось бы, но не в этот раз.

Поэтому снова вернемся к производной ошибки рассогласования и внимательно на неё посмотрим:

$ frac{de(t)}{dt} = frac{d(SP(t)-PV(t))}{dt} = frac{dSP(t)}{dt} - frac{dPV(t)}{dt}, $

Ничего не заметили? Если хорошенько присмотреться, то можно обнаружить, что вообще-то SP(t), не меняется во времени (за исключением моментов ступенчатого изменения, когда регулятор получает новую команду), т.е. её производная равна нулю:

$ frac{dSP(t)}{dt} = 0, $

тогда

$ frac{de(t)}{dt} = - frac{dPV(t)}{dt}, $

Иными словами, вместо производной ошибки, которая дифференцируема не везде мы можем использовать производную от процесса, который в мире классической механики как правило непрерывен и дифференцируем везде, а схема нашей САУ уже приобретет следующий вид:
image

$ e(t) = SP(t) - PV(t), $

$ CO(t) = underbrace{K_p cdot e(t)}_{P} + underbrace{K_i cdot int_0^t e(tau)dtau}_{I} - underbrace{K_d cdot frac{dPV(t)}{dt}}_{D}, $

Модифицируем код регулятора:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Assets.Scripts.Regulator
{
    [System.Serializable]
    public class SimplePID
    {
        public float Kp, Ki, Kd;
        private float P, I, D;

        private float lastPV = 0f;   

        public SimplePID()
        {
            Kp = 1f;
            Ki = 0f;
            Kd = 0.2f;
        }

        public SimplePID(float pFactor, float iFactor, float dFactor)
        {
            this.Kp = pFactor;
            this.Ki = iFactor;
            this.Kd = dFactor;
        }

        public float Update(float error, float PV, float dt)
        {
            P = error;
            I += error * dt;
            D = -(PV - lastPV) / dt;

            lastPV = PV;

            float CO = Kp * P + Ki * I + Kd * D;

            return CO;
        }
    }
}

И немного изменим метод ControlRotate:

public float ControlRotate(Vector2 rotate, float thrust)
{
     float CO = 0f;
     float MV = 0f;
     float dt = Time.fixedDeltaTime;

     //Вычисляем ошибку
     float angleError = Mathf.DeltaAngle(_myTransform.eulerAngles.z, targetAngle);

     //Получаем корректирующее ускорение
     CO = _angleController.Update(angleError, _myTransform.eulerAngles.z, dt);

     //Сатурируем
     MV = CO;
     if (CO > thrust) MV = thrust;
     if (CO < -thrust) MV = -thrust;

     return MV;
}

И-и-и-и… если запустить игру, то обнаружиться, что на самом деле ничего ничего не изменилось с последней попытки, что и требовалось доказать. Однако, если убрать сатурацию, то график реакции регулятора будет выглядеть вот так:
image
Скачок CO(t) по прежнему присутствует, однако он уже не такой большой как был в самом начале, а самое главное — он стал предсказуемым, т.к. обеспечивается исключительно пропорциональной составляющей, и ограничен максимально возможной ошибкой рассогласования и пропорциональным коэффициентом ПИД-регулятора (а это уже намекает на то, что Kp имеет смысл выбрать все же меньше единицы, например, 1/90f), но не зависит от шага сетки дифференцирования (т.е. dt). В общем, я настоятельно рекомендую использовать именно производную процесса, а не ошибки.

Думаю теперь никого не удивит, но таким же макаром можно заменить $K_p cdot e(t)$ на $-K_p cdot PV(t)$, однако останавливаться на этом мы не будем, можете сами поэкспериментировать и рассказать в комментариях, что из этого получилось (самому интересно)

Попытка номер четыре. Альтернативные реализации ПИД-регулятор

Помимо описанного выше идеального представления ПИД-регулятора, на практике часто применяется стандартная форма, без коэффициентов Ki и Kd, вместо которых используются временные постоянные.

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

$ e(t) = SP(t) - PV(t), $

$ CO(t) =CO_{bias} + K_p cdot Bigl(e(t) + frac{1}{T_i} cdot int_0^t e(tau)dtau - T_d cdot frac{dPV(t)}{dt} Bigl), $

где, $T_d= frac{K_d}{K_p}$ — постоянная дифференцирования, влияющая на прогнозирование состояния системы регулятором,
$T_i = frac{K_p}{K_i}$ — постоянная интегрирования, влияющая на интервал усреднения ошибки интегральным звеном.

Основные принципы настройки ПИД-регулятора в стандартной форме аналогичны идеализированному ПИД-регулятору:

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

Исходный код стандартной формы, вы можете найти под спойлером

namespace Assets.Scripts.Regulator
{
    [System.Serializable]    
    public class StandartPID
    {
        public float Kp, Ti, Td;
        public float error, CO;
        public float P, I, D;

        private float lastPV = 0f;

        public StandartPID()
        {
            Kp = 0.1f;
            Ti = 10000f;
            Td = 0.5f;
            bias = 0f;
        }

        public StandartPID(float Kp, float Ti, float Td)
        {
            this.Kp = Kp;
            this.Ti = Ti;
            this.Td = Td;
        }

        public float Update(float error, float PV, float dt)
        {
            this.error = error;
            P = error;
            I += (1 / Ti) * error * dt;
            D = -Td * (PV - lastPV) / dt;

            CO = Kp * (P + I + D);
            lastPV = PV;

            return CO;
        }
    }
}

В качестве значений по умолчанию, выбраны Kp = 0.01, Ti = 10000, Td = 0.5 — при таких значениях корабль поворачивается достаточно быстро и обладает некоторым запасом устойчивости.

Помимо такой формы ПИД-регулятора, часто используется т.н. реккурентная форма:

$ CO(t_k)=CO(t_{k-1})+K_pleft[left(1+dfrac{Delta t}{T_i}+dfrac{T_d}{Delta t}right)e(t_k)+left(-1-dfrac{2T_d}{Delta t}right)e(t_{k-1})+dfrac{T_d}{Delta t}e(t_{k-2})right] $

Не будем на ней останавливаться, т.к. она актуальна прежде всего для хардверных программистов, работающих с FPGA и микроконтроллерами, где такая реализация значительно удобнее и эффективнее. В нашем же случае — давайте что-нибудь сваям на Unity3D — это просто еще одна реализация ПИД-контроллера, которая ни чем не лучше других и даже менее понятная, так что еще раз дружно порадуемся как хорошо программировать в уютненьком C#, а не в жутком и страшном VHDL, например.

Вместо заключения. Куда бы еще присобачить ПИД-регулятор

Теперь попробуем немного усложнить управление корабля используя двухконтурное управление: один ПИД-регулятор, уже знакомый нам _angleController, отвечает по прежнему за угловое позиционирование, а вот второй — новый, _angularVelocityController — контролирует скорость поворота:

public float ControlRotate(float targetAngle, float thrust)
{
    float CO = 0f;
    float MV = 0f;
    float dt = Time.fixedDeltaTime;

    _angle = _myTransform.eulerAngles.z;

    //Контроллер угла поворота
    float angleError = Mathf.DeltaAngle(_angle, targetAngle);
    float torqueCorrectionForAngle = 
    _angleController.Update(angleError, _angle, dt);

    //Контроллер стабилизации скорости
    float angularVelocityError = -_rb2d.angularVelocity;
    float torqueCorrectionForAngularVelocity = 
        _angularVelocityController.Update(angularVelocityError, -angularVelocityError, dt);

    //Суммарный выход контроллера
    CO = torqueCorrectionForAngle + torqueCorrectionForAngularVelocity;

    //Дискретизируем с шагом 100            
    CO = Mathf.Round(100f * CO) / 100f;

    //Сатурируем
    MV = CO;
    if (CO > thrust) MV = thrust;
    if (CO < -thrust) MV = -thrust;

    return MV;
}

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

Помимо этого, добавим новый класс ввода игрока — PlayerInputCorvette, в котором повороты буду осуществляться уже за счет нажатия клавиш «вправо-влево», а целеуказание с помощью мыши мы оставим для чего-нибудь более полезного, например, для управления турелью. Заодно у нас теперь появился такой параметр как _turnRate — отвечающий за скорость/отзывчивость поворота (не понятно только куда его поместить лучше в InputCOntroller или все же Ship).

public class PlayerCorvetteInput : BaseInputController
{
     public float _turnSpeed = 90f;

     public override void ControlRotate()
     {
         // Находим указатель мыши
         Vector3 worldPos = Input.mousePosition;
         worldPos = Camera.main.ScreenToWorldPoint(worldPos);

         // Сохраняем относительные координаты указателя мыши
         float dx = -this.transform.position.x + worldPos.x;
         float dy = -this.transform.position.y + worldPos.y;

         //Передаем направление указателя мыши
         Vector2 target = new Vector2(dx, dy);
         _agentBody._target = target;

         //Вычисляем поворот в соответствии с нажатием клавиш
         _agentBody._rotation -= Input.GetAxis("Horizontal") * _turnSpeed * Time.deltaTime;
    }

    public override void ControlForce()
    {            
         //Передаем movement
         _agentBody._movement = Input.GetAxis("Vertical") * Vector2.up;
    }
}

Также для наглядности накидаем на коленках скрипт для отображения отладочной информации

namespace Assets.Scripts.SpaceShooter.UI
{
    [RequireComponent(typeof(Ship))]
    [RequireComponent(typeof(BaseInputController))]
    public class Debugger : MonoBehaviour
    {
        Ship _ship;
        BaseInputController _controller;
        List<SimplePID> _pids = new List<SimplePID>();
        List<string> _names = new List<string>();

        Vector2 _orientation = new Vector2();

        // Use this for initialization
        void Start()
        {
            _ship = GetComponent<Ship>();
            _controller = GetComponent<BaseInputController>();

            _pids.Add(_ship._angleController);
            _names.Add("Angle controller");

            _pids.Add(_ship._angularVelocityController);
            _names.Add("Angular velocity controller");

        }

        // Update is called once per frame
        void Update()
        {
            DrawDebug();
        }

        Vector3 GetDiretion(eSpriteRotation spriteRotation)
        {
            switch (_controller._spriteOrientation)
            {
                case eSpriteRotation.Rigth:
                    return transform.right;
                case eSpriteRotation.Up:
                    return transform.up;
                case eSpriteRotation.Left:
                    return -transform.right;
                case eSpriteRotation.Down:
                    return -transform.up;
            }
            return Vector3.zero;
        }

        void DrawDebug()
        {
            //Направление поворота
            Vector3 vectorToTarget = transform.position 
                + 5f * new Vector3(-Mathf.Sin(_ship._targetAngle * Mathf.Deg2Rad), 
                    Mathf.Cos(_ship._targetAngle * Mathf.Deg2Rad), 0f);

            // Текущее направление
            Vector3 heading = transform.position + 4f * GetDiretion(_controller._spriteOrientation);

            //Угловое ускорение
            Vector3 torque = heading - transform.right * _ship._Torque;

            Debug.DrawLine(transform.position, vectorToTarget, Color.white);
            Debug.DrawLine(transform.position, heading, Color.green);
            Debug.DrawLine(heading, torque, Color.red);
        }

        void OnGUI()
        {
            float x0 = 10;
            float y0 = 100;

            float dx = 200;
            float dy = 40;

            float SliderKpMax = 1;
            float SliderKpMin = 0;
            float SliderKiMax = .5f;
            float SliderKiMin = -.5f;
            float SliderKdMax = .5f;
            float SliderKdMin = 0;

            int i = 0;
            foreach (SimplePID pid in _pids)
            {
                y0 += 2 * dy;

                GUI.Box(new Rect(25 + x0, 5 + y0, dx, dy), "");

                pid.Kp = GUI.HorizontalSlider(new Rect(25 + x0, 5 + y0, 200, 10), 
                    pid.Kp, 
                    SliderKpMin, 
                    SliderKpMax);
                pid.Ki = GUI.HorizontalSlider(new Rect(25 + x0, 20 + y0, 200, 10), 
                    pid.Ki, 
                    SliderKiMin, 
                    SliderKiMax);
                pid.Kd = GUI.HorizontalSlider(new Rect(25 + x0, 35 + y0, 200, 10), 
                    pid.Kd, 
                    SliderKdMin, 
                    SliderKdMax);

                GUIStyle style1 = new GUIStyle();
                style1.alignment = TextAnchor.MiddleRight;
                style1.fontStyle = FontStyle.Bold;
                style1.normal.textColor = Color.yellow;
                style1.fontSize = 9;

                GUI.Label(new Rect(0 + x0, 5 + y0, 20, 10), "Kp", style1);
                GUI.Label(new Rect(0 + x0, 20 + y0, 20, 10), "Ki", style1);
                GUI.Label(new Rect(0 + x0, 35 + y0, 20, 10), "Kd", style1);

                GUIStyle style2 = new GUIStyle();
                style2.alignment = TextAnchor.MiddleLeft;
                style2.fontStyle = FontStyle.Bold;
                style2.normal.textColor = Color.yellow;
                style2.fontSize = 9;

                GUI.TextField(new Rect(235 + x0, 5 + y0, 60, 10), pid.Kp.ToString(), style2);
                GUI.TextField(new Rect(235 + x0, 20 + y0, 60, 10), pid.Ki.ToString(), style2);
                GUI.TextField(new Rect(235 + x0, 35 + y0, 60, 10), pid.Kd.ToString(), style2);

                GUI.Label(new Rect(0 + x0, -8 + y0, 200, 10), _names[i++], style2);
            }
        }
    }
}

Класс Ship также претерпел необратимые мутации и теперь должен выглядеть вот так:

namespace Assets.Scripts.SpaceShooter.Bodies
{
    public class Ship : BaseBody
    {
        public GameObject _flame;

        public Vector2 _movement = new Vector2();
        public Vector2 _target = new Vector2();

        public float _targetAngle = 0f;
        public float _angle = 0f;

        public float _thrust = 1f;

        [Header("PID")]
        public SimplePID _angleController = new SimplePID(0.1f,0f,0.05f);
        public SimplePID _angularVelocityController = new SimplePID(0f,0f,0f);

        private float _torque = 0f;
        public float _Torque
        {
            get
            {
                return _torque;
            }
        }

        private Vector2 _force = new Vector2();
        public Vector2 _Force
        {
            get
            {
                return _force;
            }
        }

        public void FixedUpdate()
        {
            _torque = ControlRotate(_targetAngle, _thrust);
            _force = ControlForce(_movement, _thrust);

            _rb2d.AddTorque(_torque);
            _rb2d.AddRelativeForce(_force);
        }

        public float ControlRotate(float targetAngle, float thrust)
        {
            float CO = 0f;
            float MV = 0f;
            float dt = Time.fixedDeltaTime;

            _angle = _myTransform.eulerAngles.z;

            //Контроллер угла поворота
            float angleError = Mathf.DeltaAngle(_angle, targetAngle);
            float torqueCorrectionForAngle = 
                _angleController.Update(angleError, _angle, dt);

            //Контроллер стабилизации скорости
            float angularVelocityError = -_rb2d.angularVelocity;
            float torqueCorrectionForAngularVelocity = 
                _angularVelocityController.Update(angularVelocityError, -angularVelocityError, dt);

            //Суммарный выход контроллера
            CO = torqueCorrectionForAngle + torqueCorrectionForAngularVelocity;

            //Дискретизируем с шагом 100            
            CO = Mathf.Round(100f * CO) / 100f;

            //Сатурируем
            MV = CO;
            if (CO > thrust) MV = thrust;
            if (CO < -thrust) MV = -thrust;

            return MV;
        }

        public Vector2 ControlForce(Vector2 movement, float thrust)
        {
            Vector2 MV = new Vector2();

            if (movement != Vector2.zero)
            {
                if (_flame != null)
                {
                    _flame.SetActive(true);
                }
            }
            else
            {
                if (_flame != null)
                {
                    _flame.SetActive(false);
                }
            }

            MV = movement * thrust;

            return MV;
        }

        public void Update()
        {

        }        
    }
}

А вот, собственно заключительное видео того, что должно получиться:

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

Немного ссылок

  1. Годная статья на английской вики
  2. PID tutorial
  3. ПИД-регуляторы: вопросы реализации. Часть 1
  4. ПИД-регуляторы: вопросы реализации. Часть 2
  5. PID Without a PhD
  6. PID Without a PhD. Перевод
  7. Derivative Action and PID Control
  8. Control System Lab: PID
  9. ПИД-регулятор своими руками
  10. Корректная реализация разностной схемы ПИД регулятора
  11. Программируем квадрокоптер на Arduino (часть 1)
  12. Виртуальный квадрокоптер на Unity + OpenCV (Часть 1)
  13. Поляков К.Ю. Теория автоматического управления для чайников
  14. PID control system analysis, design, and technology
  15. Aidan O’Dwyer. Handbook of PI and PID Controller Tuning Rules (3rd ed.)
  16. PID process control, a “Cruise Control” example
  17. https://www.mathworks.com/discovery/pid-control.html
  18. http://scilab.ninja/study-modules/scilab-control-engineering-basics/module-4-pid-control/
  19. https://sourceforge.net/p/octave/control/ci/default/tree/inst/optiPID.m

Еще немного ссылок на другие примеры
http://luminaryapps.com/blog/use-a-pid-loop-to-control-unity-game-objects/
http://www.habrador.com/tutorials/pid-controller/3-stabilize-quadcopter/
https://www.gamedev.net/articles/programming/math-and-physics/pid-control-of-physics-bodies-r3885/
https://ksp-kos.github.io/KOS/tutorials/pidloops.html

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Хлеба и зрелищ


31.01%
Таки давайте попробуем прикрутить нейросеть к Unity3D
40


24.81%
Алгоритмы самонаведения ракет в Unity3D
32


19.38%
Так как же настраивать этот ПИД-регулятор? Желательно автоматически пока я ем зефирки с кофе
25


10.85%
Мы хотим больше всяких разных регуляторов, например, линейно-квадратичный
14


3.1%
МНК, градиентный спуск, квази-ньютоновские методы. Куда это можно впихнуть в Unity3D?
4


1.55%
Может в Unity3D найдется место для цифровой фильтрации?
2


3.1%
Изложение не достаточно формальное. Больше математики богу математики!
4


6.2%
Кинуть в автора куриным яйцом
8

Проголосовали 129 пользователей.

Воздержались 23 пользователя.

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

В данной статье приведены основные принципы и правила настройки коэффициентов ПИД-регулятора сточки зрения практического применения. Теоретические основы можно прочитать вот в этой статье.

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

Задача настройки

Настройка регулятора производится с одной единственной целью: подобрать его коэффициенты для данной задачи таким образом, чтобы регулятор поддерживал величину физического параметра на заданном уровне. В нашем примере физическая величина — это температура.

Допустим текущая температура в помещении 10 °С, а мы хотим, чтобы было 25°С. Мы включаем регулятор и он начинает управлять мощностью обогревателя таким образом, чтобы температура достигла требуемого уровня. Посмотрим как это может выглядеть.

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

Чёрным цветом показан график изменения температуры в том случае, если коэффициенты подобраны совсем плохо. Система теряет устойчивость. Регулятор при этом идёт «в разнос» и температура «уходит» от заданного значения.

Рассмотрим более благоприятные случаи.

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

А вот и приемлемые кривые:

регулирование пид-контуромДанные кривые тоже не идеальны, но могут быть сочтены за удовлетворительные.

В процессе настройки регулятора, пользователю необходимо стремиться получить кривую, близкую к идеальной. Однако, в реальных условиях сделать это не так-то просто — приходится долго и мучительно подбирать коэффициенты. Поэтому зачастую останавливаются на «приемлемой» кривой регулирования. Например, в нашем примере нас могли бы устроить коэффициенты регулятора, при которых заданная температура достигалась бы за 15-20 минут с максимальным перерегулированием (максимальными «скачками» температуры) 2 °С. А вот время достижение уставки более часа и максимальные «скачки» температуры 5 °С — нас бы не устроили.

Далее поговорим о том, как подобрать коэффициенты для достижения оптимального регулирования. Рекомендуется настраивать коэффициенты в том же порядке, в котором это описано.

Настраиваем пропорциональный коэффициент

Выставляем дифференциальный и интегральный коэффициенты в ноль, тем самым убирая соответствующие составляющие. Пропорциональный коэффициент выставляем в 1.

Далее нужно задать значение уставки температуры отличное от текущей и посмотреть, как регулятор будет менять мощность обогревателя, чтобы достичь заданного значения. Характер изменения можно отследить «визуально», если у вас получится мысленно представить этот график. Либо можно регистрировать в таблицу измеренное значение температуры каждые 5-10 секунд и по полученным значением построить график. Затем нужно проанализировать полученную зависимость в соответствии с рисунком:

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

Настраиваем дифференциальный коэффициент

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

Настройка дифферинциального коэффициента пид

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

Настраиваем интегральный коэффициент

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

статическая ошибка в пид-регулятора

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

Заключение

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



ПИ-регулятор

(изодромный
регулятор)

;

на
низких частотах преобладает интегрирующий
эффект (отсутствует статическая ошибка),а
на высоких частотах – эффект от

(качество переходного процесса лучше,
чем при И-законе регулирования).


– закон
регулирования.

  1. – отсутствие
    регулятора;


  2. П-регулятор;


  3. ПИ-регулятор.

Достоинства:

  1. Простота
    реализации;

  2. Существенно
    улучшает точность регулирования в
    статике:

• Установившаяся
ошибка при постоянном входном воздействии
равна нулю;

• Эта ошибка
нечувствительна к изменениям параметров
объекта.

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

Реализация
ПИ-регулятора

ПИД-регулятор

На
низких частотах преобладает интегрирующий
эффект, а на высоких – дифференцирующий.

.


– закон
регулирования.

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

Достоинства:

  1. Высокая
    статическая точность;

  2. Высокое
    быстродействие;

  3. Большой
    запас устойчивости.

Недостатки:

  1. Применимы
    для систем, описываемых

дифференциальными
уравнениями невысокого

порядка,
когда объект имеет один или два полюса,

или
может быть аппроксимирован моделью
второго

порядка.

  1. Требования
    к качеству управления низкие.

Реализация ПИД-регулятора

где
,

,

,

,
причем
.

По
ЛАЧХ операционного усилителя определяем
.
Тогда передаточная функция реального
регулятора имеет вид
.

В
системах чаще всего применяется
ПИД-регулятор.

Расчёт систем
комбинированного управления

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

Принцип инвариантности
– принцип компенсации динамической и
статической ошибок независимо от формы
входного воздействия по каналу управления
или компенсации возмущающего воздействия.

  1. Расчет
    компенсирующих устройств по каналу
    возмущения

Пусть
структурная схема исходной системы
преобразована к виду, изображенному на
рис.1.

Перенесем
на вход системы точку приложения
возмущения (рис. 2).

Запишем
уравнение для выходной координаты:
.

Влияние
на выходную функцию со стороны возмущения
f
будет отсутствовать, если выполняется
условие абсолютной
инвариантности

системы к возмущающему воздействию:


условие полной компенсации возмущения.

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

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

Тогда

,

,

,

,

.

Графики
на рис. 3.

1/Тp

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


1/Т0

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

в ограниченном диапазоне частот (
на рис. 3).

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

2.
Расчет
систем с компенсацией динамической
ошибки по каналу управления

y1

y1+u-y

Для этой системы,
структурная схема которой изображена
на рис. 4, справедливы следующие
соотношения:

;

=
– передаточная функция по сигналу
ошибки.

Можем
добиться условия полной компенсации
ошибки, если выбрать компенсирующую
цепь с параметрами:

(1)
– условие абсолютной инвариантности
системы к ошибке по каналу управления.

Передаточная
функция системы с компенсирующей цепью
.

В
этом случае
,

.

Следящие
системы реализуются астатическими.
Рассмотрим пример для таких систем
(рис.5).

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

Астатические

системы характеризуются

добротностью

– передаточный

коэффициент
k
определяется при =1
и =k.

Если
k=10,
то ошибка в 10%, так как

,
система низкого качества (рис.6).

Введем
компенсирующую цепь с передаточной
функцией

.
Такой цепью может служить тахогенератор,
если

вход
механический. Реализация системы с
малой добротностью

проста.

Пусть
,
из условия (1) получим
.

Тогда,
имея систему с астатизмом 1-го порядка,
получим систему с

астатизмом
второго порядка (рис.7).

Всегда
Y
отстает от управляющего сигнала; введя
,
уменьшаем ошибку. Компенсирующая цепь
не влияет на устойчивость.

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

,

.

Соседние файлы в папке Lekcii

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

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

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

Начнем с того, что с настройкой ПИД регулятора можно столкнуться где угодно, например, на преобразователе частоты, и хорошо, если это будет регулятор давления, они настраиваются достаточно просто, если не считать особенностей настройки ПИД, чтобы ПЧ гарантировано «уходил в сон», то есть если отсутствует расход воды, частоник может снизить обороты до указанных минимальных, а дальше просто остановить двигатель и ждать, когда ошибка регулирования не превысит какую-то тоже настроенную величину. В термоконтроллерах чаще всего есть автонастройка, но не всегда она дает приемлемые показатели работы. На сервоприводах контур положения часто тоже имеет ПИ регулятор, он хоть и представляет из себя только часть от ПИД-регулятора, но общие принципы настройки тоже присутствуют, тк имеются основные канал пропорциональный и интегральный.
А что если регулятор не имеет автонастройки и регулируемый объект достаточно сложен, например, чтобы вывести в автонастройку агрегат мощностью 100кВт требуется ее прогрев и работа, а это может составить десятки минут (а иногда и часы, а время- деньги, особенно если это время работы энергоемкого прибора) не говоря уже о себестоимости материала. Тут стоит для начала разобраться в особенностях самого ПИД, чтобы подобрать во-первых подходящий метод, а во-вторых, понять где и как стоит добиваться устойчивости в первую очередь, а где и как можно и потом делать тонкую настройку.

structure

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

  1. Пропорциональный канал выдает величину выходного сигнала, который рассчитывается как ошибка (разница, рассогласование) e(t) сигнала обратной связи (ОС) и сигнала задания r, умноженная на коэффициент Kp, который опять же может быть выражен и как 1/Tp — постоянная времени пропорционального канала регулятора. Если убрать (обнулив коэффициенты) остальные составляющий ПИД-регулятора, то результат такого регулятора будет иметь статическую ошибку, тк пропорциональный канал может только компенсировать часть рассогласования. Дальнейшее увеличение значение коэффициента в попытках увеличить эффективность, приведет к перерегулированию (превышению величины над уставкой, иногда многократному и повторяющемуся, в худшем случае в виде автоколебаний) при появлении большого рассогласования (например пуск или резкое изменение параметра). Данный канал отвечает за быстродействие регулятора в целом и наибольшую часть работы (компенсация большей части рассогласования).
  2. Интегральный канал в общем тоже берет за основу ошибку регулирования, но при этом выход интегрирует эту ошибку, умноженную на коэффициент Ki (1/Ti). Это дает возможность компенсации статической ошибки, если система не испытывает внешних возмущений (со временем конечно, если процесс не устойчивый, это событие может и не наступить), но не избавляет от динамической. Попытки уменьшить динамическую ошибку или как-то уменьшить время, за которое регулятор компенсирует ошибку, приведут к тому, что тоже появится перерегулирование и почти гарантировано автоколебания (ну как минимум несколько затухающих даже на фоне отсутствия перерегулирования в целом, если пропорциональный канал имеет слабое значение).
  3. Дифференциальный канал подает на выход скорость изменения ошибки de/dt, умноженную на коэффициент Kd (1/Td), что дает возможность как бы предугадать описанное выше резкое изменение рассогласования (пуск или резкое изменение параметра) и тем самым помочь своим более медленным братьям компенсировать величину ошибки. В дальнейшем, когда вступят в дело каналы пропорциональный и интегральный, роль дифференциального канала должна затухать. Конечно отыграют и электрические составляющие, и задержка расчета, и механика с инерцией, которая часто является самой долгой в перечне задержек, но что-то все же можно получить и от этого канала. Дифференциальный канал чувствителен к ВЧ-помехам. Поэтому, при построении системы регулирования, необходимо принять меры для защиты от помех. Кстати в теории дифференциальный канал может уменьшить значение перерегулирования, полученного при настройки пропорционального и интегрального канала за счет более быстрого уменьшения ошибки регулирования до вмешательства других каналов.

Итак теперь перейдем непосредственно к методам настройки

Ручная настройка или метод настройки «по графикам».

Часто можно услышать о простейшем подходе к настройке (сейчас говорим о ручной), когда вручную настраивают сперва Kp, предварительно обнулив остальные каналы, потом Ki, а последним Kd, оценивая результат работы чисто по графикам процессе (так называемый эмпирический и эвристический методы), либо пользуясь ТАУ (нахождение частоты устойчивости и отступ от нее на 2-4 лога), такая инструкция встречается практически для всех ПЧ и даже сервоприводов, возможно это оправдано тем, что процесс быстрый и графики можно получить без особых затрат просто перебирая коэффициенты по логарифмической шкале, но для температуры так будет настраивать неудобно. Да-да если коэффициент равный двум слишком мал, а введение в коэффициент цифры 4 не дало необходимого изменения, нет смысла вводить K=6, нужно вводить 8, а потом 16, смысл в том, что мы тем самым ищем нужную нам частоту среза, а она как многие помнят из ТАУ у нас на логарифмической шкале выложена, и если она далеко, то перебор по обычной шкале сильно удлинит время поиска.

Важное замечание: даже для одного и того же объекта процедуру настройки ПИД регулятора следует повторять, если изменились параметры объекта (например, загрузка печи) или значительно изменилась рабочая температура (остывание и соответственно отток мощности зависит от градиента температур).

visual settings
Второй вариант больше подходит для долгих процессов (температура) — предварительно нужно вывести систему на границу устойчивости. Для этого нужно вывести регуляторы И и Д (записать нули), оставив только П (пропорциональный), устойчивость необходимо проверять на той температуре, которая близка к рабочей, то есть эксперименты с большим Кр нужно проводить уже после выхода на установившийся процесс, до этого лучше постараться выбрать коэффициент поменьше, либо уменьшить его уже когда перескочили уставку. На установившемся процессе добиваемся увеличением Кп коэффициента появления заметных колебаний, либо если колебания уже есть, то уменьшаем Кр до их исчезновения, полученный коэффициент Кркр запомним. Что делать с полученной частотой среза (частота, на которой настройка теряет устойчивость)? Переведем ее в период колебаний τ (хотя можно сразу измерить именно период колебаний τ). Далее для термоконтроллеров Термодат предлагает следующую таблицу.

Тип регулирования Пропорциональный
коэффициент Kp
Интегральный
коэффициент Ki
Дифференциальный
коэффициент Kd
Только P 2*Кркр Выключено Выключено
P+I 2.2*Кркр 0.8* τ Выключено
P+I+D 1.7*Кркр 0.5*τ 0.12*τ

Для других применений думаю лучше пользоваться методом «по графикам» для ручной настройки.

PID Compensation Animated

Тангенциальный метод настройки ПИД-регулятора (первый метод Зиглера-Никольса).

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

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

В режиме ручного управления контроллера задается некоторое значение мощности на нагрузке. Значение мощности должно быть таким, чтобы установившаяся температура не превысила допустимого значения. Нужно дождаться установления температуры Т1, в этом режиме и в некоторый момент времени скачком изменить значение мощности (например: на 5%). Записать процесс изменения температуры (на компьютере, на самописце или по точкам, вручную) до установления нового устоявшегося значения температуры Т2.

tangence PID

Провести касательную к полученной кривой в точке, где наклон касательной будет максимален.
Определить «мёртвое» время процесса как промежуток времени, прошедший с момента изменения мощности до момента времени, определяемого точкой пересечения касательной и средней линии температуры первого устойчивого состояния Т1 (до изменения мощности нагрева).
Определить величину относительного наклона касательной по формуле:
К = (∆T/∆t)/∆N.
∆T — изменение температуры в °С,
∆t — соответствующее изменение времени в секундах,
∆N — изменение мощности в %.

Установите значения коэффициентов Kp, Ki, Kd в соответствии с таблицей.

Тип регулирования Пропорциональный
коэффициент Kp
Интегральный
коэффициент Ki
Дифференциальный
коэффициент Kd
Только P 100*τм*К Выключено Выключено
P+I 111*τм*К 3.3*τм Выключено
P+I+D 83*τм*К 2*τм 0.25*τм

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

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

Ciglera Nikolsa tangence1

В первом случае ищется пересечение с осью времени и с мнимой линией максимального задания, значения параметров L и T, используются в расчете, формулы приведены в таблице:

Тип регулирования Пропорциональный
коэффициент Kp
Интегральный
коэффициент Ti=Kp/Ki
Дифференциальный
коэффициент Td=Kd/Kp
Только P T/L Выключено Выключено
P+I 0.9*T/L L/0.3 Выключено
P+I+D 1.2*T/L 2*L 0.5*L

Второй вариант использует: a и L, которые определяются по графику переходной характеристике объекта управления так:

Ciglera Nikolsa tangence2

Формулы для расчета коэффициентов сведены в следующую таблицу:

Тип регулирования Пропорциональный
коэффициент Kp
Интегральный
коэффициент Ti
Дифференциальный
коэффициент Td
Только P 1/a Выключено Выключено
P+I 0,9/a 3*L/Kp Выключено
P+I+D 1,2/a 0,9*L/Kp 0.5*L/Kp

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

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

Метод колебаний (или второй частотный метод Зиглера-Никольса)

Данный метод основан на поиске частоты устойчивости, на которой сдвиг по фазе в разомкнутом контуре равен 180°.

Назначить уставку Тус, равной температуре регулирования (или 0.7Тус, если перегрев во время настройки нежелателен, а он может быть значительным).

Тоже существует два варианта, первый упрощенный от Термодата:

Включить позиционный (пороговый) режим регулирования.

В установившемся режиме колебаний температуры измерить период τ колебаний температуры (время между соседними максимальными или минимальными значениями температуры). Измерить также полный размах колебаний температуры ΔТ=Тmax-Тmin (разность максимального и минимального значений температуры).

metod kolebaniy
Установите значения коэффициентов Kp, Ki, Kd в соответствии с таблицей. Параметр «Ограничение ПИД» или «Зона» (если он есть в приборе) сделать равным Kp.

Тип регулирования Пропорциональный
коэффициент Kp
Интегральный
коэффициент Ki
Дифференциальный
коэффициент Kd
Только P 1.4*∆Т Выключено Выключено
P+I 1.6*∆Т 2.4*τ Выключено
P+I+D 1.2*∆Т 1.5*τ 0.2*τ

Второй вариант такой:
Настройка пропорциональной компоненты (Kp)
1.Перед настройкой зоны пропорциональности интегральная и дифференциальная компоненты отключаются (Kи =0, Kд = 0) и задаем некоторое целевое значение регулируемого параметра (например, температуры):
metod Ciglera Nikolsa

Тο — начальная температура в системе;
Тsp — заданная температура (уставка);
∆T — размах колебаний температуры (в расчетах не участвует);
∆t — период колебаний температуры.
2.Меняем значение пропорциональной составляющей Kp от минимума (можно от 0) до момента, пока не появятся устойчивые колебания системы с периодом ∆t. Фиксируем это значение как Kуст, а также период колебаний системы ∆t. Система должна находится в постоянном колебательном процессе, притом колебательный процесс незатухающий, колебания должны быть одинаковы относительно Тsp.
После получения данной кривой на нашем объекте, засекаем время периода колебаний ∆t – полный период. Данное время есть характеристика системы, оборудования.
3.На этом практическая часть метода заканчивается. Из полученных значений рассчитываем коэффициенты ПИД:
Kp=0.6⋅Kуст
Ki=(2⋅Kp)/∆t
Kd=(Kp⋅∆t)/8
Здесь Kуст – тот самый коэффициент пропорциональной составляющей, при котором возникли колебания, а ∆t – период этих колебаний.

Второй вариант, когда надо найти постоянные времени Ti и Td

Используя полученные параметры рассчитываем Ти и Тд по таблице.

  Пропорциональный
коэффициент Kp
Интегральный
коэффициент Ti
Дифференциальный
коэффициент Td
П-регулятор 0.5*Kуст    
ПИ-регулятор 0.4*Kуст 0.8*∆t/Kp  
ПИД-регулятор 0.6*Kуст 0.5*∆t/Kp 0.125*∆t/Kp

Хочется сказать, что данный метод не несет за собой никаких улучшений, просто он построен на другом способе поиска, недостатки те же, что и у метода Зиглера-Никольса первого.

Метод CHR (Chien, Hrones и Reswick) или Чина-Хронеса-Ресвика, если по-русски

Этот метод предполагает предварительное определение времени задержки L и времени выравнивания T по переходной характеристике объекта. Ну это мы делали и для Зиглера-Никольса, но в отличие от Зиглера и Никольса, которые использовали в качестве критерия качества настройки декремент затухания, равный 4, Chien, Hrones и Reswick (CHR) использовали критерий максимальной скорости нарастания при отсутствии перерегулирования или при наличии не более чем 20 процентного перерегулирования. Такой критерий позволяет получить больший запас устойчивости, чем в методе Зиглера-Никольса. Метод CHR даёт две разные системы параметров регулятора. Одна из них получена при наблюдении отклика на изменение уставки (таблица), вторая – при наблюдении отклика на внешние возмущения (не представлена). Какую систему параметров выбирать, зависит от того, что важнее для конкретного регулятора: качество регулирования при изменении уставки или ослабление внешних воздействий (в жизни изменение уставки вызывает намного более существенные процессы в регулятора, потому лучше настраивать по этой таблице, будет настройка не «в малом», а «в большом»). Если же важно и то и другое, то необходимо использовать регуляторы с двумя степенями свободы. Метод CHR использует аппроксимацию объекта моделью первого порядка с задержкой. В CHR используются те же исходные параметры a и L, что и в методе Зиглера-Никольса. Обратим внимание, что пропорциональный коэффициент в методе CHR меньше, чем в методе Зиглера-Никольса.

Формулы для определения коэффициентов приведены в таблице:

      Без перерегулирования    С 20% перерегулированием
Пропорциональный
коэффициент Kp
Интегральный
коэффициент Ti
Дифференциальный
коэффициент Td
Пропорциональный
коэффициент Kp
Интегральный
коэффициент Ti
Дифференциальный
коэффициент Td
П-регулятор 0.3/a      0.7/a    
ПИ-регулятор 0.35/a 1.2*L/Kp    0.6/a  L/Kp  
ПИД-регулятор 0.6/a L/Kp 0.5*L/Kp 0.95/a   1.4*L/Kp  0.47*L/Kp

Остальные методы, а именно Спектральный метод, метод Куна, метод Стогестада, метод Шеделя требуют уже больших знаний ТАУ и самое главное требуют либо реальной переходной характеристики, которую придется искать методом интерполяции и аппроксимации, либо вовсе моделирования объекта управления. Если вкратце, то суть методов можно описать парой предложений.

Спектральный метод

Спектральный метод предполагает компенсацию нулями регулятора нежелательных полюсов объекта.

На основе полюсов объекта {p1, p2} определяются компенсирующие значения постоянных времени интегрального и дифференцирующего каналов:
Tи = |1/p1|, Tд = |1/p2|.

и коэффициенты регулятора Kp и Kd в виде:
Kp = Ki(Tи + Tд), Kd = Ki*Tи*Tд/(Tи + Tд).

Метод Куна

Параметром, характеризующим быстродействие любых рассматриваемых объектов, является суммарная постоянная времени. Метод настройки Куна (или метод «Т-правило») основан на аппроксимации объекта звеном третьего порядка. Параметры ПИД-регулятора Ti и Td выбирают, таким образом, чтобы компенсировать два полюса. Расчетные значения для регулятора даны в таблице, но я здесь ее приводить не стану.

Метод Стогестада

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

Для апериодического звена второго порядка с транспортным запаздыванием параметры ПИД-регулятора могут быть найдены по следующим формулам:
kp = T1/k*(Tc+τ), Ti=min[T1;c(Tc+τ)],Td=T2.
где T1, T2, k и τ–параметры объекта; с–параметр, который рекомендуют принимать равным 4, для обеспечения апериодического вида переходного процесса на выходе системы управления (например пароперегревателем котла).

Метод Шеделя

Метод Шеделя основан на принципе каскадного коэффициента демпфирования. В методе обобщается понятие коэффициента демпфирования на случай системы 3-го порядка. Параметры ПИД-регулятора должны быть выбраны таким образом, чтобы коэффициенты демпфирования системы принимали определенные значения. Их если будет интересно лучше поискать в справочниках.

Общие сведения

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

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

Математическое выражение ПИД-регулятора

где:

   Xp — полоса пропорциональности

   Ei = (SP-PV) = (уставка-тек) = ошибка (рассогласование)

   Тд — постоянная времени дифференцирования

   ∆Ei — разность ошибок соседних измерений (Ei — Ei-1)

   ∆tизм — время между соседними измерениями (ti — t i-1)

   Ти — постоянная времени интегрирования

— Накопленная к i-ому шагу сумма рассогласований (интегральная сумма)

   Легко заметить, что сигнал управления является суммой трех составляющих: пропорциональной (слагаемое 1), дифференциальной (слагаемое 2), и интегральной (слагаемое 3).

   Пропорциональная составляющая зависит от текущей ошибки Ei и компенсирует текущую ошибку пропорционально ее величине.

   Дифференциальная составляющая зависит от скорости изменения ошибки ∆Ei / ∆tизм и компенсирует резкие возмущения.

   Интегральная составляющая накапливает ошибку регулирования, что позволяет ПИД-регулятору поддерживать нулевую ошибку в установившемся режиме (устраняет статическую ошибку управления).

   Обычно ПИД-регулятор имеет дополнительные параметры помимо трех коэффициентов (Xp, Ти, Тд). Рассмотрим их более подробно на примере скриншота меню параметров ПИД-регулятора прибора “Параграф PL20”.

Рис. 1

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

    Источником обратной связи с объекта управления (текущая контролируемая величина) может быть любой измерительный канал прибора, поэтому необходимо выбрать желаемый измерительный канал в графе ВЛАДЕЛЕЦ.

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

    Уставка (SP) – это желаемая величина, на которую регулятор должен выйти в установившемся режиме.

    Xp – зона пропорциональности. Задается в единицах контролируемой величины (для терморегулятора в градусах). Зона пропорциональности называется так, потому что только в ней ((SP — Xp)…(SP + Xp)) пропорциональная составляющая ПИД-регулятора может формировать мощность выходного сигнала управления пропорционально ошибке. А за ее пределами мощность будет равна либо 0%, либо 100%. Таким образом, чем уже эта зона, тем быстрее отклик регулятора, но слишком высокое быстродействие может ввести систему в автоколебательный режим.

    Ти – постоянная времени интегрирования.

    Тд – постоянная времени дифференцирования.

    Текущая мощность – это информационный параметр.

    Минимальная и максимальная мощность определяют границы мощности выхода ПИД-регулятора.

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

   Последним параметром идет период ШИМ. Этот параметр один для всех ПИД-регуляторов, т.к. каналы ШИМ  синхронизированы между собой от одного таймера. ШИМ сигнал позволяет регулировать мощность посредством  регулировки скважности сигнала (регулируется ширина импульса при постоянной частоте модуляции). Разрядность ШИМ (число позиций мощности) равна 8192 дискреты (13 бит). Период ШИМ (от 1 мс до 250 сек). Этот параметр зависит от типа и коммутационных способностей силовых исполнительных ключей (м.б. реле, пускатель, твердотельное реле, симистор). Чем выше частота коммутации (чем меньше период) тем больше тепловые потери в ключах (квадратичная зависимость потерь от частоты) и больше износ механических коммутаторов, но лучше качество регулирования. Важно найти золотую середину.

Настройка пропорциональной компоненты (Xp)

   Перед настройкой зоны пропорциональности интегральная и дифференциальная компоненты отключаются, постоянная интегрирования устанавливается максимально возможной (Ти = макс), а постоянная дифференцирования минимально возможной (Тд = 0). Устанавливается безопасная величина уставки, равная (0,7…0,9)×SP, где SP – это реальная уставка настраиваемой системы. Зона пропорциональности устанавливается минимально возможной (Xp = 0).

   В этом случае регулятор выполняет функции двухпозиционного релейного регулятора с гистерезисом равным нулю. Регистрируется переходная характеристика.

Рис. 2

    Т0 — начальная температура в системе;

    ТSP — заданная температура (уставка);

    ∆T — размах колебаний температуры;

    ∆t — период колебаний температуры.

    Установить зону пропорциональности равной размаху колебаний температуры: Xp = ∆T. Это значение служит

первым приближением для зоны пропорциональности.

   Следует проанализировать переходную характеристики еще раз и при необходимости скорректировать значение зоны пропорциональности. Возможные варианты переходных характеристик показаны на рис. 3.

Рис. 3

   Переходная характеристика типа 1: Значение зоны пропорциональности очень мало, переходная характеристика далека от оптимальной. Зону пропорциональности следует значительно увеличить.

   Переходная характеристика типа 2: В переходной характеристике наблюдаются затухающие колебания (5 — 6 периодов).     Если в дальнейшем предполагается использовать и дифференциальную компоненту ПИД-регулятора, то выбранное значение зоны пропорциональности является оптимальным. Для этого случая настройка зоны пропорциональности считается законченной.

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

   Переходная характеристика типа 3: В переходной характеристике наблюдаются небольшой выброс (перерегулирование) и быстро затухающие колебания (1 — 2 периода). Этот тип переходной характеристики обеспечивает хорошее быстродействие и быстрый выход на заданную температуру. В большинстве случаев его можно считать оптимальным, если в системе допускаются выбросы (перегревы) при переходе с одной температуры на другую.

   Выбросы устраняются дополнительным увеличением зоны пропорциональности так, чтобы получилась переходная  характеристика типа 4.

   Переходная характеристика типа 4: Температура плавно подходит к установившемуся значению без выбросов и колебаний. Эта тип переходной характеристики также можно считать оптимальным, однако быстродействие регулятора несколько снижено.

   Переходная характеристика типа 5: Сильно затянутый подход к установившемуся значению говорит о том, что зона пропорциональности чрезмерно велика. Динамическая и статическая точность регулирования здесь мала.

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

Настройка дифференциальной компоненты (Tд)

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

   На предыдущем этапе была задана зона пропорциональности, соответствующая переходной характеристике типа 2, в которой присутствуют затухающие колебания (см. рис. 3, кривая 2, рис. 4, кривая 1.).

Рис. 4

   Следует установить постоянную времени дифференцирования Тд так, чтобы переходная характеристика имела вид кривой 2 на рис. 4. В качестве первого приближения постоянная времени дифференцирования делается равной Тд = 0,2×∆t.

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

  Настройка интегральной компоненты (Ти )

   После настройки пропорциональной компоненты (а при необходимости и дифференциальной компоненты) получается переходная характеристика, показанная на следующем рисунке, кривая 1.

Рис. 5

   Интегральная компонента предназначена для того, чтобы убрать остаточное рассогласование между установившимся в системе значением температуры и уставкой. Начинать настраивать постоянную времени интегрирования следует с величины Ти = ∆t.

   Переходная характеристика типа 2: Получается при чрезмерно большой величине постоянной времени интегрирования. Выход на уставку получается очень затянутым.

   Переходная характеристика типа 4: Получается при слишком малой величине постоянной времени интегрирования. Если постоянную времени интегрирования уменьшить еще, то в системе могут возникнуть колебания.

   Переходная характеристика типа 3: Оптимальная.

Использованные источники информации

  • Сабинин Ю.А. Ковчин С.А. “Теория электропривода”
  • Шрейнер Р. Т. “Системы подчиненного регулирования электроприводов”
  • Олссон, Пиани “Цифровые системы автоматизации и управления”
  • Материалы сайта www.asu-tp.org

Методика настройки цифрового ПИД-регулятора

Общие сведения

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

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

Математическое выражение цифрового ПИД-регулятора

где:

    Xp — полоса пропорциональности

    Ei = (SP-PV) = (уставка-тек) = ошибка (рассогласование)

    Тд — постоянная времени дифференцирования

    ∆Ei — разность ошибок соседних измерений (Ei — Ei-1)

    ∆tизм — время между соседними измерениями (ti — t i-1)

    Ти — постоянная времени интегрирования

    — Накопленная к i-ому шагу сумма рассогласований (интегральная сумма)

    Легко заметить, что сигнал управления является суммой трех составляющих: пропорциональной (слагаемое 1), дифференциальной (слагаемое 2), и интегральной (слагаемое 3).

    Пропорциональная составляющая зависит от текущей ошибки Ei и компенсирует текущую ошибку пропорционально ее величине.

    Дифференциальная составляющая зависит от скорости изменения ошибки ∆Ei / ∆tизм и компенсирует резкие возмущения.

    Интегральная составляющая накапливает ошибку регулирования, что позволяет ПИД-регулятору поддерживать нулевую ошибку в установившемся режиме (устраняет статическую ошибку управления).

    Обычно ПИД-регулятор имеет дополнительные параметры помимо трех коэффициентов (Xp, Ти, Тд). Рассмотрим их более подробно на примере скриншота меню параметров ПИД-регулятора прибора “ПАРАГРАФ PL20”.

Рис. 1

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

    Источником обратной связи с объекта управления (текущая контролируемая величина) может быть любой измерительный канал прибора, поэтому необходимо выбрать желаемый измерительный канал в графе ВЛАДЕЛЕЦ.

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

    Уставка (SP) – это желаемая величина, на которую регулятор должен выйти в установившемся режиме.

    Xp – зона пропорциональности. Задается в единицах контролируемой величины (для терморегулятора в градусах). Зона пропорциональности называется так, потому что только в ней ((SP — Xp)…(SP + Xp)) пропорциональная составляющая ПИД-регулятора может формировать мощность выходного сигнала управления пропорционально ошибке. А за ее пределами мощность будет равна либо 0%, либо 100%. Таким образом, чем уже эта зона, тем быстрее отклик регулятора, но слишком высокое быстродействие может ввести систему в автоколебательный режим.

    Ти – постоянная времени интегрирования.

    Тд – постоянная времени дифференцирования.

    Текущая мощность – это информационный параметр.

    Минимальная и максимальная мощность определяют границы мощности выхода ПИД-регулятора.

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

    Последним параметром идет период ШИМ. Этот параметр один для всех ПИД-регуляторов, т.к. каналы ШИМ синхронизированы между собой от одного таймера. ШИМ сигнал позволяет регулировать мощность посредством регулировки скважности сигнала (регулируется ширина импульса при постоянной частоте модуляции). Разрядность ШИМ (число позиций мощности) равна 8192 дискреты (13 бит). Период ШИМ (от 1 мс до 250 сек). Этот параметр зависит от типа и коммутационных способностей силовых исполнительных ключей (м.б. реле, пускатель, твердотельное реле, симистор). Чем выше частота коммутации (чем меньше период) тем больше тепловые потери в ключах (квадратичная зависимость потерь от частоты) и больше износ механических коммутаторов, но лучше качество регулирования. Важно найти золотую середину.

Настройка пропорциональной компоненты (Xp)

   Перед настройкой зоны пропорциональности интегральная и дифференциальная компоненты отключаются, постоянная интегрирования устанавливается максимально возможной (Ти = макс), а постоянная дифференцирования минимально возможной (Тд = 0). Устанавливается безопасная величина уставки, равная (0,7…0,9)×SP, где SP – это реальная уставка настраиваемой системы. Зона пропорциональности устанавливается минимально возможной (Xp = 0).

   В этом случае регулятор выполняет функции двухпозиционного релейного регулятора с гистерезисом равным нулю. Регистрируется переходная характеристика.

Рис. 2

    Тο — начальная температура в системе;

    Тsp — заданная температура (уставка);

    ∆T — размах колебаний температуры;

    ∆t — период колебаний температуры.

    Установить зону пропорциональности равной размаху колебаний температуры: Xp = ∆T. Это значение служит

первым приближением для зоны пропорциональности.

    Следует проанализировать переходную характеристики еще раз и при необходимости скорректировать значение зоны пропорциональности. Возможные варианты переходных характеристик показаны на рис. 3.

Рис. 3

    Переходная характеристика типа 1: Значение зоны пропорциональности очень мало, переходная характеристика далека от оптимальной. Зону пропорциональности следует значительно увеличить.

    Переходная характеристика типа 2: В переходной характеристике наблюдаются затухающие колебания (5 — 6 периодов). Если в дальнейшем предполагается использовать и дифференциальную компоненту ПИД-регулятора, то выбранное значение зоны пропорциональности является оптимальным. Для этого случая настройка зоны пропорциональности считается законченной.

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

    Переходная характеристика типа 3: В переходной характеристике наблюдаются небольшой выброс (перерегулирование) и быстро затухающие колебания (1 — 2 периода). Этот тип переходной характеристики обеспечивает хорошее быстродействие и быстрый выход на заданную температуру. В большинстве случаев его можно считать оптимальным, если в системе допускаются выбросы (перегревы) при переходе с одной температуры на другую.

    Выбросы устраняются дополнительным увеличением зоны пропорциональности так, чтобы получилась переходная характеристика типа 4.

    Переходная характеристика типа 4: Температура плавно подходит к установившемуся значению без выбросов и колебаний. Этот тип переходной характеристики также можно считать оптимальным, однако быстродействие регулятора несколько снижено.

    Переходная характеристика типа 5: Сильно затянутый подход к установившемуся значению говорит о том, что зона пропорциональности чрезмерно велика. Динамическая и статическая точность регулирования здесь мала.

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

Настройка дифференциальной компоненты (Tд)

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

    На предыдущем этапе была задана зона пропорциональности, соответствующая переходной характеристике типа 2, в которой присутствуют затухающие колебания (см. рис. 3, кривая 2, рис. 4, кривая 1.).

Рис. 4

   Следует установить постоянную времени дифференцирования Тд так, чтобы переходная характеристика имела вид кривой 2 на рис. 4. В качестве первого приближения постоянная времени дифференцирования делается равной Тд = 0,2×∆t.

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

Настройка интегральной компоненты (Ти )

    После настройки пропорциональной компоненты (а при необходимости и дифференциальной компоненты) получается переходная характеристика, показанная на следующем рисунке, кривая 1.

Рис. 5

    Интегральная компонента предназначена для того, чтобы убрать остаточное рассогласование между установившимся в системе значением температуры и уставкой. Начинать настраивать постоянную времени интегрирования следует с величины Ти = ∆t.

    Переходная характеристика типа 2: Получается при чрезмерно большой величине постоянной времени интегрирования. Выход на уставку получается очень затянутым.

    Переходная характеристика типа 4: Получается при слишком малой величине постоянной времени интегрирования. Если постоянную времени интегрирования уменьшить еще, то в системе могут возникнуть колебания.

    Переходная характеристика типа 3: Оптимальная.

Использованные источники информации

  • Сабинин Ю.А. Ковчин С.А. “Теория электропривода”
  • Шрейнер Р. Т. “Системы подчиненного регулирования электроприводов”
  • Олссон, Пиани “Цифровые системы автоматизации и управления”
  • Материалы сайта www.asu-tp.org

ООО «Автоматика» © 2012

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

В данной статье приведены основные принципы и правила настройки коэффициентов ПИД-регулятора сточки зрения практического применения. Теоретические основы можно прочитать вот в этой статье.

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

Задача настройки

Настройка регулятора производится с одной единственной целью: подобрать его коэффициенты для данной задачи таким образом, чтобы регулятор поддерживал величину физического параметра на заданном уровне. В нашем примере физическая величина — это температура.

Допустим текущая температура в помещении 10 °С, а мы хотим, чтобы было 25°С. Мы включаем регулятор и он начинает управлять мощностью обогревателя таким образом, чтобы температура достигла требуемого уровня. Посмотрим как это может выглядеть.

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

Чёрным цветом показан график изменения температуры в том случае, если коэффициенты подобраны совсем плохо. Система теряет устойчивость. Регулятор при этом идёт «в разнос» и температура «уходит» от заданного значения.

Рассмотрим более благоприятные случаи.

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

А вот и приемлемые кривые:

регулирование пид-контуромДанные кривые тоже не идеальны, но могут быть сочтены за удовлетворительные.

В процессе настройки регулятора, пользователю необходимо стремиться получить кривую, близкую к идеальной. Однако, в реальных условиях сделать это не так-то просто — приходится долго и мучительно подбирать коэффициенты. Поэтому зачастую останавливаются на «приемлемой» кривой регулирования. Например, в нашем примере нас могли бы устроить коэффициенты регулятора, при которых заданная температура достигалась бы за 15-20 минут с максимальным перерегулированием (максимальными «скачками» температуры) 2 °С. А вот время достижение уставки более часа и максимальные «скачки» температуры 5 °С — нас бы не устроили.

Далее поговорим о том, как подобрать коэффициенты для достижения оптимального регулирования. Рекомендуется настраивать коэффициенты в том же порядке, в котором это описано.

Настраиваем пропорциональный коэффициент

Выставляем дифференциальный и интегральный коэффициенты в ноль, тем самым убирая соответствующие составляющие. Пропорциональный коэффициент выставляем в 1.

Далее нужно задать значение уставки температуры отличное от текущей и посмотреть, как регулятор будет менять мощность обогревателя, чтобы достичь заданного значения. Характер изменения можно отследить «визуально», если у вас получится мысленно представить этот график. Либо можно регистрировать в таблицу измеренное значение температуры каждые 5-10 секунд и по полученным значением построить график. Затем нужно проанализировать полученную зависимость в соответствии с рисунком:

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

Настраиваем дифференциальный коэффициент

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

Настройка дифферинциального коэффициента пид

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

Настраиваем интегральный коэффициент

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

статическая ошибка в пид-регулятора

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

Заключение

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



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

Простейшая система автоматического регулирования с обратной связью показана на рисунке. В ней блок R называют регулятором (от слова Regulator), P — объектом регулирования (от слова Process), r — управляющим воздействием или уставкой (reference), e — сигналом рассогласования или ошибки (error), u — выходной величиной регулятора, y — регулируемой величиной.

Частный случай ПИД-регулятора — пропорциональный или П-регулятор: u(t)=K·e(t). С помощью П-регулятора можно управлять любым устойчивым объектом, однако он дает относительно медленные переходные процессы и ненулевую статическую ошибку (статическая ошибка e0 — постоянная ошибка в установившемся режиме системы; см. рис. ниже).

С увеличением пропорционального коэффициента K статическая ошибка e0 уменьшается, время нарастания переходного процесса tн уменьшается, перерегулирование σ увеличивается.

Чтобы убрать статическую ошибку в установившемся режиме, в регулятор вводят интегральный канал с коэффициентом усиления Ki, так что:

Такой регулятор называется пропорционально-интегральным или ПИ-регулятором. Интегратор выдает сигнал, пропорциональный накопленной ошибке, поэтому переходный процесс несколько замедляется.

Однако за счет интегрального канала обеспечивается нулевая ошибка e0 в установившемся состоянии при ступенчатом возмущении и ступенчатом изменении задающего сигнала-уставки.

С увеличением коэффициента интегральной составляющей ПИ-регулятора Ki время нарастания переходного процесса tн уменьшается, перерегулирование σ увеличивается, время регулирования tр увеличивается.

Для ускорения переходных процессов добавляют дифференциальный канал с коэффициентом усиления Kd:

(1.01)

Распространена также другая модификация выражения (1.01):

(1.02)

где t — время; K — пропорциональный коэффициент (безразмерный), Ti — постоянная интегрирования (размерность времени) и Td — постоянная дифференцирования (размерность времени) регулятора. Такой регулятор называют ПИД-регулятором.

Регуляторы этого типа очень хорошо зарекомендовали себя в практических задачах. Кроме того, иногда используются ПД-регуляторы (пропорционально-дифференциальные), у которых нет интегрального канала.

Управление по производной – это быстрый способ управления. Сигнал дифференциального канала наиболее важен при изменениях входов и исчезает в установившемся режиме. Он позволяет реагировать не на само увеличение ошибки, а на тенденцию ее изменения, и принять превентивные меры. Главный недостаток дифференциального канала – большое влияние высокочастотных помех, например, шумов измерений.

С увеличением коэффициента дифференциальной составляющей ПИД-регулятора Kd перерегулирование σ уменьшается, время регулирования tр уменьшается.

При увеличении коэффициентов

Kp

Ki

Kd

Время нарастания tн

Пере- регулирование σ

Время регулирования tр

Статическая ошибка e0

 

— Увеличивается.

— Уменьшается.

— Устраняется.

— Нет определенной тенденции (No definite Trend). Незначительное изменение.

Для устойчивого объекта можно выбрать коэффициенты регулятора опытным путем, выполняя эксперименты с реальным объектом. Предложено несколько методов решения этой задачи, например, правила Зиглера-Никольса (Ziegler J. G. — Nichols N. B.), Коэна-Куна (Cohen O.H. – Coon O.A.) или CHR (Chien K. L. — Hrones J. A. — Reswick J. B.).

Список используемой литературы
  1. Поляков К.Ю., Теория автоматического управления для чайников, Санкт-Петербург, 2008 г.
  2. Востриков А.С., Французова Г.А., Теория автоматического регулирования. 2003 г.
  3. Глушков В.М., Амосов Н.М., Артеменко И.А. Энциклопедия кибернетики. Том 2. Киев, 1974 г.
  4. Теория автоматического управления: Учеб. для вузов по спец. Автоматика и телемеханика. В 2-х ч. Ч. I. Теория линейных систем автоматического управления / Н. А. Бабаков, А. А. Воронов, А. А. Воронова и др.; Под ред. А. А. Воронова.—2-е изд., перераб. и доп. — М.: Высш. шк., 1986. — 367 с.
  5. Денисенко В.В., Энциклопедия АСУ ТП, bookasutp.ru
  6. Dew Toochinda, Scilab Ninja. Control Engineering with Scilab, Scilab Control Engineering Basics, scilab.ninja/study-modules/scilab-control-engineering-basics/ 

У нас на сайте Вы можете приобрести качественные частотные преобразователи. Подробности тут

Понравилась статья? Поделить с друзьями:
  • Статическая ошибка выжившего
  • Статистика недоступна при загрузке статистики произошла ошибка инстаграм
  • Статическая ошибка сау формула
  • Статическая ошибка выборочной средней
  • Статическая ошибка сар