TODOPIC

Microcontroladores PIC => RTOS => Mensaje iniciado por: Suky en 10 de Julio de 2009, 02:34:22

Título: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: Suky en 10 de Julio de 2009, 02:34:22
Este ejemplo surgió de una práctica que realice para usar el CCS RTOS. El resultado fue un ejemplo, creo yo, bastante completo en la implementación de un control PID y el RTOS de CCS. Así que lo documenté y lo posteo, seguramente a alguien le va a servir la info expuesta.

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 parámetros del PID (Kp, Ti, Td), Visualización de las variables (Temperatura actual del sistema, Temperatura deseada, Kp, Ti, Td) y un simple datalogger activable (Envía por RS232 temperatura cada ciertos ms)
El sistema a controlar será el horno Over que trae Proteus, excelente para esta práctica ya que trae un terminal donde nos indica la temperatura del horno necesaria para la realimentación. El Over lo configuramos de la siguiente manera para hacer más rápidas las simulaciones: 25, 0.7, 1, 1, 100.

(http://img188.imageshack.us/img188/1442/paneldecontrol.jpg)

Identificación del Sistema  (Apuntes de Identificación de sistemas (http://www.epsem.upc.edu/~esaii/assign/ident/assign.html))
(http://img190.imageshack.us/img190/3039/sistemaaa.jpg)
En este caso para identificar el sistema simplemente aplique un escalón de 1 volts y determiné la salida. Capturé los datos cada 100ms, y con estos ingresé a la utilidad ident de Matlab.  Aquí blackgat (http://www.todopic.com.ar/foros/index.php?topic=24599.msg200365#msg200365) explica paso a paso como determinar el sistema usando esta utilidad de Matlab. Este es solo un ejemplo así que no me preocupe por obtener un modelo bien determinado, en ese caso no solo hay que aplicar un escalón, sino aplicar una entrada de varios niveles, y así obtener un sistema estimado más aproximado al real.
(http://img38.imageshack.us/img38/7519/sealident.jpg)

En ident, seleccione oe221 logrando una identificación del 99.65%. El modelo del sistema resultante para Ts=0.1s:
GZ=\frac{0.6566z+0.6145}{z^2-1.809z+0.8178}
Aplicando D2C determinamos el modelo de sistema continuo:
GS=\frac{-0.0027s+140.4}{s^2+2.011s+0.9723}

Selección de muestro a lazo cerrado.
Este valor esta íntimamente relacionado con el ancho de banda del sistema y las velocidades razonables de muestro están 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/10•4.4Hz). Utilizando C2D  y Ts = 0.02 s determinamos el sistema muestreado :
GZ=\frac{0.0276z+0.0274}{z^2-1.96z+0.9606}

Control PID a aplicar
(Ver Apunte PID (http://iaci.unq.edu.ar/Materias/Cont.Digital/Apuntes/ApuntePagina/15-PID.pdf))
El control PID a utilizar es el siguiente:
(http://img191.imageshack.us/img191/6304/controlatinwindup.jpg)
Como se ve ya tiene implementado el control anti-windup. El efecto windup aparece al arrancar el sistema o en cualquier otra situación, donde aparece un error muy grande durante un tiempo prolongado. Esto hará que el término integral aumente para reducir el error. Pero si nuestro actuador es  limitado, con esto me refiero que la tensión 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 también comenzará a reducirse pero desde un valor muy alto, llevando mucho tiempo hasta que logre la estabilidad, generando fluctuaciones exageradamente grandes.
(http://img194.imageshack.us/img194/8839/ecuacionespidcont.gif)
Discretización:
Para la parte integral se aproxima a sumas sucesivas, y la parte derivativa por una diferencia:
(http://img359.imageshack.us/img359/5052/ecuacionespid.gif)

Sintonización del Control PID Sintonización de PID (http://www.dia.uned.es/~fmorilla/MaterialDidactico/ajuste_empirico.pdf)
En este caso utilizo el método 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 oscilación no amortiguada, determino la ganancia proporcional y el periodo de la oscilación:
Kc=1.4392, tc=0.44s
Kp=0.6Kc=0.8635, Ti=0.5tc=0.22, Td=0.125tc=0.055

Función de transferencia del PID discreto sin windup
\frac{U(z)}{E(z)}=\frac{q0z^2+q1z+q2}{z(z-1)}
Con el control PID sin windup utilizamos la herramienta sisotool para ver el resultado obtenido, y también si es posible mejorarlo.
(http://img191.imageshack.us/img191/7171/pidnormal.jpg)

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 parámetros del PID son:
Kp=0.8142, Ti=0.7609, Td=0.1899

(http://img188.imageshack.us/img188/2149/pidmejorado.jpg)

En simulink podemos ver el efecto que tiene la saturación del actuador:
(http://img200.imageshack.us/img200/5512/pidconsaturacion.jpg)
Resultado obtenido al aplicar antiwindup:
(http://img188.imageshack.us/img188/6164/pidconwindupsignal.jpg)


Control On/Off (todo o nada :?)

Es un sistema de control muy simple, y como su nombre lo indica, la señal 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 (http://materias.fi.uba.ar/7609/material/Clase%2001%20Intro/07%20-%20Control%20Todo%20o%20Nada.pdf)
Título: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: Suky en 10 de Julio de 2009, 02:36:07
El control PID ya esta calculado por lo menos en teoría  :mrgreen: Con esto pasamos a realizar el código que se ejecutará cada 20ms. Para ello creamos una tarea:

Código: C
  1. #task(rate=20ms,max=1ms)
  2. void ControlSistema(void){
  3.    Medida=read_adc();
  4.    TempReal=Medida;
  5.    TempReal=(TempReal*500)/1024;
  6.    
  7.    eT=TempRef-TempReal;                      //Cálculo error
  8.    
  9.    if(SistControl==1){
  10.       uT=q0*eT - q1*eT_1 + q2*eT_2 + uT_1;      //Cálculo de la salida PID (uT=[Volt])
  11.       rT=(uT*1000)/5;                           //duty cycle maximo 1000 -> 5V.-
  12.       /* <<<<< AntiWindup  >>>>>*/
  13.       if (rT>1000){                              //Salida PID si es mayor que el 1000.-
  14.          uT=(uT + 5*p0)*p00;      
  15.          rT=1000;
  16.       }
  17.       if (rT<0n){                              //Salida PID si es menor que el 0
  18.          uT=uT*p00;  
  19.          rT=0;
  20.       }
  21.       /* <<<<< Transferencia de salida PID a señal PWM >>>>>*/
  22.       ControlPWM=rT;                            
  23.       set_pwm1_duty(ControlPWM);
  24.       /*  <<<<< Guardar variables para proximo estado >>>>>*/
  25.       eT_2=eT_1;
  26.       eT_1=eT;
  27.       uT_1=uT;
  28.    }else{                               // Control On-Off
  29.       if(eT>0){output_high(PIN_C2);}
  30.       else{output_low(PIN_C2);}
  31.    }
  32. }

En RTOS CCS la “prioridad” de tareas, con esto me refiero si hay tareas que se ejecutan con el mismo periodo o con algún múltiplo 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 inicialización del sistema.

Menú de control
Como objetivo se planteo armar un panel de control, éste tiene un menú que debe ser visualizado en display según las teclas presionadas de movimiento.
La impresión del menú en el display se hace por medio de una tarea, que se ejecuta cada 1ms cuando es habilitada. Esta tarea envía un carácter o comando a la vez, de esta manera hacemos la impresión de manera más dinámica  que al realizar un simple printf(lcd_putc,”Menu Principal \n     ---->”), línea que dependiendo de los datos que se envíe puede llegar a demorar unos 5ms. Puede que en este ejemplo no haya sido necesario, pero fue útil para aplicar algunos comandos de rtos :mrgreen:

Entonces para imprimir un mensaje en el LCD se usaron 2 buffer de 16 elementos para cada línea, 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 sería así:
Código: C
  1. strcpy(BufferLCD1,">Datos");
  2.          strcpy(BufferLCD2,"Configuracion");
  3.          LengthMsj1=strlen(BufferLCD1);
  4.          LengthMsj2=strlen(BufferLCD2);
  5.          Print=1; // 1 Requiere borrar LCD.

Al completar la cargar de los buffer se habilita la tarea que se encarga de imprimir el mensaje:
Código: C
  1. #task(rate=1ms,max=1ms)
  2. void ImprimirLCD(void){
  3. int j;
  4.  
  5.    if(Print==1){                 // Borramos display?
  6.       lcd_comand(1);    
  7.       Print=0;
  8.       rtos_yield();              // Se "duerme" hasta el proximo ciclo.-
  9.    }
  10.    for(j=0;j<LengthMsj1;j++){    // Si hay caracteres en Primer linea envia al LCD.-
  11.      lcd_putc(BufferLCD1[j]);
  12.      rtos_yield();              
  13.    }
  14.    if(LengthMsj2!=0){            // Si hay caracteres a imprimir en la segunda linea..
  15.       lcd_gotoxy(1,2);           // ..salta a la siguiente a la linea 2.
  16.       rtos_yield();
  17.    }
  18.    for(j=0;j<LengthMsj2;j++){    // Si hay caracteres en Segunda linea envia al LCD.-
  19.       lcd_putc(BufferLCD2[j]);
  20.       rtos_yield();
  21.    }
  22.    if(PosMod!=0){                // Utilizado para correr el cursor cuando se modifican
  23.                                  // los parametros.-
  24.       lcd_gotoxy(PosMod,1);      // Vuelve cursor para modificar valores.-
  25.       rtos_yield();
  26.    }
  27.    rtos_disable(ImprimirLCD);
  28. }

Control del menú mediante teclado.
Para detectar cuando se ha presionado una tecla se utiliza la interrupción por cambio de estado de RB4-RB7. Al activarse la interrupción 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 visualización, habilita la tarea que realiza la impresión del menú en el display y se deshabilita así misma.

Código: C
  1. #int_RB
  2. void  RB_isr(void)
  3. {
  4.    Tecla=TestTeclado();                            //Testea la Tecla Pulsada.-
  5.    if(Tecla!=16){                                  //Tecla y no falsa alarma?.-
  6.          rtos_msg_send(VisualizacionLCD,Tecla);    
  7.          rtos_enable(VisualizacionLCD);
  8.    }
  9. }

Código: C
  1. void VisualizacionLCD(void){
  2.    if(rtos_msg_poll()>0){
  3.       SeleccionMenu(rtos_msg_read());  //Dependiendo la Tecla recibida se ubica
  4.                                        //dentro del Menu.-
  5.       if(Panel==1){                    //Si no se a pedido apagar...
  6.          if(Enter==0){                 //Y si no se ha presionado Enter...
  7.             ImpresionMenu();           //Cargamos los buffer segun la posicion
  8.                                        //en el menu para impresion en LCD.-
  9.          }
  10.          rtos_enable(ImprimirLCD);     //Habilitamos tarea para impresion en LCD.-
  11.       }
  12.    }
  13.    rtos_disable(VisualizacionLCD);
  14. }
Título: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: Suky en 10 de Julio de 2009, 02:41:23
Un video de cómo sería el sistema simulado:
Señales obtenidas de la simulación:
Control PID:
(http://img38.imageshack.us/img38/5352/piddigital.jpg)
Control On-Off:
(http://img188.imageshack.us/img188/5784/controlonoff.jpg)

Esta claro que para un sistema real hay muchas cosas adicionales a tener en cuenta :mrgreen:

Adjunto código.
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: Nocturno en 10 de Julio de 2009, 05:54:48
Espectacular, Suky. Muchas gracias por compartirlo
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: NANO1985 en 10 de Julio de 2009, 12:54:45
t pasaste hermano!, muy buen documentoooo! sin palabras....
muchisimas gracias por compartirlo
Saludos  8)
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: Gonzalo_BlackHawk en 10 de Julio de 2009, 18:38:01
Grande Suky! Una muy buena clase de control para todos nosotros...

Te pasaste!  :-/ :-/ :-/ :-/

Saludos.
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: kcire en 10 de Julio de 2009, 19:39:51
Muy buen trabajo Ale, felicidades y gracias por compartirlo.

Un saludo,  :lol:
Erick
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: barral en 15 de Julio de 2009, 04:04:13
Estupendo. Muy bien explicado y documentado.

Cada vez más tengo ganas de tener suficiente tiempo para meterme en RTOS....

Saludos
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: Nichita en 15 de Julio de 2009, 17:30:51
Muy bueno!!!, gracias por compartirlo. :mrgreen:
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: fidodido18 en 09 de Agosto de 2009, 21:29:33
Si no viniera de Suky diria algo como "Te sobraste hermano!" pero el ya nos tiene acostumbrado a semejantes post!

sobre todo la humildad que le pone, diciendo que para un sistema real faltan muchas cosas mas a considerar, la verdad no creo que falte mucho mas, y te lo digo yo que he implementado mas de 3 sistemas reales (a pequeña escala).

lo unico que le falta al documento es la explicacion para pasar la respuesta del sistema analogico a digital, pero se asume que eso lo debe saber cualquiera que se atreva a ver un PID digital..

En hora buena Suky, felicitaciones!
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: Suky en 09 de Agosto de 2009, 21:39:56
Si no viniera de Suky diria algo como "Te sobraste hermano!" pero el ya nos tiene acostumbrado a semejantes post!

sobre todo la humildad que le pone, diciendo que para un sistema real faltan muchas cosas mas a considerar, la verdad no creo que falte mucho mas, y te lo digo yo que he implementado mas de 3 sistemas reales (a pequeña escala).

lo unico que le falta al documento es la explicacion para pasar la respuesta del sistema analogico a digital, pero se asume que eso lo debe saber cualquiera que se atreva a ver un PID digital..

En hora buena Suky, felicitaciones!
Gracias fidodido18!

Con respecto a la obtención del sistema digital indique el post de Blackgat, y como dices, el que tiene conocimiento lo entiende  :mrgreen:

Saludos!
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: Renatox_ en 12 de Agosto de 2009, 02:12:08
Muchas gracias Suky por la informacion, nos va a servir a todos lo que vemos control, y yo pensaba que el control PID digital C(z)=(qoz^2+q1z+q2)/(z(z-1)) ya tenía incluido el antiwinup pero estaba en un error, la diferencia de resultados que da uno y otro control son asombrosas, con antiwindup se protege más al actuador, voy a probarlo con mi PID.

Una pregunta primero hallastes unos parametros kp, ti, td en base a ziger nichols,, luego lo cambiastes por otrs valores para que te salga la respuesta mas amortiguada,,en base a que criterio lo escojistes.
Por cierto a los sistemas que responden siempre en forma sobreamortiguada, es decir sin sobreimpulso es recomendable aproximarlos a un sistema de primer orden.

Para fidodido sobre cambiar de sistemas continuos a discretos hay que usar la transformada z con un periodo de muestreo, el mismo que del control y anteponerle un ZOH a la planta, eso se hace a mano cuando uno lleva control digital pero luego solo debemos poner en matlab c2d(Gz,T,'zoh').

saludos.
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: msegredo en 30 de Agosto de 2009, 00:38:25
Muy bueno! Podrias subir el codigo completo? Muchas gracias.
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: Suky en 30 de Agosto de 2009, 10:18:48
Una pregunta primero hallastes unos parametros kp, ti, td en base a ziger nichols,, luego lo cambiastes por otrs valores para que te salga la respuesta mas amortiguada,,en base a que criterio lo escojistes.
Perdón, no había leído esta respuesta. Observando el lugar de
\xi
y
\omega
T. Realizando un pequeño ajuste sin alejarnos mucho de los ptos ya establecidos. Aprovechando la utilidad de sisotool, porque esto analíticamente no lo sacamos nunca  :mrgreen:

Muy bueno! Podrias subir el codigo completo? Muchas gracias.
Bienvenido msegredo! Revisa en el 3º post esta lo que buscas  :mrgreen:


Saludos!
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: fabianjsm en 30 de Agosto de 2009, 12:39:37
Muy bueno Suky, que nivel he, la verdad que te pasaste!
Tenes un 10!  :-/
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: msegredo en 31 de Agosto de 2009, 23:02:25
Muy bueno! Podrias subir el codigo completo? Muchas gracias.
Bienvenido msegredo! Revisa en el 3º post esta lo que buscas  :mrgreen:

Saludos!

Sin palabras. Sabes que tengo problemas para abrir el archivo con isis protheus, tengo la version 7.2 SP6 (Build 5368) with advanced simulation, me dice que tengo una version mas vieja de la que fue generado el archivo. Como podre solucionar este tema?
Gracias Suky.
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: Suky en 31 de Agosto de 2009, 23:57:48
Muy bueno! Podrias subir el codigo completo? Muchas gracias.
Bienvenido msegredo! Revisa en el 3º post esta lo que buscas  :mrgreen:

Saludos!

Sin palabras. Sabes que tengo problemas para abrir el archivo con isis protheus, tengo la version 7.2 SP6 (Build 5368) with advanced simulation, me dice que tengo una version mas vieja de la que fue generado el archivo. Como podre solucionar este tema?
Gracias Suky.


Esta realizado con 7.4, pero te subo uno convertido para 7.0, supuestamente  :tongue:

Saludos!
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: MGLSOFT en 01 de Septiembre de 2009, 00:23:52
A mi me funciona bien en 7.6.... :mrgreen:
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: gera en 01 de Septiembre de 2009, 02:05:08
Excelente suky!!! te pasaste! :-/ :-/ y este año q curso sistemas de control me viene de 10!! :D
gracias!!
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: msegredo en 02 de Septiembre de 2009, 22:20:38
Muy bueno! Podrias subir el codigo completo? Muchas gracias.
Bienvenido msegredo! Revisa en el 3º post esta lo que buscas  :mrgreen:

Saludos!

Sin palabras. Sabes que tengo problemas para abrir el archivo con isis protheus, tengo la version 7.2 SP6 (Build 5368) with advanced simulation, me dice que tengo una version mas vieja de la que fue generado el archivo. Como podre solucionar este tema?
Gracias Suky.


Esta realizado con 7.4, pero te subo uno convertido para 7.0, supuestamente  :tongue:

Saludos!

Gracias! grandioso.
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: micro_pepe en 22 de Septiembre de 2009, 16:01:11
Es un proyecto excelente, yo ando trasteando ultimamente con estos temas, no se si al final sera una fuente conmutada o un control de PH, o las dos... el caso es que me viene muy bien tener un ejemplo completo.

Una cuestion:  uT entiendo que puede variar de 0 a 5 porque el voltaje de referencia del ADC es 5V?

Saludos y gracias.

Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: Suky en 22 de Septiembre de 2009, 16:16:36
uT es la señal de control a aplicar al sistema, y este caso está limitado en el ejemplo entre 0 y 5V. No tiene nada que ver con el ADC


Saludos!
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: micro_pepe en 22 de Septiembre de 2009, 19:26:24
Entonces ese limite ¿de donde viene? es de la naturaleza del sistema? osea, en este caso del horno, obteniendose en la salida del divisor de voltaje un maximo de 5V?

Un saludo.

PD: Estoy teniendo problemas de saturacion en una fuente conmutada (me da siempre el maximo voltaje) y sospecho que viene de ahi.
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: MLO__ en 22 de Septiembre de 2009, 19:37:28
En el diseño del controlador es importante tener claro lo siguiente:


Por ejemplo, para el caso del horno, nos interesa que: en función del valor de voltaje entregado a la resistencia, ésta entregará un valor de calor al sistema térmico, con esto claro se puede decidir si el control de voltaje de la resistencia se hace por PWM o por fase. La uT estará relacionada con los valores de la curva del sistema obtenida por el método que tu escojas (teórico o experimental).

Hay otros parametros que cobran importancia en el diseño, pero eso depende de la velocidad del sistema a controlar.

Si el sistema es demasiado rápido o posee una respuesta poco lineal, es conveniente linealizar por tramos o aplicar otro método de control como Fuzzy.

Saludos
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: Suky en 22 de Septiembre de 2009, 19:51:43
Entonces ese limite ¿de donde viene? es de la naturaleza del sistema? osea, en este caso del horno, obteniendose en la salida del divisor de voltaje un maximo de 5V?

Un saludo.

PD: Estoy teniendo problemas de saturacion en una fuente conmutada (me da siempre el maximo voltaje) y sospecho que viene de ahi.

En la salida del Horno tengo una voltaje proporcional a la temperatura y se arma el divisor resistivo para poder medir cierto rango de temperatura. (Nos entregue un valor de 5V a temperatura máxima necesario para el ADC del PIC)
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: J1M en 23 de Septiembre de 2009, 03:09:58
Bravo Suky, genial ejemplo para empezar con los RTOS, para el 'como modelar un sistema' y como controlarlo!

Enhorabuena por el resultado y gracias por compartirlo :)
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: garocco en 21 de Diciembre de 2009, 09:57:22
Hola Suky. Gracias por la buena onda!
Te quería hacer una consulta sobre la implementación del anti-windup.
Viendo el desarrollo matemático del pid, el cual voy a copiar de nuevo:

(http://img69.imageshack.us/img69/8646/antiwindup.jpg)

Entiendo que para llegar a la ecuación 3), hacés u(k) = v(k) pues no existe limitación. La duda es como hacer para llegar de 2) a 4)... ¿como se hace para modelar la saturación?
Te comento que estoy haciendo un control para una estufa que tiene un tiempo de retardo importante (30 segundos). Hasta ahora no doy con el control, pues el error debe ser del orden de 0,1ºC. Con matlab he obtenido el modelo matemático de la respuesta al escalón de potencia, me dá un sistema de segundo orden (lo conecto con el 100% de la potencia y por rs232 mando 1 muestra por segundo al hiperterminal durante dos horas mas o menos). Traté de controlarlo con un PI, pero como no tiene capacidad de anticipación se me pasa de largo (oscila, y las oscilaciones hacen que se ma vaya fuera de la banda). Ahora he diseñado en el lugar de las raíces un control PI+compensador de adelanto, que me dá así:

V(z)    242.4zz^2-484.2*z+241.7
---- = ----------------------------------
E(z)       z^2-1.975*z+.9753       

y en el matlab anda de maravillas, pero no así en la vida real. Puede ser que sea por el bendito windup, pero  no se como implementar el antiwindup en este caso.

Me fuí por las ramas...Para resumir, la consulta que quiero hacerte es como se puede hacer para modelar el bloque de saturación, y la otra es como hago para meterlo en este caso en la ecuación (es decir como lo realimento, pues no me va a quedar un integrador puro).
Muchas gracias por  la buena onda y por tomarte la molestia de contestar. La verdad es que te has hecho  un tutorial de un nivel excelente, felicitaciones!

Saludos!

Gustavo.

Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: Suky en 21 de Diciembre de 2009, 12:38:08
Con respecto a la primer consulta, de como llegar de 2 a 4, es solo aplicar matemática y agrupar variables. No estoy modelando la saturación, si no que tomo a u(k) una señal nueva que surge se aplicar v(k) al actuador que se satura, osea es mucho más general. Después la saturación y que niveles de ello se tiene en cuenta en el código, donde se que u(k) está limitado a 0..5V en mi caso.

Luego, como se dice en los primeros mensajes, lo mejor para lograr una identificación mas acertada del sistema no es aplicarle un escalón sino una serie de escalones que suban y baje para poder obtener un resultado más exacto de la dinámica. A causa de una desacertada identificación surge el problema de que en la teoría funcione y en la realidad no  :?


Saludos!
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: MLO__ en 21 de Diciembre de 2009, 13:54:40
0.1 °C? Que sensor de temperatura estas usando para obtener esa resolución?
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: garocco en 21 de Diciembre de 2009, 14:35:55
Hola MLO_.
Estoy usando el TMP121 de Texas Instruments. Tiene una resolución de 0.0625 ºC. Claro que al ser un valor convertido y discreto (12 bits mas signo) solo puedo medir múltiplos de ese valor. Es decir, si quiero medir 25,1 ºC me tendría que dar 401.6 por lo que los valores mas cercanos serán: 25.0625 (valor de conversión 401) y 25.125 (valor de conversión 402).

Saludos.
Gustavo.
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: MLO__ en 22 de Diciembre de 2009, 01:34:35
 ;-) gracias por el dato, muy bueno el sensor.

Saludos
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: garocco en 22 de Diciembre de 2009, 16:17:54
Uy, Suky, no me había dado cuenta de que me habías contestado! Muchas gracias. Creo que he logrado comprender el tema de la saturación. Respecto del controlador, estoy teniendo inconvenientes porque tiene un retardo muy grande y una inercia térmica grande también... He realizado varios modelados y el que mejor resultado me ha dado, respecto de la aproximación lograda, es la estimación de la función de transferencia. Es un sistema de segundo orden:

                   0.33 * e^(-30*s)
G(s) = --------------------------------
           (1 + 433*s) (1 + 1650*s)


UUfff,  ya me tiene bastante frustrado... encima cada prueba me lleva mínimo una hora, pues el modelo del horno del Proteus no lo puedo aproximar... Con un PI + antiwindup o con un PID me aparece un sobreimpulso de poco más de un grado (uno hacia arriba y uno hacia abajo). Habrá alguna otra estrategia de control que se use en estos casos? Gracias.

Saludos!
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: MLO__ en 23 de Diciembre de 2009, 01:53:49
El sobrepaso máximo se controla variando el tiempo de muestreo, a menor tiempo de muestreo, menor sobrepaso. El valor del retraso toma importancia según el valor de la constante tau del sistema.

Que sistema térmico tienes? es decir, dices que el control es para una estufa, pero, en donde estas midiendo la temperatura?

Normalmente, el escalón unitario para sacar las variables del sistema es de un 10% a un 20%.

Saludos
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: garocco en 23 de Diciembre de 2009, 10:39:51
Gracias MLO_
Te comento mas o menos de que se trata. Es una estufa de cultivo de laboratorio. Es de 50x40x50cm, con doble pared metálica (una externa y otra interna). El termostato original era mecánico y estaba alojado en la parte inferior, junto a las dos resistencias calefactoras. Pensé que como la temperatura que interesa es la del interior de la cámara, lo subí (he hecho pruebas con el sensor abajo y me aparece un offset en la temperatura (mayor temperatura en la cavidad inferior), pero la respuesta es la misma. He aplicado escalones de 20%,30%, 50%, y 100% para ver las repuestas. El muestreo lo hago cada 1 segundo mandando los datos por puerto serie al hiperterminal. Según matlab la ecuación característica es la del post anterior. El retardo es de 30 seg, sistema de segundo orden.
Espero que no me malinterpreten, por eso me gustaría aclarárselo: no ando buscando nada servido, por lo que no pretendo que me armen el código ni nada por el estilo. Simplemente me parece apasionante esto del control de sistemas y me gustaría realmente aprender. He hecho grandes avances con toda la información que encontrado en el foro y con la ayuda de Uds. y espero seguir aprendiendo. Seguramente en algún lugar no he hecho las cosas como la teoría o la práctica lo recomienda, por eso es que no logro hacerlo funcionar como pretendo, pero le voy a ganar por cansancio... jaja
Hoy voy a probar hacer un control por banda proporcional + pi. Vamos a ver como me va.

Saludos.
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: MLO__ en 23 de Diciembre de 2009, 11:57:52
Hola.

Hombre, no te preocupes, según lo que veo no quieres nada servido si no hacerlo tu mismo, eso está muy bien.

Respecto a tu proyecto: Es como un horno entonces cierto? me imagino que la cámara es cerrada y que el sensor esta dentro de ella, por ese lado todo va bien. No hemos tocado un tema importante y es el actuador que estas usando, es decir como controlas la tensión de alimentación del horno, se puede hacer por PWM o por control de fase, por que método lo haces tu?

Me parece muy extraño que te de un sistema de segundo orden, normalmente los sistemas térmicos son de 1 orden cuando se trata de hornos. Podrías subir los datos de la adquisición que hiciste? Lo has graficado con otro soft?

Saludos
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: garocco en 23 de Diciembre de 2009, 15:39:53
Hola.
El actuador es un triac controlado por un optoacoplador. Inicialmente lo pensé para hacer el control por ángulo de conducción con la intención de ir ajustando el ángulo hasta que pueda compensar "justito las pérdidas" de temperatura. No he dado en la tecla todavía...
Luego, debido a los tiempos de retardo, decidí que podría hacer el control por ciclos enteros. Tomo 100 ciclos, y si dejo conducir solo 10 entonces entrego el 10 porciento de la potencia. Tampoco he logrado que funcione bien, pues cuando el error se hace cero no me da salida. De aquí que el error es suficiente y reacciona,  debido al retardo me cae o sube 0,4 ºc  y a veces más.
Por ahora el que mejor me ha funcionado es el on/off. Defino una banda proporcional y entrego toda la potencia hasta que llega al piso de la banda (lo que me frena el crecimiento de temperatura, y como sigue embalado me llega a unas pocas décimas de la temperatura de setpoint). A partir de allí control on/off. Al principio hace un sobrepico pero despues se estabiliza con un márgen de 0,1 ºc... Pero no me gusta hacer esta aproximación!!!! Debería poder ser más elegante y rigurosa matemáticamente hablando! La verdad es que no me resigno a hacerlo funcionar así...
Aquí te envío las pantallas del matlab:

(http://img33.imageshack.us/img33/9697/matlabcont.jpg) (http://img684.imageshack.us/img684/9697/matlabcont.jpg[/img)
En esta hice un control on/off para mantener la temeperatura de salida en un valor fijo. Es lo que interpreté de post de Suky acerca de meterle una señal compleja de estímulo para evaluar la respuesta. Se pueden ver dos curvas porque una arranca con un offset por la temperatura ambiente. A la otra le resté este valor constante.

(http://img33.imageshack.us/img33/4053/matlabescaln.jpg) (http://img33.imageshack.us/img33/4053/matlabescaln.jpg)
En esta solo apliqué un escalón de 110 W (bah, le metí 220 VCA derecho!). Este se repite con escalones de 20%,30%.50% en los que solo varía Kp.

Te agradezco de antemano cualquier ayuda.
Saludos.
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: MLO__ en 23 de Diciembre de 2009, 15:50:26
Tal como muestra esta figura:

(http://img33.imageshack.us/img33/4053/matlabescaln.jpg)

Tu sistema es de primer orden, tiene un crecimiento exponencial, por lo que es aplicable el metodo de Ziegler-Nichols para la obtencion de los parametros del sistema. Luego de tener el sistema en tiempo continuo, ya podrías discretizarlo sin ningun problema, teniendo en cuenta el tiempo de muestreo y el orden del retenedor para embeberlo en el uC.

No tienes los datos en algun .dat o en .txt?

Saludos
Título: Re: Control PID con anti-windup en PIC y CCSRTOS.
Publicado por: garocco en 23 de Diciembre de 2009, 16:11:53
Aquí te envío dos archivos:

Estufa_100.txt tiene la lectura del sensor con muestreo cada 1 segundo.
Estufa_100.txt (http://www.mediafire.com/?tzm4onze5qm)

Idem, con control on/off. Tiene una columna adicional en la que un 1 indica encendido y un cero apagado. Se aplicaba toda la potencia durante '1' (110w).
Estufa_37g.txt (http://www.mediafire.com/?tzmnyiy3djx)

Saludos.