Меню

Pid регулятор на arduino настройка

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

ПИД регулятор – один из самых распространенных автоматических регуляторов. Он настолько универсален, что применяется практически везде, где нужно автоматическое управление. Например температурой: специальные печи, холодильники, инкубаторы, паяльники, сопло и стол 3D принтера, ИК паяльные станции и прочее. Поддержание частоты оборотов мотора, например для станков. Всевозможные балансирующие штуки, гироскутеры, сигвеи, левитирующие магнитные платформы, и конечно же квадрокоптеры и самолёты с автопилотом. Это всё ПИД регулятор. Почему именно ПИД? Существуют и другие регуляторы, превосходящие ПИД по адаптивности к управляемой системе и стабильности, например линейно квадратичный. Но, чтобы грамотно синтезировать такой регулятор, нужно быть гораздо больше чем “семи пядей” во лбу, а настройка ПИД регулятора дело хоть и неприятное, но фактически очень простое и под силу любому, а сам ПИД регулятор универсален для почти любого процесса.

Система управления

Прежде чем переходить непосредственно к пиду, очень важно понять и запомнить несколько базовых понятий, из которых состоит автоматическая система. В первую очередь это регулятор, который всем заправляет и находится в центре системы. Регулятор в данном понимании – математический алгоритм или часть программы, которая крутится на микроконтроллере. Регулятор, как алгоритм, работает с обычными числами. Объект управления – это девайс, которым мы управляем, например печка или мотор. Для этого у нас есть управляющее устройство, например диммируемый тен или драйвер мотора. Управляющее устройство получает от регулятора управляющий сигнал, то есть конкретное число. Это может быть заполнение шим сигнала, от 0 до 255, а может быть угол поворота сервомашинки от 0 до 180, потому что регулятору без разницы чем управлять. В объекте управления у нас стоит датчик, с которого регулятор получает управляемую величину, то есть текущий сигнал с датчика. Это – обратная связь, которая и даёт возможность системе ирчно поддержать заданное значение. В случае с печкой это температура, а с мотором – частота оборотов. Ну и наконец регулятор получает установку (уставку), то есть число, к которому он должен привести текущее значение с датчика. Установка может задаваться каким угодно образом: крутилкой, ползунком, энкодером, кнопками, да хоть смской или голосовым вводом. Регулятору это неважно, для него это просто цифра. Задача регулятора состоит в том, чтобы сравнивать текущее значение с установкой и выдавать управляющий сигнал на управляющее устройство. То есть в программе это будет выглядеть условно так: регулятор получил установку, регулятор получил значение с датчика, регулятор выполнил вычисления и выдал нам управляющий сигнал, опять же число. Если это шим – мы его подаём через функцию генерации шим. Есть ещё один момент – регулятор должен делать расчёты и применять управляющий сигнал через равные промежутки времени, то есть с равным периодом или частотой. Эта частота называется частотой дискретизации системы, а период обозначается как dt, прямо как период интегрирования.

Под капотом у ПИД регулятора

ПИД регулятор состоит из трёх составляющих: пропорциональной P, интегрирующей I и дифференциирующей D, формируется просто как сумма трёх значений, умноженных каждая на свой коэффициент. Эта сумма после вычислений становится управляющим сигналом, который подаётся на управляющее устройство, обозначим его как out.

kP, kI и kD это и есть те самые коэффициенты, которые нужно настроить для работы ПИДа. Значения тут могут быть самые разные, от 0.001 то десятков и тысяч, это зависит от конкретной системы. Тут есть ещё один момент: любой коэффициент может быть равен нулю, и в таком случае обнуляется вся его компонента. То есть регулятор можно превратить в П, ПИ, ПД, и прочие сочетания. Разные системы требуют разного подхода, именно поэтому ПИД регулятор такой универсальный.

В дальнейшем будем пользоваться следующими названиями переменных:

Читайте также:  Настройка hand2note для pokerstars

P составляющая

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

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

P составляющая исправляет ошибку в текущий момент времени.

I составляющая

Интегральная составляющая просто суммирует в саму себя ту же самую ошибку, разность текущего и заданного значения, умноженную на период дискретизации системы, то есть на время, прошедшее с предыдущего расчёта dt – фактически берёт интеграл от ошибки по времени.

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

I составляющая исправляет прошлые, накопившиеся ошибки.

D составляющая

Дифференциальная составляющая представляет собой разность текущей и предыдущей ошибки, поделенную на время между измерениями, то есть на ту же dt, которая общий период регулятора. Иными словами – это производная от ошибки по времени.

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

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

Настройка регулятора

Для настройки регулятора нужно варьировать коэффициенты:

