Este es otro trabajo de PID, para experimentar y dominarlo.
Usa la Librería de Arduino PID_v1.h, que está en el Archivo ZIP, para que la puedan instalar.
Está basado en el ejemplo de Arduino, PID_Basic, con algunas modificaciones, como eliminar alguna línea innecesaria en el Setup, y el agregado de un potenciómetro para seleccionar manualmente el Setpoint, agregado de promedios en las medicines de Temperatura y Setpoint, y agregado de las líneas necesarias para Graficar en el Ardu Graficador, trabajo número 128 - Graficador de 3 canales para PC y Visual Basic 6.0.
Es un avance sobre el trabajo 147. Seguimos con el módulo de potencia con transistor TIP122 de 5 Amper y 50 Volt. Este trabajo usa la Librería PID_v1 de Arduino y agregamos un potenciómetro para variar manualmente el Setpoint. Controlaremos la temperatura con la Librería Arduino PID. Para ajustar los valores de las constantes que ahora son tres, Kp, Kd y Ki, usaremos el programa Ardu Graficador (Trabajo Número 128) que nos permite ver las curvas de Setpoint, Input y Output. Lo interesante es que puedan analizar las diferencias con el trabajo anterior.
Como siempre, en el archivo Zipeado está la información necesaria y los archivos.INO. Pueden bajar un DOC, con el procedimiento y un ZIP con la información y los archivos INO.
Generalidades sobre Control PID
PID (Proporcional, Integral, Diferencial) es un algoritmo de control que trata de compensar las características 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 instantánea que utiliza para controlar el sistema.
Por lo general, se está generando una tensión para controlar el sistema, por lo que cada componente puede ser pensado como una contribución con un voltaje determinado a su salida final.
Va a haber una tensión correspondiente al estado actual del sistema (posición, 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) Tensión de consigna, correspondiente al estado que desea PV para llegar. Básicamente, queremos el lazo PID para impulsar el sistema a que SP y PV sean iguales.
En tercer lugar, tenemos una tensión de control, u, que corresponde al valor de la tensión instantánea que utiliza para conducir el sistema hacia el voltaje SP. La tensión de control u puede ser pensada como lo que se envía realmente al sistema para dirigirlo hacia donde se quiere que vaya. Es análogo a un acelerador de automovil.
El algoritmo PID es mostrado en la Ecuación siguiente:
Está la parte proporcional, integral y diferencial en la ecuación de arriba.
Las constantes
son usadas para “setear” el signo y la ganancia de cada parte de esta ecuación.
es el “error” proporcional que es
La variable t corresponde al tiempo que corre en el sistema, y es simplemente una variable de integración.
La parte proporcional de la ecuación tiene en cuenta la separación entre PV y SP.
La parte diferencial tiene en cuenta lo rápido que nos estamos moviendo ( si se acerca al SP muy rápido 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 contribución proporcional.
La parte integral de la ecuación tiene en cuenta el tiempo que hemos estado fuera del punto de ajuste , lo que contribuye más a nuestra salida cuanto más 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
Para todas mis experiencias, voy construyendo módulos con pequeñas plaquitas impresas, perforadas, que conecto al Arduino con sus cables. Una vez terminada la experiencia, desconecto todo y las guardo para las próximas. Aquí hay tres de ellas.
Imágenes del Ardu Graficador
Alimentación: 11 Volt.
Sin promediar Temperatura medida. Las variaciones en la temperatura medida causan variaciones multiplicadas por Kp = 8 o sea 8 veces mayores que la temperatura medida.
Los valores seteados son los del programa Pic_Basic_Alf.ini.
Alimentación: 11 Volt.
Promediando Temperatura medida.
Alimentación: 11 Volt.
Promediando Temperatura medida. Se enciman exactamente los trazos de Temperatura y Setpoint.
Programa PID_Basic_Alf
#include <PID_v1.h>
#define PIN_INPUT 0 // Sensor de temperatura
#define PIN_OUTPUT 9 // Salida PWM
#define PIN_Pot A5 // Potenciometro para Setpoint
double Setpoint, Input, Output; // Variables del PID
double x, y, z; // Variables para el Ardu Graficador
double Kp=8, Ki= .05, Kd= .05; // Constantes del PID
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT); // Seteos del PID_v1.h
void setup()
{
Serial.begin(115200); // Inicio del Serial
myPID.SetMode(AUTOMATIC); // Inicio del PID_v1.h
}
void loop()
{
for (int A = 0; A <= 29; A++) { Input = Input + analogRead(PIN_INPUT); }
Input = Input/30; // Input es entrada de la temperatura (Promediada)
Input = Input * 100 * 5/ 1024; // Pasar Imput a ºC
for (int B = 0; B <= 29; B++) { Setpoint = Setpoint + analogRead(PIN_Pot); }
Setpoint = Setpoint / 30; // Lectura y promedio del Setpoin
Setpoint = Setpoint * 100 / 1024; // 0 a 100
myPID.Compute(); // Calcular el Output
if (Output >140) {Output = 140;} // Limitar el máximo del PWM
analogWrite(PIN_OUTPUT, Output); // Escribir el PWM
Imprimir_para_ArduGraficador(); // Graficar las tres variables
delay(100); // Retardo
} // FIN del void loop()
void Imprimir_para_ArduGraficador() // Graficar las tres variables.
{
x = Input;
y = Output;
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");
}