Суббота, 23.09.2017, 19:38
RC - Мастерская
Главная | Каталог статей | Регистрация | Вход
Меню
Статистика
Главная » Статьи » Обмен опытом » Микроконтроллеры

ПИД-Регулятор. Подход к реализации и настройка.
ПИД-Регулятор. Подход к реализации и настройка.

Во-первых, для чего нам нужен какой-то регулятор?

   Допустим, у нас есть некоторый объект, который приводится в движение электродвигателем, и мы хотим управлять скоростью движения этого объекта. В радиоуправляемых моделях скоростью вращения двигателя управляет специальное устройство ESC. Внутреннее устройство последнего темы данной статьи не касается, поэтому будем считать двигатель вместе с регулятором неким «черным ящиком», управляемым ШИМ-сигналом. Таким образом,  длина импульса 1000мкс соответствует нулевой мощности на валу, а 2000мкс – максимальной. С системы радиоуправления приходит как раз такой сигнал и в простейшем случае нам никакой ПИД-регулятор и не нужен. А вот если наш объект(например, квадрокоптер) управляется несколькими двигателями и результирующее движение создается разностью мощностей на них? В этом случае появляется вопрос: какой сигнал надо передать каждому из двигателей, чтоб получить желаемый вектор перемещения? Можно конечно рассчитывать мощность пропорционально исходя из конструкции аппарата. Но при этом наш объект слушаться нас будет очень плохо. Во-первых, двигатель не передаст мощность на вал моментально – ввиду инерции мы получим некую кривую разгона/торможения. Во-вторых, наш объект так же обладает инерцией и не изменит свою скорость мгновенно. Т.е. между изменением управляющего сигнала и реальным изменением движения объекта будет некоторый интервал времени. И в-третьих, на наш объект действуют различные внешние силы, которые необходимо компенсировать.
   Первое, что нам нужно для решения такой задачи – это обратная связь. Т.е. мы должны знать реальное состояние/положение объекта в пространстве. Эта тема обсуждалась ранее. Складывая эти векторы, получим результирующий вектор. Из него уже, зная алгоритм управления объектом и коэффициент пропорционального усиления, легко получить необходимый сигнал для каждого двигателя. Но до конца это проблему не решит. При малом коэффициенте достижения результата придется ждать слишком долго, а при большом – наш объект будет совершать колебания во все стороны около нужного нам вектора. При этом поведение объекта в целом будет непредсказуемым. Виной тому инерция.

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

С его помощью мы можем в любой момент времени с достаточно высокой точностью учесть все выше описанные факторы (в т.ч. инерцию) и рассчитать величину управляющего сигнала.
 
где е – рассогласование, а Kp, Ki, Kd – соответственно пропорциональный, интегральный и дифференциальный коэффициенты усиления. Настройка регулятора заключается в подборе их значений. Именно их Вы можете найти в консоли настройки MultiWii. А понимание принципов его работы, на мой взгляд, позволит ускорить настройку и добиться лучших результатов.
   Пропорциональная составляющая дает немедленную реакцию на рассогласование текущего и требуемого значения сигнала. При приближении к заданному значению она стремится к нулю. Но, как уже говорилось выше, пропорциональная система придет с некоторым колебаниям около требуемой величины – будет иметь некоторую ошибку.
   Интегральная составляющая необходима для того, чтобы со временем накопления интеграла учесть эту ошибку. Через некоторое время система стабилизируется на заданном значении, пропорциональная составляющая будет равна нулю, а выходной сигнал будет определяться только интегральной составляющей.
   Дифференциальная составляющая пропорциональна темпу изменения отклонения регулируемой величины и предназначена для компенсации будущего отклонения от заданного значения.
   Коэффициенты регулятора можно вычислить на основании математической модели объекта. Но так же можно и получить их путем подбора. В этом случае алгоритм будет примерно такой:
1.    Выставим все коэффициенты в 0.
2.    Постепенно увеличиваем Kp и следим за результатами. Необходимо получить устойчивые колебания объекта.
3.    Замеряем период этих колебаний. Обозначим его t1, а значение Kp как K1.
4.    Коэффициент регулятора Kp = 0.6 * K1
5.    Коэффициент регулятора Ki = 2 * K1 / t1 * T
6.    Коэффициент регулятора Kd = K1 * t1/8 / T
7.    В малых пределах изменяем полученные коэффициенты, каждый раз сверяясь с результатом для повышения стабильности.

Программная реализация

Поскольку мы имеем дело с микроконтроллером и регулятор работает внутри основного цикла для его дискретной реализации формула принимает следующий вид:
 
Здесь Т – время дискретизации, а E(n) = X(n) - X0(n) – т.е. рассогласование между текущим и требуемым значением.
Использование этой формулы потребует хранения интеграла за большой период времени и «дорогостоящих» операций с плавающей точкой. И для оптимизации расчетов обычно переходят к рекуррентной формуле:
 
Она позволяет существенно сократить нагрузку на вычислительные ресурсы микроконтроллера.
В статье «Корректная реализация разностной схемы ПИД регулятора» (http://habrahabr.ru/post/143388/) очень хорошо описаны основные «грабли» при программной реализации этой формулы. Здесь опишу лишь кратко выводы:
1.    Значение U(n) нельзя ограничивать. Ограничение должно накладываться при формировании управляющего сигнала двигателю в последний момент.
2.    Необходимо соблюдать разрядность переменных и не допускать или корректно обрабатывать переполнение при вычислении промежуточных результатов.
3.    Правильная инициализация разностной схемы: обнулить вообще всё. То есть
X(0) = 0, X0(0) = 0. U(0) = 0. E(0)=X(0)-X0(0)=0.
4.    Если U(n) было ограничено, то регулятор необходимо заново проинициализировать как только пропорциональная часть приблизится к нулю.
5.    При реализации необходимо удостовериться, что данные во всех переменных имеют правильную размерность.
6.    Необходимо контролировать период вычислений. Все итерации цикла должны быть одной длины. Учитывая необходимость получения информации с датчиков, в некоторых случаях бывает полезным разделить итерации основного цикла. Например, на четных итерациях производить считывание показаний, а на нечетных – производить расчет управляющего сигнала.

** В статье использованы материалы с сайтов «Википедия» (http://ru.wikipedia.org), habrahabr (http://habrahabr.ru), EasyElectronics (http://we.easyelectronics.ru/).

Категория: Микроконтроллеры | Добавил: Mactep (23.05.2013)
Просмотров: 5818 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск