Выполнил работу - Ипатов Константин Романович гр.541-об
Научный руководитель - Русинов Владислав Леонидович, СКБ "Промышленная робототехника и автоматизация"
Тема: Разработка ПИД-регулятора на микроконтроллере Arduino без встроенных библиотек
Актуальность:
В современной робототехнике и автоматизации ПИД-регулятор является стандартом де-факто для управления приводами, температурой и положением. Большинство начинающих разработчиков используют готовые библиотеки, что приводит к двум проблемам:
- Отсутствие понимания: Библиотека остается «черным ящиком». При возникновении нештатного поведения разработчик не может оперативно найти причину, потому что не понимает внутренней математики.
- Избыточность ресурсов: Готовые библиотеки часто написаны с запасом функционала, который не нужен в конкретном проекте. На платформах с ограниченной памятью самописный код позволяет экономить ресурсы микроконтроллера.
Таким образом, умение написать ПИД-регулятор «с нуля» -- это показатель квалификации инженера, который может адаптировать код под любые требования системы.
Цель работы: Продемонстрировать процесс создания дискретного ПИД-регулятора на языке C++ для платформы Arduino, объяснить назначение каждого блока кода и показать методы защиты регулятора от насыщения без использования сторонних библиотек.
План:
- Введение в ПИД-регулирование
- Структура программы и переменные
- Реализация временного тактирования
- Математика регулятора (основной блок)
- Защита от насыщения (Антивиндап)
- Заключение
Вступление
Здравствуйте, уважаемые коллеги! Сегодня мы поговорим о том, как создать сердце любой системы автоматического регулирования -- ПИД-регулятор -- на платформе Arduino, не прибегая к стандартным библиотекам. Это позволит нам глубже понять математику процесса и получить полный контроль над кодом.
(https://studfile.net/html/2706/40/html_KuWj7cvUSG.yJ31/htmlconvd-EBay1U_html_2c7376afe49dea1e.png)
Зачем писать регулятор самому?
Стандартная библиотека PID -- это отличный инструмент, но иногда нам нужна кастомизация: специфические ограничения, нестандартная частота дискретизации или просто экономия памяти. Понимание внутренней структуры регулятора -- важный навык для инженера.
Листинг программы
Перед вами полностью рабочий самописный ПИД-регулятор.
(https://imgfy.ru/ib/DoDTu2rpBxxIAfM_1773819401.webp)
Разбор структуры кода
Первым делом мы объявляем глобальные переменные. Они делятся на три категории:
(https://imgfy.ru/ib/axs9K7ebGTVGEQM_1773819754.webp)
Коэффициенты настройки: Kp, Ki, Kd. В коде они инициализированы значением 0.1, но в реальном проекте их нужно будет подбирать под конкретную систему.
- Переменные состояния: err (текущая ошибка), last_err (ошибка на предыдущем шаге), integral (накопленная сумма интеграла).
- Параметры системы: Ts -- период дискретизации (0.2 секунды), и ограничения для защиты регулятора.
- Сердце алгоритма: Цикл регулирования
Основная магия происходит в функции loop(). Критически важный момент -- регулятор должен выполняться через строго равные промежутки времени Ts. В коде это реализовано через сравнение millis().
Когда наступает момент вычисления (if (milliss > (Ts*1000))), мы выполняем следующие шаги:
- Пропорциональная часть: Умножаем текущую ошибку err на коэффициент Kp. Эта часть отвечает за реакцию на текущее отклонение.
- Интегральная часть: Накопление ошибки. К предыдущей сумме integral добавляется текущая ошибка, умноженная на Ki и на время Ts. Это позволяет устранить статическую ошибку.
- Дифференциальная часть: Вычисляется как скорость изменения ошибки. Берем разницу между текущей ошибкой и прошлой, делим на время и умножаем на Kd. Это гасит колебания и улучшает переходные процессы.
(https://studfile.net/html/1596/364/html_2OmVRu4G0c.bZBt/img-Km3N0R.png)
Важный элемент: Антивиндап и ограничения
В любой реальной системе выходной сигнал ограничен. Например, мы не можем подать на мотор напряжение выше 5V или мощность выше 100%. Без специальной обработки интегральная часть будет продолжать расти, пока система стоит на месте. Это явление называется интегральным насыщением.
Чтобы этого избежать, в коде реализованы две ступени защиты:
- Ограничение интеграла: Переменная integral не может выйти за пределы integmax (150) и integmin (-150). Интеграл продолжает накапливаться только в допустимых пределах.
- Ограничение выхода: Итоговый сигнал out обрезается до значений max (100) и min (0), чтобы управляющее воздействие соответствовало возможностям исполнительного устройства.
Заключение
Мы создали полноценный ПИД-регулятор «с нуля». Этот код дает нам гибкость: мы можем легко менять тип дифференцирования, динамически подбирать коэффициенты прямо во время работы системы и адаптировать регулятор под конкретную задачу.
Главный плюс такого подхода -- это полное понимание процессов. Вы не просто вызываете готовую функцию, вы точно знаете, что происходит в микроконтроллере в каждый момент времени.
Спасибо за внимание!
Спасибо за доклад! Все строго по теме.
Есть небольшое дополнение. Реальные регуляторы ограничивают не выход интегральной составляющей, а общий выход регулятора. Поэтому интегральная составляющая не должна "жить сама по себе", ограничиваясь своим ограничением, а должна "подстраиваться" под ограничение на выходе регулятора. Это позволит быстро выйти из ограничения, когда для этого создадутся условия. Другими словами, интегратор должен "заморозиться" не "сам по себе", а при ограничении выходного сигнала регулятора.
Спасибо за ответ, учту, просто как я понял у интегральной составляющей тоже должны быть границы что бы интеграл не уходил в бесконечность.
Это правильно, но ограничение интегратора сработает "автоматически" при ограничении выходного сигнала. Не может же быть так, что выход интегратора - большой-большой-большой, а выход регулятора проде бы как приемлемый.
Хороший доклад.
К автору вопрос: ведь походы по реализации типовые, у меня например есть код и на ассемблере.
Есть ли что-то что можно было бы улучшить в коде? Расширить функционал, планы и т.п.?
Денис Алексеевич спасибо за ваш ответ. Улучшить можно многое: авто настройка пид, каскадный пид, компенсатор нелинейностей. Но моя работа заключалась в написании простого кода который объясняет базовый принцип действия пид регулятора.
В будущем рассмотрю данные улучшения для описания в докладе.