Разработка ПИД-регулятора на микроконтроллере Arduino без встроенных библиотек

Автор 541-Ipatov, Четверг, марта 19, 2026, 01:45:28

« предыдущая тема - следующая тема »
Вниз

541-Ipatov

Четверг, марта 19, 2026, 01:45:28 Последнее редактирование: Четверг, марта 19, 2026, 01:49:26 от 541-Ipatov
Выполнил работу - Ипатов Константин Романович гр.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), чтобы управляющее воздействие соответствовало возможностям исполнительного устройства.


Заключение

Мы создали полноценный ПИД-регулятор «с нуля». Этот код дает нам гибкость: мы можем легко менять тип дифференцирования, динамически подбирать коэффициенты прямо во время работы системы и адаптировать регулятор под конкретную задачу.

Главный плюс такого подхода -- это полное понимание процессов. Вы не просто вызываете готовую функцию, вы точно знаете, что происходит в микроконтроллере в каждый момент времени.

Спасибо за внимание!

ran

Спасибо за доклад! Все строго по теме.
Есть небольшое дополнение. Реальные регуляторы ограничивают не выход интегральной составляющей, а общий выход регулятора. Поэтому интегральная составляющая не должна "жить сама по себе", ограничиваясь своим ограничением, а должна "подстраиваться" под ограничение на выходе регулятора. Это позволит быстро выйти из ограничения, когда для этого создадутся условия. Другими словами, интегратор должен "заморозиться" не "сам по себе", а при ограничении выходного сигнала регулятора.

541-Ipatov

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

ran

Это правильно, но ограничение интегратора сработает "автоматически" при ограничении выходного сигнала. Не может же быть так, что выход интегратора - большой-большой-большой, а выход регулятора проде бы как приемлемый.

541-Ipatov

понял, спасибо, учту.

DenisAlekseevich

Хороший доклад.
К автору вопрос: ведь походы по реализации типовые, у меня например есть код и на ассемблере.
Есть ли что-то что можно было бы улучшить в коде? Расширить функционал, планы и т.п.?

541-Ipatov

#6
Среда, марта 25, 2026, 22:27:34 Последнее редактирование: Среда, марта 25, 2026, 23:26:46 от 541-Ipatov
Денис Алексеевич спасибо за ваш ответ. Улучшить можно многое: авто настройка пид, каскадный пид, компенсатор нелинейностей. Но моя работа заключалась в написании простого кода который объясняет базовый принцип действия пид регулятора.
В будущем рассмотрю данные улучшения для описания в докладе.

Вверх