Você está na página 1de 10

Control PID con anti-windup en PIC

Objetivo: Un sistema de control de temperatura configurable mediante un panel de control (Teclado mas display LCD), en donde se puede seleccionar entre control On/Off o PID, ingreso de Temperatura deseada (Set Point), cambio de alguno de los parmetros del PID (Kp, Ti, Td), Visualizacin de las variables (Temperatura actual del sistema, Temperatura deseada, Kp, Ti, Td) y un simple datalogger activable (Enva por RS232 temperatura cada ciertos ms) El sistema a controlar ser el horno Over que trae Proteus, excelente para esta prctica ya que trae un terminal donde nos indica la temperatura del horno necesaria para la realimentacin. El Over lo configuramos de la siguiente manera para hacer ms rpidas las simulaciones: 25, 0.7, 1, 1, 100.

Identificacin del Sistema.

En este caso para identificar el sistema simplemente aplique un escaln de 1 volts y determin la salida. Captur los datos cada 100ms, y con estos ingres a la utilidad ident de Matlab. Solo hay que aplicar un escaln, sino aplicar una entrada de varios niveles, y as obtener un sistema estimado ms aproximado al real.

En ident, seleccione oe221 logrando una identificacin del 99.65%. El modelo del sistema resultante para Ts=0.1s: GZ=(0.6566z+0.6145)/(z^2-1.809z+0.8178) Aplicando D2C determinamos el modelo de sistema continuo: GS=(-0.0027s+140.4)/(s^2+2.011s+0.9723) Seleccin de muestro a lazo cerrado. Este valor esta ntimamente relacionado con el ancho de banda del sistema y las velocidades razonables de muestro estn entre 6 y 10 veces este valor. En Matlab determinamos el bode del sistema, dando un ancho de banda de 4.4 Hz, con esto seleccionamos 0.02 segundos como periodo de muestro. (1/104.4Hz). Utilizando C2D y Ts = 0.02 s determinamos el sistema muestreado : GZ=(0.0276z+0.0274)(z^2-1.96z+0.9606) El control PID a utilizar es el siguiente:

Como se ve ya tiene implementado el control anti-windup. El efecto windup aparece al arrancar el sistema o en cualquier otra situacin, donde aparece un error muy grande durante un tiempo prolongado. Esto har que el trmino integral aumente para reducir el error. Pero si nuestro actuador es limitado, con esto me refiero que la tensin que podemos aplicarle al horno solo (en este caso) esta entre 0 y 5V, se saturar pero el termino integral seguir creciendo. Cuando el error se reduce, la parte integral tambin comenzar a reducirse pero desde un valor muy alto, llevando mucho tiempo hasta que logre la estabilidad, generando fluctuaciones exageradamente grandes.

Discretizacin: Para la parte integral se aproxima a sumas sucesivas, y la parte derivativa por una diferencia:

Sintonizacin del Control PID (Sintonizacin de PID)

En este caso utilizo el mtodo de Ziegler-Nichols basado en la respuesta en frecuencia. Se realimenta la planta con un regulador proporcional aumentando su ganancia hasta que el sistema presente una oscilacin no amortiguada, determino la ganancia proporcional y el periodo de la oscilacin: Kc=1.4392, tc=0.44s Kp=0.6Kc=0.8635, Ti=0.5tc=0.22, Td=0.125tc=0.055 Funcin de transferencia del PID discreto sin windup U(z)/E(z)=(q0z^2+q1z+q2)(z(z-1)) Con el control PID sin windup utilizamos la herramienta sisotool para ver el resultado obtenido, y tambin si es posible mejorarlo.

Por ejemplo, un resultado mejor se obtiene modificando los ceros del control PID a 0.95; 0.95 y una ganancia de K=8.57. Con estos valores los nuevos parmetros del PID son: Kp=0.8142, Ti=0.7609, Td=0.1899

En simulink podemos ver el efecto que tiene la saturacin del actuador:

Control On/Off (todo o nada) Es un sistema de control muy simple, y como su nombre lo indica, la seal de control en este caso ser 0 Volts si Temperatura del horno es mayor a la deseada, y 5 Volts si es menor a la deseada. Mas info, Control Todo o nada Programacin El control PID ya esta calculado por lo menos en teora. Con esto pasamos a realizar el cdigo que se ejecutar cada 20ms. Para ello creamos una tarea: (Sin trabajar con RTOS se puede crear una interrupcin que se ejecute cada 20ms) #task(rate=20ms,max=1ms) void ControlSistema(void){ Medida=read_adc(); TempReal=Medida; TempReal=(TempReal*500)/1024; eT=TempRef-TempReal; if(SistControl==1){ //Clculo error

