Escolar Documentos
Profissional Documentos
Cultura Documentos
su facil sintonia y robustez en los diferentes procesos existentes. Este es utilizado para llevar
una variable fsica (Nivel, temperatura, velocidad, presin, etc) a un punto de operacin
especifico (set point). Al final del post hay un video explicativo de toda esta entrada.
Una vez termines de estudiar todo el contenido de este post puedes ver un segundo
ejemplo de PID en pic en un proceso real para una planta MOTOR GENERADOR danco
click aca
En esta entrada, vamos a aprender como podemos programar nuestro propio controlador PID
en nuestro microcontrolador. Para eso debemos tener claro, como es una estructura clasica
de control. Asi, que en la siguiente figura se muestra un lazo de control en malla cerrada
donde C es el controlador (en este caso el PID) y P es nuestro proceso.
donde r(k) es nuestra seal de referencia o set point, e(k) es nuestra seal de error (La resta
entre r(k) y y(k)), C(z) es nuestro controlador PID discreto, u(k) es nuestra seal de control
(Ley de control), P(z) es nuestra planta o proceso en representacin discreta, y(k) es nuestra
variable de salida a controlar.
Para entender como obtener estos tres parmetros de nuestro proceso, vamos a hacerlo
directamente en el ejemplo, para que aprendamos de manera practica a modelar un proceso
rpidamente y posteriormente poder sintonizar o ajustar nuestro controlador PID para que
pueda controlar dicho proceso.
Ejemplo
En este ejemplo vamos a programar un controlador PID en nuestro PIC, para controlar la
temperatura de un horno y poderla mantener en el punto de operacin deseado, en este caso
se le pide al ingeniero de control que el horno debe mantener su temperatura constante en
torno de los 150.0C. Se pide adems al ingeniero, que adapte un LCD 420 para poder
visualizar la temperatura actual del horno, y el setpoint.
Antes que nada vamos a necesitar los siguientes componentes en el PROTEUS para poder
simular nuestro proceso: PIC16F887, IRFZ44N, LM044L, CELL, RES, OVEN.
Comencemos primero con nuestro proceso (El horno de temperatura), vamos a buscar el
horno en proteus (OVEN) y vamos a darle doble click para configurarle sus parmetros:
Oven Time Constant (sec): es la constante de tiempo del horno. Para evitar una
simulacin muy larga, vamos a colocarlo en 10 segundos.
Heater time constant (sec): es la constante de tiempo del calefactor. Para evitar
simulaciones largas la ponemos en 1 segundo.
Thermal resistence to ambient (C/W): resistencia trmica horno ambiente. Valor por
defecto 0.7.
Heating Power (W): es la potencia del horno. A fin de que nuestro sensor de
temperatura no sobrepase los 5 voltios de tensin, vamos a colocar este parmetro en 52
W.
Como sensor de temperatura se pueden usar termopares, termocuplas, RTD, etc. Ahora,
como el dispositivo OVEN tiene un terminal que dice T, el cual nos indica la temperatura del
horno en grados CELCIUS. Para esto es conveniente utilizar un divisor de voltaje por 100 para
obtener la seal del horno en milivoltios. Asi, 25C corresponderan a 250mV.
Listo, una vez configurado nuestro horno, vamos a proceder a identificar el modelo
matemtico que mas o menos represente la dinmica de nuestra variable de proceso (La
temperatura). Note que en nuestro diagrama, estamos alimentando el horno con una batera
de 12V, para poder determinar nuestro modelo matemtico, vamos a tener que hacer una
identificacin off-line. Para eso necesitamos estimular nuestro horno y almacenar los datos
que este nos da, para poder graficar su comportamiento. Asi, estimulamos nuestro horno con
un valor del 10% al 20% de nuestro valor nominal que son 12V. Entonces vamos a energizar
el horno con 2V y graficar la curva que genera.
(En el video de youtube, les explicar como obtener esa grfica desde el proteus)
Miremos entonces la respuesta que obtuvimos de nuestra grfica:
Vemos que la grfica comienza en 25C y llega hasta 132C y que para conseguir esta
respuesta tuvimos que alimentar la resistencia con 2V. As podemos obtener la ganancia del
proceso con la siguiente formula:
Osea que el
, esto era de esperar, pues nosotros mismos ya habamos colocado una
contaste de tiempo de 10 en los parmetros del horno.
Si te est sirviendo de algo la informacin de la pagina, podras invitarme a un caf y
ayudarme a seguir manteniendo en pie el sitio WEB. Solo cuesta $2USD y me ayudaras
enormemente a seguir con mi trabajo. Muchas Gracias por tu visita.
Por ultimo, solo nos falta averiguar el valor del retardo, para eso tenemos que ver cuanto se
demora en responder el horno una vez energizamos. Vemos que el responde
instantaneamente osea que podra tener un retardo nulo. Para efectos prcticos, vamos a
colocar un retardo bien pequeo para la tcnica de control por Ziegler y Nichols
y un
retardo de
para las otras dos tcnicas que voy a ensearles.
As que en trminos generales, nuestro proceso del horno est representado por la siguiente
funcin de transferencia:
Con nuestro proceso identificado podemos calcular los parmetros del controlador (
para eso utilizamos cualquiera de estas tres tcnicas:
),
1.
3.
4.
1.
2.
Para nuestro caso del horno escogeremos un
menor que .
El control discreto PID viene dado por:
donde:
Con esto, la ley de control que vamos a ingresar a nuestro PIC sale del control PID discreto
(Despejando u(k))
As, u(k) quiere decir la ley de control actual, u(k-1) es la ley de control un instante de
muestreo atrs, e(k) es el error actual (Referencia temperatura), e(k-1) es el error un
instante de muestreo atrs, e(k-2) es el error dos instantes de muestreo atrs.
Implementacin
Para implementar el control, debemos hacer uso de un MOSFET de potencia que sea capaz
de aguantar la corriente del horno (4,3A), para eso se selecciono el MOSFET de combate
IRFZ44N, el cual en el GATE ser activado por una seal PWM a fin de poder regular la
potencia del Horno (click aqui para ver entrada de PWM).
Por ltimo, quiero resaltar que el set-point o referencia ser fija a 150C, queda abierto el
cdigo para que tu puedas modificar ese parmetro haciendo por ejemplo una comunicacin
serial (click aqui para ver entrada de Comunicacion Serial) o colocndole algn teclado
matricial (click aqui para ver entrada de teclado matricial).
En el video explico detalladamente todos los pasos y procedimientos a tener en cuenta para
implementar el control PID, como por ejemplo el trabajar siempre de manera estandarizada las
seales (En este caso, trabajo todo en milivoltios). Tambien explico el cdigo y como se hace
la identificacin off-line. No olviden compartir este post si les gust, delen me gusta y
suscribanse a mi canal de Youtube.
Una vez termines de estudiar todo el contenido de este post puedes ver un segundo
ejemplo de PID en pic en un proceso real para una planta MOTOR GENERADOR danco
click aca
Cdigo de Implementacin:
#INCLUDE <16F887.h>
#DEVICE ADC=10
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#include <lcd420.c>
//Configura direccion de memoria de los puertos A,B,C,D
#BYTE PORTA= 5
#BYTE PORTB= 6
#BYTE PORTC= 7
#BYTE PORTD= 8
int veces=39,seg=0;
int16 adc,control=0;
float yM=0,R=1500.0,e=0.0,e_1=0.0,e_2=0.0,u=0.0,u_1=0.0;
float kp,ti,td,q0,q1,q2,T=0.1;
float k=53.5,tao=10.0,theta=1.0;
float TsMA,Wn,P1,P2;
VECES--;
SET_RTCC(246);
IF(VECES==0)
}
if(seg==1)
{
seg=0;
output_toggle(pin_d0);
//Comienzo la ley de control
e=R-yM;
// Controle PID
u = u_1 + q0*e + q1*e_1 + q2*e_2; //Ley del controlador PID discreto
if (u >= 1000.0)
minimo
u = 1000.0;
if (u <= 0.0)
u = 0.0;
control=u;
e_1=e;
u_1=u;
}
}
void main()
{
set_tris_c(0);
set_tris_d(0);
setup_timer_2(t2_div_by_4,249,1); //Configuracion de Timer 2 para
establecer frec. PWM a 1kHz
setup_ccp1(ccp_pwm);
set_pwm1_duty(0);
setup_adc_ports(sAN0);
setup_adc(adc_clock_internal);
digital)
set_adc_channel(0);
Temperatura
SET_RTCC(246);
enable_interrupts(GLOBAL);
LCD_INIT();
//Inicializo el LCD
LCD_PUTC("\f");
//Limpio el LCD
//*************************************************************************//
//************* DISEO POR ASIGNACIN DE 2 POLOS REALES
****************//
//*************************************************************************//
/*
TsMA=4;
Wn=3/(TsMA);
kp=(P1*tao-1)/k;
//Calculo de Kc
ti=(k*kp)/(P2*tao);
//Calculo de ti
*/
//*************************************************************************//
//***************** DISEO POR CANCELACIN DE POLOS
*******************//
//*************************************************************************//
/*
TsMA=1;
kp=(tao)/(TsMA*k);
ti=tao;
td=0;
*/
//*************************************************************************//
//***************** SINTONIA POR ZIEGLER y NICHOLS
*******************//
//*************************************************************************//
kp=(1.2*tao)/(k*theta);
ti=2*theta;
td=0.5*theta;
//*************************************************************************//
while(1)
{
lcd_gotoxy(1,1);
printf(lcd_putc,"Temp: %f",yM/10);
lcd_gotoxy(1,2);
printf(lcd_putc,"SetPoint: %2.2f C ",R/10);
lcd_gotoxy(1,3);
printf(lcd_putc,"Error: %2.2f C ",e/10);
lcd_gotoxy(1,4);
printf(lcd_putc,"u(ley Con): %ld ",control);
}
}