Вы находитесь на странице: 1из 6

Control proporcional de una resistencia calefactora.

Este programa es un control P (Proporcional), de diseo propio. Es para seguir investigando.


El programa es: P_ResLM35.ino.
Resistencia de 8.2 Ohm, LM35 como sensor de temperatura y correccin de parmetro por
Serial.
Usa el Ardu Graficador.
Anda bien con 12/ 13 V.
Para elegir un valor de Kp (Constante proporcional) hice la siguiente cuenta:
Temperatura inicial = 21 C
Set Point = 40 C
Error inicial = 40 -21 = 19
Kp = 255 / 19 = 14 aprox. Luego a este valor lo llev hasta 50, sin que y
llegara a 255.
La idea es que cuando arranque no llegue el PWM a 255.
Esta es la imagen del Ardu Graficador, para Tensin de 13.3 Volt, Set Point(y) de 40 C, Kp =
50, ymax = 200, ymin = 0, Retardo = 100.
La diferencia de temperaturas (x) es siempre menor a 0.4 C.
Si se baja la tensin, aumentar el nivel de Output (y) o sea el PWM que calienta la resistencia.

Los seteos del Graficador se ven en la pantalla.


La oscilacin del PWM no afecta a la Temperatura.
Despues de muchos minutos de oscilar, llega y sigue en este estado.
Toda esa oscilacin que se vea al principio, de los valores de la Salida al PWM que se notaban
en el grfico, y que no influn para nada en los valores de temperatura, quedaron estabilizados
naturalmente, y siguen estabilizados luego de unas dos horas.
Las oscilaciones de Temperatura estn entre 39.70 y 40.10C, siendo 40 el Setpoint.

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 .
En este trabajo, por simplicidad, usaremos solo el primer trmino de la ecuacin:

Lo que significa que el valor PWM que descargaremos en el


Pin 9, es igual a la constante Kp por el valor del error de la temperatura, o sea Temperatura de
Setpoint menos la temperatura real.
y = Kp * ( z x) (Ver el programa donde se usan estas variables)
Las tres variables se grafican en el Ardu Graficador, o se pueden ver en el Serial.
Esquema

Programa P_ResLM35.ino
// DEFINIR PINES
int PinSensor = A0;
int Res = 9; // Es PIN PWM
// DEFINIR VARIABLES
double x; // Temperatura
double y; // Salida PWM 0/255 Variable para ajustar
double z = 40; // Set Point Variable para ajustar
double Kp = 50; // Constante de proporcionalidad Variable para ajustar
double ymax = 200; // Maximo admitido de y (PWM) Variable para ajustar
double ymin = 0; // Minimo admitido de y (PWM) Variable para ajustar
int Retardo = 100; // Retardo en milisegundos Variable para ajustar
int y1, y2, y3, y4, y5, y6, y7, y8, y9, y10; // Para promediar la salida
// SETUP
void setup()
{
Serial.begin(115200);
pinMode(Res, OUTPUT); // configura el led (pin9) como salida
}
// LOOP
void loop()
{ // LEER X O SEA LA TEMPERATURA PROMEDIANDOLA CON 30 LECTURAS
for (int B = 0; B <= 29; B++) { x = x + analogRead(PinSensor); }
x = x /30; // Se leen 30 valores de x (Temperatura) para promediar
x = x * 100 * 5 / 1024; // Convertir a grados entigrados
// HACER EL CALCULO DEL CONTROL PROPORCIONAL Y = Kp * ERROR O SEA
SETPOINT - LECTURA DE TEMPERATURA
// SE PROMEDIAN 10 CALCULOS DE Y
y = Kp*(z-x); if (y < ymin) {y = ymin;} // Calculo com max y min acotado
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 valores para
promediar
analogWrite(Res,y); // Cargar la salida y al PWM
// CARGAR LA SALIDA O SEA EL CALCULO PROPORCIONAL AL PWM
// PREPARAR LA SALIDA SERIAL PARA EL ARDU GRAFICADOR
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");
// IF QUE ESPERA EL ENVIO DE UN VALOR PARA CORREGIR EN EL PROGRAMA
if (Serial.available() > 0) // Espera un valor para cambiar seteos
{int Ki;int Kd;
for (int A = 0; A < 4; A++) { // Para recibir de 1 a 4 valores
switch (A)
{
case 0:
z = Serial.parseFloat(); // Serial.parseFloat(); recibe valores separados por coma (Kp)
break;
case 1:
Ki = Serial.parseFloat();
break;
case 2:
Kd = Serial.parseFloat();
break;
case 3:
for (int B = Serial.available(); B == 0; B--) {
Serial.read(); // Limpia el Buffer
}
break;
}
}/*
Serial.print(" Kp,Ki,Kd = "); // Imprime en el Serial los valores nuevos
Serial.print(Kp); // Imprime en el Serial los valores nuevos
Serial.print(","); // Imprime en el Serial los valores nuevos
Serial.print(Ki); // Imprime en el Serial los valores nuevos
Serial.print(","); // Imprime en el Serial los valores nuevos
Serial.println(Kd); // Imprime en el Serial los valores nuevos
myPID.SetTunings(Kp, Ki, Kd); // Setea las nuevas constantes y reinicia el calculo*/
} // FIN del if (Serial.available() > 0)
// RETARDO
delay(Retardo);
} // FIN del void loop()

Вам также может понравиться