uT=q0*eT - q1*eT_1 + q2*eT_2 + uT_1; //Clculo de la salida PID (uT=[Volt]) rT=(uT*1000)/5; //duty cycle maximo 1000 -> 5V./* <<<<< AntiWindup >>>>>*/ if (rT>1000){ //Salida PID si es mayor que el 1000.uT=(uT + 5*p0)*p00; rT=1000; } if (rT<0n){ //Salida PID si es menor que el 0 uT=uT*p00; rT=0; } /* <<<<< Transferencia de salida PID a seal PWM >>>>>*/ ControlPWM=rT; set_pwm1_duty(ControlPWM); /* <<<<< Guardar variables para proximo estado >>>>>*/ eT_2=eT_1; eT_1=eT; uT_1=uT; }else{ // Control On-Off if(eT>0){output_high(PIN_C2);} else{output_low(PIN_C2);} } } En RTOS CCS la prioridad de tareas, con esto me refiero si hay tareas que se ejecutan con el mismo periodo o con algn mltiplo del mismo se da en el orden en que se definen en el programa As que como esta tarea es la mas importante se define primero a todas, excepto que exista alguna otra de inicializacin del sistema. Men de control Como objetivo se planteo armar un panel de control, ste tiene un men que debe ser visualizado en display segn las teclas presionadas de movimiento. La impresin del men en el display se hace por medio de una tarea, que se ejecuta

cada 1ms cuando es habilitada. Esta tarea enva un carcter o comando a la vez, de esta manera hacemos la impresin de manera ms dinmica que al realizar un simple printf(lcd_putc,Menu Principal \n ->), lnea que dependiendo de los datos que se enve puede llegar a demorar unos 5ms. Puede que en este ejemplo no haya sido necesario, pero fue til para aplicar algunos comandos de rtos Entonces para imprimir un mensaje en el LCD se usaron 2 buffer de 16 elementos para cada lnea, dos variables que indican el largo de los string a escribir y una adicional para indicar si es necesario borrar el display al iniciar la escritura. La carga de un mensaje sera as: strcpy(BufferLCD1,">Datos"); strcpy(BufferLCD2,"Configuracion"); LengthMsj1=strlen(BufferLCD1); LengthMsj2=strlen(BufferLCD2); Print=1; // 1 Requiere borrar LCD. Al completar la cargar de los buffer se habilita la tarea que se encarga de imprimir el mensaje: #task(rate=1ms,max=1ms) void ImprimirLCD(void){ int j; if(Print==1){ lcd_comand(1); Print=0; rtos_yield(); } for(j=0;j // Borramos display?

// Se "duerme" hasta el proximo ciclo.-

lcd_putc(BufferLCD1[j]); rtos_yield(); } if(LengthMsj2!=0){ lcd_gotoxy(1,2); rtos_yield(); } // Si hay caracteres a imprimir en la segunda linea.. // ..salta a la siguiente a la linea 2.

for(j=0;j lcd_putc(BufferLCD2[j]); rtos_yield(); } if(PosMod!=0){ // Utilizado para correr el cursor cuando se modifican // los parametros.lcd_gotoxy(PosMod,1); // Vuelve cursor para modificar valores.rtos_yield(); } rtos_disable(ImprimirLCD); } Control del men mediante teclado. Para detectar cuando se ha presionado una tecla se utiliza la interrupcin por cambio de estado de RB4-RB7. Al activarse la interrupcin se testea la tecla pulsada, este dato se coloca en cola de mensajes y se habilita la tarea que lo tratar. Esta tarea recibe el dato, ejecuta una rutina que modifica las variables de control del men, carga los buffer de visualizacin, habilita la tarea que realiza la impresin del men en el display y se deshabilita as misma. #int_RB void RB_isr(void) { Tecla=TestTeclado(); //Testea la Tecla Pulsada.if(Tecla!=16){ //Tecla y no falsa alarma?.rtos_msg_send(VisualizacionLCD,Tecla); rtos_enable(VisualizacionLCD); } } void VisualizacionLCD(void){ if(rtos_msg_poll()&gt;0){ SeleccionMenu(rtos_msg_read()); //Dependiendo la Tecla recibida se ubica //dentro del Menu.if(Panel==1){ //Si no se a pedido apagar...

if(Enter==0){ //Y si no se ha presionado Enter... ImpresionMenu(); //Cargamos los buffer segun la posicion //en el menu para impresion en LCD.} rtos_enable(ImprimirLCD); //Habilitamos tarea para impresion en LCD.} } rtos_disable(VisualizacionLCD); } Seales obtenidas de la simulacin: Control PID:

Control On-Off:

Você também pode gostar