Seguimos con el módulo de potencia con transistor TIP122 de 5 Amper y 50 Volt.
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 nuevo es que la salida en lugar de ser PWM, será on/off controlando un Relay. En el esquema, en lugar de Relay hay un transistor, pero los resultados se ven igualmente. 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 un trabajo tomado del ejemplo de Arduino.cc, para PID Relay Output. Usa la librería PID_v1.h, que está en la misma página.
Lo presento porque lo estuve estudiando, pero no le encontré resultados prácticos, porque la salida no se puede aplicar a un Relay mecánico, por la cantidad de veces que conecta/ desconecta.
No pude encontrar si hay algo mal, y si a alguien le interesa y lo modifica, bienvenido.
En el grafico pueden ver, en el trazo verde, como actúa el Relay.
El trazo amarillo es el Setpoint y el rojo, la medición de temperatura.
La conclusión es que un control Proporcional podría ser más efectivo, y ese será el próximo trabajo.
Para generalidades sobre PID ver cualquiera de los trabajos anteriores.
Imagen del ArduGraficador
La tensión de alimentación es de 10 Volt. Los valores de constantes están en el programa.
Esquema
Es igual a los anteriores trabajos, sin potenciómetro para variar el Setpoint. El LM35 está atado con un cablecito a la porcelana de la resistencia.
Programa PID_RelayOutput.ino
#include <PID_v1.h>
int RelayPin = 6;
double Setpoint, Input, Output;
// Kp, Kd, Ki
PID myPID(&Input, &Output, &Setpoint,400,0.4,0.2, DIRECT);
int WindowSize = 100;
unsigned long windowStartTime;
void setup()
{
Serial.begin(115200);
Setpoint = 44;
pinMode(RelayPin, OUTPUT);
windowStartTime = millis();
myPID.SetOutputLimits(0, WindowSize);
myPID.SetMode(AUTOMATIC);
}
void loop()
{
// Leer la entrada 30 veces para evitar oscilaciones perjudiciales.
for (int B = 0; B <= 29; B++) { Input = Input + analogRead(0); }
Input = Input /30;
Input = Input * 100 * 5 / 1024; // Convertir a grados entigrados
myPID.Compute();
unsigned long now = millis();
if(now - windowStartTime>WindowSize)
{ //time to shift the Relay Window
windowStartTime += WindowSize;
}
if(Output > now - windowStartTime) digitalWrite(RelayPin,HIGH);
else digitalWrite(RelayPin,LOW);
Imprimir_para_ArduGraficador(); // Graficar las tres variables
}
void Imprimir_para_ArduGraficador() // Graficar las tres variables.
{
double x = Input;
double y = Output;
double 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");
}