ПИД-регулятор, часть 3, фантастическая

А фантастика в том, что он работает. И самое удивительно, что:

  • мне удалось найти внятную статью про них;
  • статья не обманула, и его можно действительно создать, не разбираясь в теории;
  • реализация содержит пяток арифметических команд и какой-то магией стабилизирует скорость!

В результате получился вот такой тестовый стенд:
Prototype

И вот такой код.

sketch – это скетч для Arduino
pid.cpp – это просто модель, для экспериментов в Visual Studio

Проверял просто (на тестовом стенде):
Берём число и кидаем в ШИМ – моторчик крутится. Тормозим вал рукой – моторчик притормаживает примерно на 25%.
Включаем ПИД – моторчик крутится. Тормозим вал, а он не тормозится. Скорость держится константная. (Если, конечно, вал пассатижами не зажимать).

Пару слов про скетч. Скорость прибита гвоздём к значению 100.
Если из консольки послать r – двигатель запускается. Если s – останавливается.
В консольку же пишется текущее значение ШИМ (два раза) и текущая скорость.
Все константы целочисленные, надеюсь. Я их записываю как, например, 0.95*65536. По идее, в момент компиляции должно получиться целое число 🙂

Скорость проверяется просто: программа ждёт, пока “белый сектор” не будет держаться достаточно долго. Если это так, засчитывается половина оборота (у меня два сектора). Раз в 0.25 секунды проверяем, сколько там получилось.

Пару слов про подбор коэффициентов. Статья предлагала подбирать П, потом Д, потом И. Реальность оказалась слегка иной.
Я подобрал П. Каких-то особых колебаний не наблюдалось, вот только скорость не дотягивала до желаемой.
Потом я подобрал И. Скорость стала нормальной. Вернулся к П, чисто из перфекционизма.
И в конце я поставил небольшое значение для Д. Просто потому, что в момент старта скорость несколько колбасило.
В итоге первый старт происходил за ~8 измерений (2 секунды). Остальные старты быстрее. Подозреваю, что между стартами в коде сохраняется промежуточное значение интегратора (которое iState) и именно оно влияет на скорость старта.

Ну и ложка дёгтя. Хотя на моторчике и написано, что он работает в диапазоне от 1.5 до 12В, по факту лучше давать 12В и ШИМить. Посмотрим, что там приедет с алиэкспресса, может найду годные альтернативы!

ЗЫ: Знать бы в далёком двухтысячном, что курс ТАУ/ТАР не просто так, и мне когда-то пригодится 😉