La librería PIDController permite ejecutar de forma sencilla un controlador PID en un microprocesador como Arduino.
PIDController está basado en la librería Arduino PID, un gran trabajo realizado por Brett Beauregard. En este post del autor se detallan las mejoras implementadas respecto a un controlador PID básico.
Sin embargo, la librería Arduino PID no ha sido actualizada desde 2017. PIDController continua con el trabajo en esta librería, a la vez que la adapta a los nuevos tiempos y procesadores.
Pese a estar basada en Arduino PID, la librería PIDController ha sido reescrita desde cero. Por ello, el código ha sido refactorizado y limpiado, para que sea más fácilmente entendible, mantenible y ampliado.
Por tanto, la librería PIDController no es retrocompatible con Arduino PID. Los proyectos deberán ser adaptados a la nueva librería, según lo explicado en “Diferencias con Arduino PID”.
Una vez adaptado el código a la librería, la respuesta obtenida con PIDController ante las mismas entradas y parámetros del controlador será la mismo que la obtenido con Arduino PID.
Uso
Aquí tenemos un ejemplo de funcionamiento de la librería PIDController.
#include <PIDController.hpp>
const int PIN_INPUT = 0;
const int PIN_OUTPUT = 3;
PID::PIDParameters<double> parameters(4.0, 0.2, 1);
PID::PIDController<double> pidController(parameters);
void setup()
{
pidController.Input = analogRead(PIN_INPUT);
pidController.Setpoint = 100;
pidController.TurnOn();
}
void loop()
{
pidController.Input = analogRead(PIN_INPUT);
pidController.Update();
analogWrite(PIN_OUTPUT, pidController.Output);
}
Cambios respecto a Arduno-PID-Library
La librería PIDController incorpora las siguientes mejoras respecto a la librería Arduino PID. El código de tu proyecto deberá ser adaptado para tener en cuenta estos cambios.
- La clase PID pasa a llamarse PIDController.
- Se usa el namespace PID para evitar colisiones
- Se hace uso de templating, así que ahora es posible usar tanto
double
comofloat
- Input, Output y SetPoint dejan de ser punteros, para pasar a ser variables internas
- El método
Calculate()
pasa a llamarseUpdate()
- El método
SetMode
se reemplaza por las funcionesTurnOn
,TurnOff
yToggle
- Añadido método
Update(T input)
que simultáneamente establece Input y llama al métodoUpdate()
- Los parámetros Kp, Ki y Kd ahora están envueltos en una clase
PIDParameters
- #define para opciones son ahora enumeraciones.
Otras funciones de PIDController
Otras características añadidas a PIDController son las siguientes
- Añadido parámetro
Resolution
para trabajar tanto conmillis()
como conmicros()
- Añadido el método
ForzeUpdate()
para actualizar incluso cuando el intervarlo de muestreo no haya pasado. (No es la opción preferida, pero es necesario en ciertos proyectos) - Añadidos parámetros separados para OutpuxMin, OutputMax, y AntiWindupMin, AntiWindupMax
- Añadidas clases abstractas
IController
yISisoController
- Añadida clase PIDParametersAdaptative para simplificar el uso PID adaptativos.
- Añadidos métodos
Get...()
para todas las propiedades del controlador - Añadidos métodos para obtener la contribución de cada término (GetTermP, GetTermI, GetTermD)
- Añadida integración trapezoidal para mejora calculo del término integral
Instalación
- Descargar la última versión desde GitHub
- Descomprimir el archivo
- Copiar en tu carpeta de librerías (normalmente Mis Documentos\Arduino\libraries)
- Relanzar el IDE de Arduino