PID

De Arduino
Saltar a: navegación, buscar

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

Input
&Output
&Setpoint
Kp
Ki
Kd
Direction

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étodos libreria PID
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


Referencias externas