PID
Contenido
Descripción
Un controlador Proporcional Integral Derivativo PID calcula un valor de "error" como la diferencia entre una entrada Input medida y un punto de referencia setPoint deseado. El controlador intenta minimizar el error ajustando la salida Output. La librería PID_v1.h requiere de tres paramentos kp, ki y kd.
Placas aplicables
Sintaxis
PID(&Input, &Output, &Setpoint, Kp, Ki, Kd, Direction);
Parámetros
Métodos
Aunque un controlador PID está diseñado para funcionar con una salida analógica, es posible conectarlo a una salida didital, como un relé. En este caso se debe definir un ciclo de trabajo y lo que hace el PID en establecer la proporcion entre HIGH y LOW mediante los metodos: SetSampleTime(ciclo) y SetAoutputLimits(min,max)
Método | Descripción |
---|---|
Computer() | Calcula una nueva salida cada ciclo. Responde verdadero si se calculo. |
SetMode(modo) | Especifica si PID esta AUTOMATIC o MANUAL |
SetOutputLimits(min,max) | Especifica el rango de salida |
SetSampleTime(ciclo) | Determina el ciclo, predetreminado es 200 ms |
SetTunings(kp,ki,kd) | Permite reajustar los parámetros iniciales de reaccion del PID |
SetControlDirection(dirección) | Especifica si la salida es DIRECT o REVERSE. |
Comentarios
Advertencias
Ejemplo 1
Lectura de entrada analogica A0 para controlar salida analogica PWM D3
#include <PID_v1.h>
float Input, Output, Setpoint;
PID miPID(&Input, &Output, &Setpoint, 2, 5, 1, DIRECT);
void setup(){
Setpoint = 100;
miPID.SetMode(AUTOMATIC);
}
void loop(){
Input = analogRead(0);
miPID.Compute();
//Señal PWM
analogWrite(3,Output);
}
Ejemplo 2
Lectura de entrada analogica A0 para controlar salida digital D6 con un ciclo de trabajo de 5 segundos. Por eso se establece la salida del PID entre 0 y 5 segundos de modo que el PID ajustara el % de tiempo que el rele esta activado durante cada ciclo.
#include <PID_v1.h>
float Input, Output, Setpoint;
PID miPID(&Input, &Output, &Setpoint, 2, 5, 1, DIRECT);
int ciclo = 5000;
unsigned long StartTime, now;
void setup(){
pinMode(6, OUTPUT);
Setpoint = 100;
miPID.SetOutputLimits(0, ciclo);
miPID.SetMode(AUTOMATIC);
StartTime = millis();
}
void loop(){
now = millis();
if (now - StartTime > ciclo){
StartTime += ciclo;
}
Input = analogRead(0);
miPID.Compute();
if (Output > now - StartTime){
digitalWrite(6, HIGH);
}else{
digitalWrite(6, LOW);
}
}
Ejemplo 3
Uno de los beneficios de la esta libreria es que se puedes cambiar los parámetros de ajuste (kp, ki, kd) en cualquier momento. Esto puede ser útil si queremos que el PID sea agresivo algunas veces y conservador en otros.
#include <PID_v1.h>
float Input, Output, Setpoint;
float aggKp=4, aggKi=0.2, aggKd=1; //PID agresivo
float consKp=1, consKi=0.05, consKd=0.25; //PID conservador
PID miPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT);
void setup(){
pinMode(3, OUTPUT);
Setpoint = 100;
miPID.SetMode(AUTOMATIC);
}
void loop(){
Input = analogRead(0);
double gap = abs(Setpoint-Input);
if (gap<10){
miPID.SetTunings(consKp, consKi, consKd);
}else{
miPID.SetTunings(aggKp, aggKi, aggKd);
}
miPID.Compute();
//Señal PWM
analogWrite(3,Output);
}
Ejemplo 4
Configurar el PID para usar P_ON_M hacer que la salida se mueva más suavemente cuando el punto de ajuste (Setpoint) está cambiado. Además, puede eliminar el sobrepico en ciertos procesos. Las opciones son: P_ON_M (Proportional ON Measurement) y P-ON_E (Proportional ON Err).
#include <PID_v1.h>
float Input, Output, Setpoint;
PID miPID(&Input, &Output, &Setpoint, 2, 5, 1, P_ON_M, DIRECT);
void setup(){
pinMode(3, OUTPUT);
Setpoint = 100;
miPID.SetMode(AUTOMATIC);
}
void loop(){
Input = analogRead(0);
miPID.Compute();
//Señal PWM
analogWrite(3, Output);
}
Vea también