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

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

БИБЛИОТЕКА GYVERPID

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

  • Время одного расчёта около 90 мкс
  • Режим работы по величине или по её изменению (для интегрирующих процессов)
  • Возвращает результат по встроенному таймеру или в ручном режиме

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

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


GyverPID();
GyverPID(float new_kp, float new_ki, float new_kd);                     // kp, ki, kd
GyverPID(float new_kp, float new_ki, float new_kd, int16_t new_dt);     // kp, ki, kd, dt
 
float setpoint;        // заданная величина, которую должен поддерживать регулятор
float input;           // сигнал с датчика (например температура, которую мы регулируем)
float output;          // выход с регулятора на управляющее устройство (например величина ШИМ или угол поворота серво)
 
float getResult();                                          // возвращает новое значение при вызове (если используем свой таймер с периодом dt!)	
float getResult(float new_setpoint, float new_input);       // принимает setpoint и input
 
float getResultTimer();                                     // возвращает новое значение не ранее, чем через dt миллисекунд (встроенный таймер с периодом dt)
float getResultTimer(float new_setpoint, float new_input);  // тож самое, но принимает setpoint и input
  
void setDirection(boolean direction);                       // направление регулирования: NORMAL (0) или REVERSE (1)
void setMode(boolean mode);                                 // режим: работа по входной ошибке ON_ERROR (0) или по изменению ON_RATE (1)
void setLimits(float min_output, float max_output);         // лимит выходной величины (например для ШИМ ставим 0-255)
void setDt(int16_t new_dt);                                 // установка времени дискретизации (для getResultTimer)
 
float kp;
float ki;
float kd;

ПРИМЕРЫ


/*
   Пример работы ПИД регулятора в автоматическом режиме по встроенному таймеру
   Давайте представим, что на 3 пине у нас спираль нагрева, подключенная через мосфет,
   управляем ШИМ сигналом
   И есть какой то абстрактный датчик температуры, на который влияет нагрев спирали
*/
#include "GyverPID.h"

// (коэффициент П, коэффициент И, коэффициент Д, период дискретизации (мс) )
GyverPID regulator(0.1, 0.05, 0.01, 10);

void setup() {
  regulator.setDirection(NORMAL); // направление регулирования
  regulator.setLimits(0, 255);    // пределы (ставим для 8 битного ШИМ)

  regulator.setpoint = 50;        // сообщаем регулятору температуру, которую он должен поддерживать
}

void loop() {
  int temp;                 // читаем с датчика температуру
  regulator.input = temp;   // сообщаем регулятору текущую температуру

  // getResultTimer возвращает значение для управляющего устройства
  // обновление происходит по встроенному таймеру на millis()
  analogWrite(3, regulator.getResultTimer());  // отправляем на мосфет
}

ОСТАЛЬНЫЕ БИБЛИОТЕКИ

У меня есть ещё очень много всего интересного! Смотрите полный список библиотек вот здесь.