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