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. Controlaremos el encendido y luminosidad de la Lámpara de 12 Volt, 10 Watt 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. La salida es PWM. 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.
Este es otro trabajo de PID, para experimentar y dominarlo.
Está basado en el ejemplo de Arduino, PID_Basic, con algunas modificaciones, como eliminar alguna línea innecesaria en el Setup, agregado de un potenciómetro para seleccionar manualmente el Setpoint, agregado de promedios en las medicines de LDR, 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.
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 automóvil.
El algoritmo PID es mostrado en la Ecuación siguiente:
Está la parte proporcional, integral y diferencial en la ecuación.
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.
La diferencia con los trabajos anteriormente presentador de Resistencia calefactora y Sensor de temperatura, es que la reacción es extremadamente rápida, lo que nos lleva a jugar con otro set de valores de constantes(Kp = 1, Ki= 3, Kd= .1)
Imagen del Ardu Graficador
Secuencia completa desde el inicio del proceso.
El error es de 0.09 unidades.
Programa PID_Basic_LampLDR.ino
#include <PID_v1.h>
#define PIN_INPUT 0 // Sensor LDR
#define PIN_OUTPUT 9 // Salida PWM
double Setpoint, Input, Output; // Variables del PID
double x, y, z; // Variables para el Ardu Graficador
double Kp = 1, Ki= 3, Kd= .1; // 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 LDR (Promediada)
Input = map(Input,900,1050,100,0);
Input = Input * .999; // Para obligar a X que trabaje con decimales, lo que mejora la precisión.
Setpoint = 90; // Fijado en
myPID.Compute(); // Calcular el Output
if (Output >200) {Output = 200;} // Limitar el máximo del PWM
if (Output < 50) {Output = 50;}
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");
delay(100);
}
Esquema