Выполнил работу - Ипатов Константин Романович гр.541-об
Научный руководитель - Русинов Владислав Леонидович, СКБ "Промышленная робототехника и автоматизация"
Тема: Разработка ПИД-регулятора на микроконтроллере Arduino без встроенных библиотек
Актуальность:
В современной робототехнике и автоматизации ПИД-регулятор является стандартом де-факто для управления приводами, температурой и положением. Большинство начинающих разработчиков используют готовые библиотеки, что приводит к двум проблемам:
- Отсутствие понимания: Библиотека остается «черным ящиком». При возникновении нештатного поведения разработчик не может оперативно найти причину, потому что не понимает внутренней математики.
- Избыточность ресурсов: Готовые библиотеки часто написаны с запасом функционала, который не нужен в конкретном проекте. На платформах с ограниченной памятью самописный код позволяет экономить ресурсы микроконтроллера.
Таким образом, умение написать ПИД-регулятор «с нуля» -- это показатель квалификации инженера, который может адаптировать код под любые требования системы.
Цель работы: Продемонстрировать процесс создания дискретного ПИД-регулятора на языке C++ для платформы Arduino, объяснить назначение каждого блока кода и показать методы защиты регулятора от насыщения без использования сторонних библиотек.
План:
- Введение в ПИД-регулирование
- Структура программы и переменные
- Реализация временного тактирования
- Математика регулятора (основной блок)
- Защита от насыщения (Антивиндап)
- Заключение
Вступление
Здравствуйте, уважаемые коллеги! Сегодня мы поговорим о том, как создать сердце любой системы автоматического регулирования -- ПИД-регулятор -- на платформе Arduino, не прибегая к стандартным библиотекам. Это позволит нам глубже понять математику процесса и получить полный контроль над кодом.

Зачем писать регулятор самому?
Стандартная библиотека PID -- это отличный инструмент, но иногда нам нужна кастомизация: специфические ограничения, нестандартная частота дискретизации или просто экономия памяти. Понимание внутренней структуры регулятора -- важный навык для инженера.
Листинг программы
Перед вами полностью рабочий самописный ПИД-регулятор.

Разбор структуры кода
Первым делом мы объявляем глобальные переменные. Они делятся на три категории:

Коэффициенты настройки: 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. Это гасит колебания и улучшает переходные процессы.

Важный элемент: Антивиндап и ограничения
В любой реальной системе выходной сигнал ограничен. Например, мы не можем подать на мотор напряжение выше 5V или мощность выше 100%. Без специальной обработки интегральная часть будет продолжать расти, пока система стоит на месте. Это явление называется интегральным насыщением.
Чтобы этого избежать, в коде реализованы две ступени защиты:
- Ограничение интеграла: Переменная integral не может выйти за пределы integmax (150) и integmin (-150). Интеграл продолжает накапливаться только в допустимых пределах.
- Ограничение выхода: Итоговый сигнал out обрезается до значений max (100) и min (0), чтобы управляющее воздействие соответствовало возможностям исполнительного устройства.
Заключение
Мы создали полноценный ПИД-регулятор «с нуля». Этот код дает нам гибкость: мы можем легко менять тип дифференцирования, динамически подбирать коэффициенты прямо во время работы системы и адаптировать регулятор под конкретную задачу.
Главный плюс такого подхода -- это полное понимание процессов. Вы не просто вызываете готовую функцию, вы точно знаете, что происходит в микроконтроллере в каждый момент времени.
Спасибо за внимание!