Вот так выглядит процесс стабилизации при изменении коэффициентов:

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

Например, незатухающие колебания появились при kP 20, период колебаний составил 3 секунды. Период dt в системе будет 50 мс (0.05 с). Считаем:

На полученных коэффициентах должны более-менее работать большинство систем, но не все.

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

Реализация на C++

Соединяя все рассмотренные выше уравнения, получим:

Это готовая функция, которая принимает значение с датчика, установку, три коэффициента и время, а также ограничение выхода с регулятора. Как пользоваться этой функцией: функция должна вызываться с некоторым периодом, причем длительность этого периода нужно будет передать в функцию в секундах. Если попроще, можно использовать задержку. Но делать так не рекомендуется, лучше сделать таймер на миллис и работать с ним. Функция возвращает управляющий сигнал, то есть можно подать его например как ШИМ. Период dt имеет такой смысл: чем инерционнее у нас система, тем реже можно вычислять пид. Например для обогрева комнаты период можно поставить 1 секунду или больше, а для контроля за оборотами двигателя надо будет поставить пару десятков миллисекунд, то есть около сотни раз в секунду.

Читайте также:  Playstation 4 настройки сети

Видео

Источник

PID РЕГУЛЯТОР НА ARDUINO

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

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

Алгоритм ПИД регулятора выглядит так, можете использовать его напрямую в скетче:

БИБЛИОТЕКА GYVERPID

GyverPID v3.0

Библиотека классического PID регулятора для Arduino

Поддерживаемые платформы: все Arduino (используются стандартные Wiring-функции)

Версии

Версия 1.1 – убраны дефайны
Версия 1.2 – возвращены дефайны
Версия 1.3 – вычисления ускорены, библиотека облегчена
Версия 2.0 – логика работы чуть переосмыслена, код улучшен, упрощён и облегчён
Версия 2.1 – integral вынесен в public
Версия 2.2 – оптимизация вычислений
Версия 2.3 – добавлен режим PID_INTEGRAL_WINDOW
Версия 2.4 – реализация внесена в класс
Версия 3.0
– Добавлен режим оптимизации интегральной составляющей (см. доку)
– Добавлены автоматические калибровщики коэффициентов (см. примеры и доку)
Версия 3.1 – исправлен режиме ON_RATE, добавлено автоограничение инт. суммы

ДОКУМЕНТАЦИЯ

Документация

Логика работы

ПИД регулятор принимает на вход две величины:

С ПИД регулятора выходит выходной (управляющий) сигнал output – безразмерная величина, которая подаётся на управляющее устройство. Это может быть транзистор с ШИМ сигналом, диммер, сервопривод, и т.д. Выходной сигнал должен влиять на входной сигнал: нагреватель нагревает объект с датчиком температуры, мотор крутится и даёт значения для датчика оборотов, и т.д.

Инициализация

Можно инициализировать объект тремя способами:

Режимы и настройки

setDirection(dir); // dir – NORMAL или REVERSE

setMode(mode); // mode – ON_ERROR или ON_RATE

Подробнее про этот режим смотри в самом конце документации, в разделе оптимизации интегральной суммы.

Пределы выхода: ограничение значения выходного сигнала, по умолчанию: 0-255 (для 8 бит ШИМ). Может быть установлено 0-180 для угла сервопривода, и т.д. Устанавливается командой

setLimits(min, max); // установить пределы

setDt(dt); // установка времени итерации в мс

Установка/чтение параметров

Время итерации меняется при помощи метода setDt() (см. выше).

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

Тип вычислений

Как работать с библиотекой?

Как настроить коэффициенты?

В версии 3.0 появился автоматический тюнер коэффициентов, читай ниже.

Оптимизация интегральной суммы (экспериментально)

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

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

Ручная оптимизация

Режим интегрального окна

Будьте внимательны, внутри библиотеки будет создан массив указанного размера и займёт память! Используйте только в том случае, если понимаете как это работает и для чего оно нужно, а также есть возможность наблюдать за графиком и делать выводы!

Режим оптимизации интегральной суммы

В версии 3.0 появился новый режим автоматической оптимизации интегральной суммы: она автоматически ограничивается так, чтобы выходной сигнал не превышал установленные в setLimits() пределы, то есть инт. сумма не будет бесконечно расти или уменьшаться. В то же время резкие скачки значения с датчика (вход регулятора) вблизи пределов могут приводить к обнулению интегральной суммы, поэтому входной сигнал рекомендуется фильтровать. Для активации режима оптимизации интегральной суммы нужно прописать в скетче дефайн #define PID_OPTIMIZED_I до подключения библиотеки.

Читайте также:  Акт настройки балансировочных клапанов

