Está en la página 1de 5

PID Caso 2

Este Control PID no requiere libreras, y es muy interesante para comprender como
funciona un algoritmo PID.
Est basado en el siguiente trabajo: Gua de uso PID para Arduino.pdf. En l est la
direccin WEB como referencia.
Si bien el ttulo dice que es para Arduino, no es as y requiere de un cierto trabajo para
adaptarlo realmente a Arduino. Por lo menos para Arduino IDE.
Seguimos los lineamientos del trabajo: 147 - Arduino + LM35 - Control de temperatura
Proporcional. Este es Control P. Aqu evolucionamos agregndo el I y el D.
Podremos as comparar en los dos casos los diagramas obtenidos con el Ardu Graficador
y ver como cambia el Control De P a PID.
El ttulo de este trabajo, PID Caso 2, se refiere al segundo caso de Control PID que se
presenta en la referencia.

Generalidades sobre Control PID y Control Proporcional


solamente.
PID (Proporcional, Integral, Diferencial) es un algoritmo de control que trata de compensar
las caractersticas de un sistema.
Hay tres componentes principales en un lazo de control PID. Cada componente se prefija
con una ganancia constante, y cuando se suman, le dan el valor de control instantnea
que utiliza para controlar el sistema.
Por lo general, se est generando una tensin para controlar el sistema, por lo que cada
componente puede ser pensado como una contribucin con un voltaje determinado a su
salida final.
Va a haber una tensin correspondiente al estado actual del sistema (posicin,
temperatura, etc) que se llama Variable de proceso o PV. El PV es el valor que se pasa al
lazo de control PID para decirle el estado del sistema.
Tenemos una (SP) Tensin de consigna, correspondiente al estado que desea PV para
llegar. Bsicamente, queremos el lazo PID para impulsar el sistema a que SP y PV sean
iguales.
En tercer lugar, tenemos una tensin de control, u, que corresponde al valor de la tensin
instantnea que utiliza para conducir el sistema hacia el voltaje SP. La tensin de control u
puede ser pensada como lo que se enva realmente al sistema para dirigirlo hacia donde
se quiere que vaya. Es anlogo a un acelerador de automovil.
El algoritmo PID es mostrado en la Ecuacin (1.1).

(1.1)
Est la parte proporcional, integral y diferencial en la ecuacin (1.1).

Las constantes son usadas para setear el signo y la ganancia de


cada parte de esta ecuacin.

es el error proporcional que es


La variable t corresponde al tiempo que corre en el sistema, y es simplemente una
variable de integracin.
La parte proporcional de la ecuacin tiene en cuenta la separacin entre PV y SP.
La parte diferencial tiene en cuenta lo rpido que nos estamos moviendo ( si se acerca al
SP muy rpido puede pasarse de largo) , y se puede utilizar para reducir la parte
proporcional si nos estamos acercando , o nos acelerar si no llegamos a pesar de
nuestra contribucin proporcional.
La parte integral de la ecuacin tiene en cuenta el tiempo que hemos estado fuera del
punto de ajuste , lo que contribuye ms a nuestra salida cuanto ms tiempo nos falta el
PS . Esto es importante porque nuestras contribuciones P y D se suele llevar a nuestro
PV a ceder ligeramente por encima o por debajo de nuestra variable SP .
Las tres variables se grafican en el Ardu Graficador, o se pueden ver los valores en el
Serial.

Esquema
Programa
// El programa es PID_caso2.ino
// Variables utilizadas en el controlador PID Caso 2
unsigned long TiempoPasado;
double Input, Output, Setpoint;
double errSum, lastErr;
double kp, ki, kd;
int SampleTime = 100; // Seteamos el tiempo de muestreo en miliseg.
int Entrada = A0;
int Salida = 9; // Es PIN PWM

double x; // Temperatura Variable para el Ardu Graficador


double y; // Salida PWM 0/255 Variable para el Ardu Graficador
double z; // Set Point Variable para el Ardu Graficador
double ymax = 150; // Maximo admitido de y (PWM) Variable para ajustar
double ymin = 0; // Minimo admitido de y (PWM) Variable para ajustar
int y1, y2, y3, y4, y5, y6, y7, y8, y9, y10; // Para promediar la salida

void setup()
{
Serial.begin(115200); // Configura el Serial
pinMode(Output, OUTPUT); // configura el (pin9) como salida

Setpoint = 40; // Setpoint Variable para ajustar


kp = 30; // Constante de proporcionalidad Variable para ajustar
ki = 0.01; // Constante de proporcionalidad Variable para ajustar
kd = 0.01; // Constante de proporcionalidad Variable para ajustar
}

void loop()
{
// Leer la entrada 30 veces para evitar oscilaciones perjudiciales.
for (int B = 0; B <= 29; B++) { Input = Input + analogRead(Entrada); }
Input = Input /30;
Input = Input * 100 * 5 / 1024; // Convertir a grados entigrados
//Serial.println(Input); // Para experimentar solamente
// Contador de tiempo. Es mejor que el retardo porque permite realizar
//operaciones mientras no ha transcurrido el tiempo prefijado.
unsigned long Ahora = millis();
int CambioTiempo = (Ahora - TiempoPasado); // Si el tiempo ha pasado, sigue operando.

// Determina si hay que ejecutar el PID o retornar de la funcin.


if(CambioTiempo>=SampleTime)
{
// Calcula todas las variables de error.
double error = Setpoint - Input;
errSum += error;
double dErr = (error - lastErr);
// Calculamos la funcin de salida del PID.
//Serial.println(error);
Output = kp * error + ki * errSum + kd * dErr;
y = Output;
y1 = y2; y2 = y3; y3 = y4; y4 = y5; y5 = y6; y6 = y7; y7 = y8; y8= y9; y9 = y10; y10 = y;
y = (y1 + y2 + y3 + y4 + y5 + y6 + y7 + y8 + y9 + y10)/10; // calculamos 10 veces para
promediar
if (y < ymin) y = ymin;
if (y > ymax) y = ymax;
analogWrite(Salida,y); // Cargar Output al PWM
// Guardamos el valor de algunas variables para el prximo ciclo de clculo.
lastErr = error;
TiempoPasado = Ahora;
// Variables para graficar
x = Input;
// y para graficar ya est definido unas 11 lineas arriba.
z = Setpoint;
// Enviar al Serial para Graficar. Se debe mantener obligadamente este formato,
// para que el Ardu Graficador no cometa errores.
Serial.print("ini");
Serial.print("x"); Serial.print(x); Serial.print(" ");
Serial.print("y"); Serial.print(y); Serial.print(" ");
Serial.print("z"); Serial.print(z); Serial.print(" ");
Serial.println("fin");
} // FIN del if(CambioTiempo>=SampleTime)
} // FIN del void loop()
Pantalla del Ardu Graficador

Son unos tres minutos de operacin, luego de 10 minutos de iniciado el programa con
Temperatura inicial de 21C. El error es de unos 0.10 C.
Z es el Set Point de 40C. Color amarillo.
Y es el valor de salida. Corresponde al PWM entre 0 y 255.
T es la temperatura medida con el LM35, en C.
La tensin de alimentacin de la resistencia es de 12 Volt. Correspondera al PWM de
255.
En el momento de la imagen, el PWM es de 13, que correspondera a 13 x 12 / 255 =
= 0.62 Volt. Es mas o menos la tensin estable, donde Temperatura = aprox. al Set
Point.
Observar que hay un offset en el eje Y, para que no se encimen las imgenes con el X y el
Z.

También podría gustarte