Во-первых, для чего нам нужен какой-то регулятор?
Допустим, у нас есть некоторый объект, который приводится в движение электродвигателем, и мы хотим управлять скоростью движения этого объекта. В радиоуправляемых моделях скоростью вращения двигателя управляет специальное устройство 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) – т.е. рассогласование между текущим и требуемым значением.
Использование этой формулы потребует хранения интеграла за большой период времени и «дорогостоящих» операций с плавающей точкой. И для оптимизации расчетов обычно переходят к рекуррентной формуле:
Она позволяет существенно сократить нагрузку на вычислительные ресурсы микроконтроллера.
В статье «Корректная реализация разностной схемы ПИД регулятора» очень хорошо описаны основные «грабли» при программной реализации этой формулы. Здесь опишу лишь кратко выводы:
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/).
Допустим у нас есть квадрик (рассмотрим плоскость проходящюю через 2 противоположных двигателя). Задание держать горизонталь. Что делает система (гироскоп)?
1. определяет угол отклонения от горизонтали (рассоглосование в статье)
2. с помощью пропорциональной составляющей вычисляет на сколько нужно увеличить мощность двигателя в чью сторону крен. В случае если не будет других составляющих пропорциональная будет увеличивать мощность до тех пор пока квадрик не выйдет в горизонталь, но к моменту когда он выйдет в горизонталь мощность на двигателе станет избыточной и он начнет крениться в другую сторону, придется сбрасывать мощность. Таким образом квадрик будет совершать колебательные движения (если очень повезет затухающие).
Дифференциальная и интегральная составляющая нужны для своевременного сброса мощности чтоб квадрик не перескакивал горизонталь.
дифференциальная отслеживает скорость изменения рассоглосования и в зависимости от этого уменьшает или увеличивает регулирующее воздействие полученное от пропорциональной.
Пропорциональная и дифференциальная все же не могут быть идеальными, они в сумме дадут затухающие колебания, но колебания могут длиться очень долго, для учета ошибки и введена интегральная составляющая, что позволяет более точно и в разы быстрее выводить квадрик в устойчивую горизонталь
подобные законы регулирования.
В первом приближении работа регулятор+модель описывается именно так.
Однако не все так просто. При наличии в системе элемента запаздывания все может быть с точностью до наоборот.
Поэтому ПИД-регулятор - не самая хорошая вещь, особенно для нелинейных систем. Поэтому используют расчеты, подбирают коэффициенты. В зависимости от объекта регулирования, может получиться так, что НИКАКИЕ вразумительные настройки ПИД регулятора не справятся.
Для нелинейных систем применяют множество регулей - один из методов расчет метод пространства состояний.
Огромное спасибо за информацию. А то ведь, как обычно, ползать по инету в поисках информации лень, да и времени нет. А так я раз в пару дней на паркфлайер заползаю посмотреть, что новенького. И тут нате вот вам.
+
Микроконтроллеры в управлении летательными аппаратами. Фильтр низких частот.
Микроконтроллеры в управлении летательными аппаратами. Определение горизонта. Комплементарный фильтр.
Все доступно так же на моем сайте http://rc-master.ucoz.ru
И это ссылки на сайты, а не на конкретные статьи. Последних было много и половины я найти не смог. Просто в свое время поиск по этим трем сайтам дал максимум информации.
Есть мысль скрестить всю эту теорию с OrangeRx OpenLRS. Прикрутить к последней набор датчиков. На базе мультивия и прошивки kha сделать блок управления для самуля с вертикальным взлетом и посадкой - поворотные двигатели + 3 режима работы: как коптер, как самуль и переходный.
Не факт, что получится, но больная голова рукам покоя не дает...
вооружившись мануалом на девайс.
Автор расписал теорию для любителей Ардуино, и прочих платформ, на
основе которых можно ваять контроллеры управления чем-хош, и под любой каприз..
Или для написания "альтернативных" прошивок под готовые устройства.
Плюс ему, молодец он.