Режим “пропорционально скорости”

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

Автоматический тюнер коэффициентов 1

Тюнер тип 1

Автоматический калибровщик коэффициентов ПИД регулятора, метод “реле” http://auto-controls.blogspot.com/2009/10/pid-controllers-auto-tuning-relay.html. Данный тюнер лучше настраивает коэффициенты для удержания величины и парирования внешних возмущений.

Примечание: тюнер позволяет найти более-менее приемлемые коэффициенты, при которых система будет работать. Эти коэффициенты не являются идеальными и их всё равно придётся покрутить вручную.

Примечание: тюнер выдаёт коэффициенты для ПИ и ПИД регулятора. ПИ регулятор подразумевает, что коэффициент Д будет равен 0.

Как это работает?

Как пользоваться библиотекой?

1. Инициализация и настройка

tuner.setParameters(направление, сигнал, ступенька, период, точность стабилизации, продолж. импульса, период итерации);

Пример: tuner.setParameters(NORMAL, 130, 40, 2000, 1, 2000, 30);

Калибруем нормальный процесс (увеличение сигнала увеличивает значение с датчика), базовый сигнал 130, ступенька 40 (в процессе калибровки сигнал будет меняться от 130-40 до 130+40, сразу думаем о том, чтобы это не превысило допустимый максимум), на этапе стабилизации хотим, чтобы система считалась стабильной при изменении сигнала с датчика менее, чем на 1 (условная величина датчика) за 2000 миллисекунд. На этапе первоначальной раскачки мы задали длину импульса 2000 мс, период работы всей системы – 30 мс.

2. Структура цикла
Библиотека сделана универсальной для любого датчика и управляющего устройства, цикл тюнинга организуется вот так:

3. Отладка и получение значений
3.1 Во время работы тюнера можно вызвать tuner.getAccuracy() – чем ближе его значение к 100, тем стабильнее на данный момент качается система и
тем вычисляемые коэффициенты будут более близки к идеальным
3.2 Для наблюдения за тюнером через Serial есть готовые методы:
– tuner.debugText() выводит текстовые данные (смотри скриншот в папке docs библиотеки)
– tuner.debugPlot() выводит данные для построения графика через плоттер Arduino IDE (смотри скриншот в папке docs библиотеки)
3.3 Чтобы получить коэффициенты внутри программы (без Serial) желательно задать условие if (tuner.getAccuracy() > 95) и при наступлении этого условия получить коэффициенты:

Смотрите примеры в examples/autotune

Автоматический тюнер коэффициентов 2

Тюнер тип 2

Автоматический калибровщик коэффициентов ПИД регулятора, метод Cohen-Coon https://pages.mtu.edu/

tbco/cm416/cctune.html. Данный тюнер лучше настраивает коэффициенты для переходного процесса, например разогрев с одной температуры до другой.

Примечание: тюнер позволяет найти более-менее приемлемые коэффициенты, при которых система будет работать. Эти коэффициенты не являются идеальными и их всё равно придётся покрутить вручную.

Примечание: тюнер выдаёт коэффициенты для ПИ и ПИД регулятора. ПИ регулятор подразумевает, что коэффициент Д будет равен 0.

Как это работает?

Как пользоваться библиотекой?

1. Инициализация и настройка

tuner.setParameters(направление, начальный сигнал, конечный сигнал, период, точность, время стабилизации, период итерации)

Пример: tuner.setParameters(NORMAL, 150, 200, 1000, 1, 50);

Калибруем нормальный процесс (увеличение сигнала увеличивает значение с датчика), начальный сигнал 150, конечный 200, на этапе стабилизации хотим, чтобы система считалась стабильной при изменении сигнала с датчика менее, чем на 1 (условная величина датчика) за 1000 миллисекунд. Период работы всей системы – 50 мс.

2. Структура цикла
Библиотека сделана универсальной для любого датчика и управляющего устройства, цикл тюнинга организуется вот так:

3. Отладка и получение значений
3.1 Во время работы тюнера можно вызвать tuner.getState() – вернёт номер текущего этапа работы. На 7-ом этапе можно забирать коэффициенты
3.2 Для наблюдения за тюнером через Serial есть готовые методы:
– tuner.debugText() выводит текстовые данные (смотри скриншот в папке docs библиотеки)
– tuner.debugPlot() выводит данные для построения графика через плоттер Arduino IDE (смотри скриншот в папке docs библиотеки)
3.3 Чтобы получить коэффициенты внутри программы (без Serial) желательно задать условие if (tuner.getState() == 7) и при наступлении этого условия получить коэффициенты:

Смотрите примеры в examples/autotune2

Источник

Adblock
detector