Autor Tema: Control PID de la Teoria a la Practica, ¿En que esta fallando?  (Leído 6005 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado cesar_valpo

  • PIC10
  • *
  • Mensajes: 5
A continuación expongo un caso de un controlador PID Discreto, la idea es poder contrastar los resultados con Simulink. Ademas quiero mantener las constantes Kp, Ki, Kd del controlador continuo al discreto, para no tener que volver a calcularlas.

La planta utilizada es mostrada a continuación (La planta se discretizo con la Aproximacion Bilineal y Ts=0.2):

Para la planta continua se utilizo un controlador PID con parametros Kp=80, Ki=100, Kd=5.

Ahora buscare una formula que permita crear un algoritmo de un PID Discreto, al cual se le ingresen las constantes Kp, Ki, Kd del controlador continuo. Para ello utilizo el metodo expuesto en el Libro: Sistemas de Control Discreto de Katsuhiko Ogata, Segunda Edicion, Paginas 115 y 116. Los calculos realizados son mostrados a continuacion.


Entonces la funcion discreta del controlador es la siguiente:


Simulacion del Sistema en Simulink


Resultados



Ahora los resultados del microcontrolador: Primero el algoritmo.
Código: C
  1. #include <16F877A.h>
  2. #device adc=8
  3. #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
  4. #use delay(clock=20000000)
  5. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  6.  
  7. //    VARIABLES SISTEMA CONTINUO
  8. float Xi = 1.34097047;
  9. float Wn = 4.474371464;
  10. float Ganancia = 0.099900099;
  11. float SalidaSist2[3] = {0,0.0,0.0};   //0=Actual, 1=Anterior, 2=AnteriorAnterior
  12. float EntradaSist2[3] = {0.0,0.0,0.0};//0=Actual, 1=Anterior, 2=AnteriorAnterior
  13.  
  14. //    DEFINICIONES APROXIMACION BILINEAL
  15. #define fs 5
  16. #define Ts 0.2
  17. #define A (4*fs*fs-4*Xi*Wn*fs+Wn*Wn)
  18. #define B (2*Wn*Wn-8*fs*fs)
  19. #define C (4*fs*fs+4*Xi*Wn*fs+Wn*Wn)
  20. #define D (Ganancia*Wn*Wn)
  21.  
  22. //    DEFINICIONES PID
  23. float Kp = 80;
  24. float Ki = 100;
  25. float Kd = 5;
  26. float Referencia = 1;
  27. #define A_PID (2*Kp*Ts+Ki*Ts*Ts+2*Kd)
  28. #define B_PID (Ki*Ts*Ts-2*Kp*Ts-4*Kd)
  29. #define C_PID (2*Kd)
  30. #define D_PID (2*Ts)
  31. float M[2] = {0,0};        //0=Actual, 1=Anterior,
  32. float Error[3] = {1,0,0};  //0=Actual, 1=Anterior, 2=AnteriorAnterior
  33. int contador = 0;
  34.  
  35. void main(){
  36.    setup_adc_ports(NO_ANALOGS);
  37.    setup_adc(ADC_OFF);
  38.    setup_psp(PSP_DISABLED);
  39.    setup_spi(SPI_SS_DISABLED);
  40.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  41.    setup_timer_1(T1_DISABLED);
  42.    setup_timer_2(T2_DISABLED,0,1);
  43.    setup_comparator(NC_NC_NC_NC);
  44.    setup_vref(FALSE);
  45.  
  46.    while(true){
  47.       Error[0] = Referencia - SalidaSist2[0];   //Calcula el Error
  48.       M[0] = (1/D_PID)*(A_PID*Error[0]+B_PID*Error[1]+C_PID*Error[2]+D_PID*M[1]);
  49.       M[1] = M[0];
  50.       Error[2] = Error[1];
  51.       Error[1] = Error[0];
  52.      
  53.       //___PLANTA___
  54.       EntradaSist2[0] = M[0];    //La salida del PID es la entrada de la Planta
  55.       SalidaSist2[0] = (1/C)*(D*(EntradaSist2[2]+2*EntradaSist2[1]+EntradaSist2[0])-A*SalidaSist2[2]-B*SalidaSist2[1]);
  56.       EntradaSist2[2] = EntradaSist2[1];
  57.       EntradaSist2[1]=EntradaSist2[0];      
  58.       SalidaSist2[2] = SalidaSist2[1];
  59.       SalidaSist2[1] = SalidaSist2[0];
  60.      
  61.       //___MUESTRA LOS RESULTADOS___
  62.       printf("%3.2f seg) %3.4f \r",(1.0*contador)/5.0,SalidaSist2[0]);
  63.       contador++;
  64.       delay_ms(200);
  65.    }
  66.  
  67. }

Resultados del microcontrolador

Se ve que los resultados de la salida no corresponden a los entregados por simulink. Pense en que los modelos del algoritmos estaban mal, asi que probe el controlador con la planta en lazo abierto como muestra la figura.

Los datos obtenidos en Simulink:

Se comenta la linea 47 del codigo anterior y se obtienen los siguientes datos:


Entonces supongo que los modelos en el microcontrolador estan bien, pero al retroalimentar no funciona el control.

¿Alguien me puede ayudar?.

Gracias

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Control PID de la Teoria a la Practica, ¿En que esta fallando?
« Respuesta #1 en: 18 de Mayo de 2010, 09:32:17 »
Lo que se me ocurre es que el tiempo de muestreo real que realiza el pic se aleje demasiado de los 200ms teóricos con los que realizaste los cálculos para discretizar y por lo tanto el sistema cambió. Prueba de medir el tiempo que tarda en realizar cada muestreo. Recuerda que estas haciendo muchas multiplicaciones y sumas y además estás usando la función printf que demanda bastante tiempo.
Otra cosa que se me ocurre es que el ancho de palabra de los puntos flotantes en el CCS sean mucho menores que en el matlab y por lo tanto te esté dando problemas numéricos. No se si se puede pero intenta configurar el simulink para que restringa el tamaño de los float igual al del CCS y luego simula con ese ancho de palabra.
Saludos
« Última modificación: 18 de Mayo de 2010, 10:05:44 por pablomanieri »

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Control PID de la Teoria a la Practica, ¿En que esta fallando?
« Respuesta #2 en: 18 de Mayo de 2010, 11:18:24 »
Hola.

No se puede mantener el valor de las constantes de sintonización del controlador continuo, ya que al discretizarlo, se modifican debido al tiempo de muestreo. Mira aqui, de pronto te sirve.

Saludos
El papel lo aguanta todo

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Control PID de la Teoria a la Practica, ¿En que esta fallando?
« Respuesta #3 en: 18 de Mayo de 2010, 11:19:20 »
Me había quedado con la duda de cual podía ser el problema. Y lo simulé en matlab. El tema está en que cuando lo simulas tal cual está el diagrama de simulink se produce un loop algebraico (si te fijas en los warning que te da en el workspace). En realidad en el programa del pic tu entrada actual al controlador es la referencia menos la salida pasada de la planta. Agrega un retardo unitario en el lazo de realimentación, vas a ver como la simulación da lo mismo que te da el pic. Hay que ver si está mal el modelo en el pic o la interpretación discreta del sistema en simulink. Por ahora no me doy cuenta de esto, creo que es el modelo del pic.
Si el modelo del pic está mal, habría que implementar ese loop algebraico en forma recursiva, pero no creo que sea muy sencillo, y el CCS no soporta recursividad
« Última modificación: 18 de Mayo de 2010, 12:21:00 por pablomanieri »

Desconectado cesar_valpo

  • PIC10
  • *
  • Mensajes: 5
Re: Control PID de la Teoria a la Practica, ¿En que esta fallando?
« Respuesta #4 en: 18 de Mayo de 2010, 19:38:38 »
Lo que se me ocurre es que el tiempo de muestreo real que realiza el pic se aleje demasiado de los 200ms teóricos con los que realizaste los cálculos para discretizar y por lo tanto el sistema cambió. Prueba de medir el tiempo que tarda en realizar cada muestreo. Recuerda que estas haciendo muchas multiplicaciones y sumas y además estás usando la función printf que demanda bastante tiempo.
Otra cosa que se me ocurre es que el ancho de palabra de los puntos flotantes en el CCS sean mucho menores que en el matlab y por lo tanto te esté dando problemas numéricos. No se si se puede pero intenta configurar el simulink para que restringa el tamaño de los float igual al del CCS y luego simula con ese ancho de palabra.
Saludos

Pablomanieri gracias por tu respuesta.

Por el tema del tiempo de muestreo real, es decir los 200 ms, no es problema por ahora. Debido a que solo afecta al "escalamiento temporal" de la respuesta del sistema. Es decir si la simulacion en Matlab tiene un tiempo de asentamiento de 2 segundos, entonces en el microcontrolador tendria de 3, 4 o mas segundo dependiendo de que tanto mas se demore en entregar cada muestra.

Voy a revisar el tema de la aproximacion numerica de Matlab.

Desconectado cesar_valpo

  • PIC10
  • *
  • Mensajes: 5
Re: Control PID de la Teoria a la Practica, ¿En que esta fallando?
« Respuesta #5 en: 18 de Mayo de 2010, 19:42:03 »
Hola.

No se puede mantener el valor de las constantes de sintonización del controlador continuo, ya que al discretizarlo, se modifican debido al tiempo de muestreo. Mira aqui, de pronto te sirve.

Saludos

Gracias MLO, las constantes del controlador continuo son distintas al controlador discreto, es verdad, ya que se multiplican y o dividen por el tiempo de muestreo segun la aproximacion del controlador que se este usando.

De la formula que deduje del libro de Ogata, lo que hago es no perder de vista las constantes de tiempo del controlador continuo, por que finalmente las unicas variables de entrada del microcontrolador serán estas constantes. Las transformaciones estan en las formulas descritas.


 

anything