Autor Tema: PID DISCRETO.  (Leído 52450 veces)

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

Desconectado pantera

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 215
Re: PID DISCRETO.
« Respuesta #75 en: 14 de Noviembre de 2006, 12:55:24 »
Hola Letal pues finalmente el simulink no lo utilice. Ya que no podia simular bien nada. Por otra parte tengo que hacer ahora otro control PID el cual es un control de temperatura y pues espero que quede rapido. Con respecto a la señal de control uk pienso en manejarla de otra forma
« Última modificación: 14 de Noviembre de 2006, 15:29:24 por pantera »
La música es sinónimo de libertad, de tocar lo que quieras y como quieras, siempre que sea bueno y tenga pasión, que la música sea el alimento del amor y del alma.

        :-)El Rock es Cultura :-)

Desconectado pantera

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 215
Re: PID DISCRETO.
« Respuesta #76 en: 18 de Noviembre de 2006, 04:37:52 »
Hola LETAL como vaz con tu sistema.

El de temperatura que armamos ya esta chido pero tengo una pregunta para ti.

La funcion de tranferencia como la sacaste ya que en este caso las condiciones uniciales no son cero. Que fue lo que hiciste para obtener la funcion de tranferencia
La música es sinónimo de libertad, de tocar lo que quieras y como quieras, siempre que sea bueno y tenga pasión, que la música sea el alimento del amor y del alma.

        :-)El Rock es Cultura :-)

Desconectado pantera

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 215
Re: PID DISCRETO.
« Respuesta #77 en: 20 de Noviembre de 2006, 23:36:33 »
Saludos Mario ya armamos otro PID pero ahora de temperatura y ya quedo simplemente ahora estamos sintonizando el PID.

DESCRIPCION DEL SISTEMA:
Consiste en el control de temperatura por medio de un foco y un par de ventiladores.

PROBLEMAS,

Los problemas que tuvimos fue la que letal comentaba.

Para un escalon POSITIVO
Realmente  el concepto del error negativo que Letal comentaba. Si analisamos un escalon positivos estaremos sacando una funcion de tranferencia, con el actuador que es el Foco. En este momento sacarmos la  funcion de tranferencia para el Foco.Pero cuando se encuetre un sobre impulso en ese momento tendran que entrar los ventiladores. Podemos observar que el calentamiento es rapido.

Para un escalon NEGATIVO
Ahora que pasa si damos un escalon negativo (de 50 grados a 30 por decir algo) los ventiladores tendran que entrar pero y comienza a enfriar. Y obviamente no enfria a la misma velocidad a la que enfria lo cual sera un problema por la velocidad de integracion

ANALISIS.

SI comparamos los resultados anteriores a mi parecer se me ocurre que hay dos funciones de transferencia asi que tendriamos que calcular dos controles PID para cuando hay un error negativo y otra para cuando hay un error positivo. SIn embrago la forma dificil que encontramos fue encontrar un equilibrio entre ambos actuadores.

¿Me gustaria saber el comentario de alguien hacerca de esta observacion?


==============================================================================
« Última modificación: 20 de Noviembre de 2006, 23:42:20 por pantera »
La música es sinónimo de libertad, de tocar lo que quieras y como quieras, siempre que sea bueno y tenga pasión, que la música sea el alimento del amor y del alma.

        :-)El Rock es Cultura :-)

Desconectado pantera

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 215
Re: PID DISCRETO.
« Respuesta #78 en: 20 de Noviembre de 2006, 23:47:40 »
Comparto el codigo

Código: Matlab M
  1. #include <18F4525.h>
  2. #device adc=10
  3. #use delay(clock=32000000)
  4. #use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  5. #include <LCD.C>
  6.  
  7. #FUSES NOWDT                    //No Watch Dog Timer
  8. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  9. #FUSES H4                       //High speed osc with HW enabled 4X PLL
  10. #FUSES NOPROTECT                //Code not protected from reading
  11. #FUSES NOIESO                   //Internal External Switch Over mode disabled
  12. #FUSES NOBROWNOUT               //NO Reset when brownout detected
  13. #FUSES BORV21                   //Brownout reset at 2.1V
  14. #FUSES PUT                      //Power Up Timer
  15. #FUSES NOCPD                    //No EE protection
  16. #FUSES NOSTVREN                 //Stack full/underflow will not cause reset
  17. #FUSES NODEBUG                  //No Debug mode for ICD
  18. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  19. #FUSES NOWRT                    //Program memory not write protected
  20. #FUSES NOWRTD                   //Data EEPROM not write protected
  21. #FUSES NOEBTR                   //Memory not protected from table reads
  22. #FUSES NOCPB                    //No Boot Block code protection
  23. #FUSES NOEBTRB                  //Boot block not protected from table reads
  24. #FUSES NOWRTC                   //configuration not registers write protected
  25. #FUSES NOWRTB                   //Boot block not write protected
  26. #FUSES NOFCMEN                          //Fail-safe clock monitor DSIabled
  27. #FUSES NOXINST                          //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  28. #FUSES NOPBADEN                 //PORTB pins are configured as digital I/O channels on RESET
  29. #FUSES NOLPT1OSC                        //Timer1  configured for high-power operation
  30. #FUSES MCLR                     //Master Clear pin enabled
  31.  
  32.  
  33. #bit     vital  = 0xF82.0
  34. //#bit   fs             = 0xF82.1
  35.  
  36. #bit  boton1    = 0xf81.2
  37. #bit  menos     = 0xf81.4
  38. #bit  mas               = 0xf81.5
  39. #byte port_A    = 0xF80
  40. #byte port_B    = 0xF81
  41. #byte port_C    = 0xF82
  42. #byte port_D    = 0xF83
  43.  
  44. int32   Promedio;
  45. #byte   Promedio      = 0x00F
  46. #byte   Promedio_LOW  = 0x00F
  47. #byte   Promedio_HIGH = 0x010
  48.  
  49.  
  50. int16   control,t=25;
  51.  
  52. int16   PWM_foco;
  53. #byte   PWM_foco      = 0x01f
  54. #byte   PWM_foco_LOW  = 0x01F
  55. #byte   PWM_foco_HIGH = 0x020
  56.  
  57. int32   conteo=0;
  58. float   cal=0.001782991;
  59. float   temperatura,err0=0,err1=0,err2=0;
  60. float   b0=0.0125,b1=-0.0125,b2=0.00059375;
  61. float   setpoint,uk=0;
  62. int32   lectura;
  63.  
  64.  
  65.  
  66. inicializar(){
  67.         setup_adc_ports(AN0|VSS_VREF);
  68.         setup_adc(ADC_CLOCK_INTERNAL);
  69.         set_adc_channel(0);
  70.  
  71.         setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);
  72.         setup_timer_2(T2_DIV_BY_16,255,1);
  73. //      enable_interrupts(INT_TIMER2);
  74.         enable_interrupts(INT_EXT);
  75.         enable_interrupts(GLOBAL);
  76.  
  77.         port_b_pullups(true);
  78.         setup_ccp2(CCP_PWM);
  79.         lcd_init();
  80.  
  81.         set_tris_a(0xff);
  82.         set_tris_b(0xf7);
  83.         set_tris_c(0x90);
  84.         control=0;
  85.         conteo =0;
  86.  
  87. }
  88.  
  89. #int_EXT
  90. void ZCD(){
  91. // SET POINT  ULTIMA GRABACION ===============
  92.         float controlf,controlv;
  93.         setup_ccp1(CCP_COMPARE_CLR_ON_MATCH);
  94.         CCP_1=0;
  95.  
  96.         set_timer1(0);
  97.  
  98.         lectura=read_adc();
  99.         temperatura=lectura*0.178005;
  100.  
  101.         err0=setpoint-temperatura;
  102.        
  103.         uk = uk+err0*b0+err1*b1+err2*b2;
  104.  
  105.         if(uk>5)uk=5;
  106.         else if(uk<-5)uk=-5;
  107.                
  108.         controlf=15000-uk*3000;
  109.  
  110.         if(uk<0)
  111.         controlv=300-uk*144.6;
  112.         else
  113.         controlv=0;
  114.        
  115.         CCP_1=(long int)controlf;
  116.         setup_ccp1(CCP_COMPARE_SET_ON_MATCH);
  117.         set_timer1(0);
  118.         set_pwm2_duty ((long int)controlv);
  119.         err2=err1;
  120.         err1=err0;
  121.        
  122.         }
  123.  
  124. /*
  125. #int_TIMER2
  126. void muestreo(){
  127.         lectura=read_adc();
  128.         promedio=lectura+promedio;
  129.         conteo++;
  130.  
  131.         if (conteo==100){
  132.                 fs=1;
  133.                 promedio=promedio*.01;
  134.                 conteo=0;
  135.                 putc(Promedio_LOW);
  136.                 putc(Promedio_HIGH);
  137.                 PWM_foco=control;
  138.                 putc(PWM_foco_LOW);
  139.                 putc(PWM_foco_HIGH);
  140.                 putc('\n');
  141.                 promedio=0;
  142.                 fs=0;
  143.                 }
  144.         }
  145. */
  146.  
  147. void main() {
  148.         int16 cont=0;
  149.         inicializar();
  150.  
  151.         while(true){
  152.                 lcd_gotoxy(1,1);
  153.                 printf(lcd_putc,"Sp:%lu uk:%.3f          \nFb:%.0f            ",t,uk,temperatura);
  154.                 vital=0;
  155.  
  156.                 if(Boton1){
  157.                 while(Boton1);
  158.                 lcd_gotoxy(1,1);
  159.                 printf(lcd_putc,"Nuevo sp:            ");
  160.                
  161.                 while(!Boton1){
  162.                 lcd_gotoxy(1,2);
  163.                 printf(lcd_putc,"%lu            ",t);
  164.                 cont=0;
  165.  
  166.                         if(menos){
  167.                                 vital=1;
  168.                                 t--;
  169.                                 while(menos && (cont<=65000))
  170.                                         cont++;
  171.                         }
  172.        
  173.                         if(mas){
  174.                                 vital=1;
  175.                                 t++;
  176.                                 while(mas && (cont<=65000))
  177.                                         cont++;
  178.                         }
  179.                 }
  180.                 while(Boton1);
  181.                
  182.                 }
  183.                 setpoint=t;
  184.                
  185.  
  186.  
  187.                 }
  188.         }
La música es sinónimo de libertad, de tocar lo que quieras y como quieras, siempre que sea bueno y tenga pasión, que la música sea el alimento del amor y del alma.

        :-)El Rock es Cultura :-)

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: PID DISCRETO.
« Respuesta #79 en: 21 de Noviembre de 2006, 01:26:21 »
Muy interesante.



Simplemente no encuentro razón para implementar un PID en un sistema de temperatura. La razón de cambio es muy lenta como para tratar de seguirla con un PID, inclusive con un P.
Por eso, casi nunca (salvo el PDF de parallax) he visto un código de PID para temperatura, simplemente se realiza por histérisis, asignando un máximo y un mínimo (como los termómetros de las refrigeraciones).

Esto es parte de lo que le mencioné a LETAL:
Lo que pides es algo complicado de explicar para mi. He visto que has preguntado en el foro y al parecer necesitas hacer un PID para temperatura. Te mencioné que te fueras a parallax.com y buscaras las descargas  o vete directo aqui:
http://www.parallax.com/html_pages/downloads/siccurriculum/documentation_sic_curriculum.asp#spanish

y baja industrial control. Este PDF tiene un ejemplo de PID para temperatura; aunque es para Basic Stamp, es casi lo mismo.


Revísalo si tienes tiempo, está en BASIC pero es una fuente de información que tiene un PID para temperatura.
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado pantera

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 215
Re: PID DISCRETO.
« Respuesta #80 en: 21 de Noviembre de 2006, 13:27:27 »
A gracias mario pero pues creo que con eso que tengo ya esta bien realmente tienes razon de lo de la histeresis. Pero pues creo que esta bien.
La música es sinónimo de libertad, de tocar lo que quieras y como quieras, siempre que sea bueno y tenga pasión, que la música sea el alimento del amor y del alma.

        :-)El Rock es Cultura :-)

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re: PID DISCRETO.
« Respuesta #81 en: 23 de Noviembre de 2006, 20:05:34 »
Qué tal, primero que nada un agradecimiento a pantera por compartir su trabajo y a todos los demás por compartir su conocimiento :).

Ahora, yo tengo que implementar tres controles PID:
  • Control PID de una fuente conmutada de 5 V (topología reductora). El control es analógico, diseñado mediante análisis en frecuencia (Bode).
  • Control PID de nivel de un tanque de agua, lo que se va a controlar es la bomba que alimenta dicho tanque. El control es analógico diseñado mediante Ziegler-Nichols.
  • Control digital del anterior tanque, con VHDL utilizando un FPGA.

El primero ya está casi terminado en cuanto a diseño, tras eso solo me faltará implementar el circuito. La función de transferencia de la fuente no la obtuve yo (ya es conocida la de una topología reductora).

Mi principal problema es el análisis para la obtención de la función de transferencia de las plantas, es algo de lo que de plano no tengo idea :oops: (además de eso ando bastante oxidado por dejar la escuela unos años :P). Me gustaría saber si conocen algún libro/sitio/apunte en el que pueda encontrar información al respecto.

Para sensar el nivel del tanque de agua vamos a utilizar un sistema flotador/potenciómetro, ¿cómo debo proceder para modelar el sistema?

Por último, creo que mejor abro otro post porque no voy a utilizar ningún PIC :P.
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado JavierPIC18

  • PIC10
  • *
  • Mensajes: 5
Re: PID DISCRETO.
« Respuesta #82 en: 16 de Julio de 2007, 17:58:38 »
Bueno spy nuevo en este foro y en el moemento estoy realizando un control PID con un Pic 18f452, estube revisando el foro y me han servido  muchas cosas de el, pero me doy cuenta que no siguieron hablando desde el  año pasado, me gustaria retomer nuevamente el tema, si alguien esta interesado o sabe si se translado el tema a otra sección por favor escriban.

Gracias.

Desconectado fa61an

  • PIC10
  • *
  • Mensajes: 21
Re: PID DISCRETO.
« Respuesta #83 en: 18 de Agosto de 2007, 13:44:02 »
Yo tambien quisiera retomar ya que me parece que quedaron cosas sin aclarar, me he leido todos los post y me quedo la duda de como se soluciono cuando el error era negativo. Se que cada bloque de control debe tener una ganancia o un Bias, que en ultimas es una constante que se le sumaria a la salida de la accion de control, ¿ Fue asi como se soluciono el problema del error negativo? y si fue asi como se calculo ese valor de la constante o de lo contrario como lo hiciste.

En algun post de este tema se mencionaba hacer de la funcion de transferencia del control, que si era en Z o S y la forma de la ecuacion en el micro, creo que hay que aclarar que cualquiera que se elija en el microcontrolador se debe usar una ecuacion discreta. Es cierto que en el dominio Z dependiendo de la frecuencia de muestreo la funcion cambia, pero tambien es cierto que debido a las altas frecuencias de muestreo que hoy podemos obtener gracias al avance tecnologico, analizar un sistema en Z ya no es tan necesario, pues con una alta frecuencia de muestreo para el analisis se puede interpretar como un sistema continuo que seria en el dominio de S. Entonces creo que pantera la aplico en Z bueno la pregunta es la frecuencia con se capturo la señal del tacometro como se relaciono con la ecuacion en Diferencias (discreta) del controlador PID, segun veo en ningun momento si le cambias la frecuencia con que se lee esa señal afecte la ecuacion discreta del PID.

Si me contestan publicare mis otras que tengo

Gracias
Colombia - Bucaramanga UTS

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: PID DISCRETO.
« Respuesta #84 en: 18 de Agosto de 2007, 17:00:45 »
Yo tambien quisiera retomar ya que me parece que quedaron cosas sin aclarar, me he leido todos los post y me quedo la duda de como se soluciono cuando el error era negativo. Se que cada bloque de control debe tener una ganancia o un Bias, que en ultimas es una constante que se le sumaria a la salida de la accion de control, ¿ Fue asi como se soluciono el problema del error negativo? y si fue asi como se calculo ese valor de la constante o de lo contrario como lo hiciste.


Quizá te sirvan estos enlaces:
http://www.todopic.com.ar/foros/index.php?topic=14248.0
http://www.todopic.com.ar/foros/index.php?topic=3635.60
http://abrobotics.tripod.com/ControlLaws/singlemotor.htm   <----- Este último te servirá para entender cómo se realizó la acotación negativa

Ya tendré tiempo para enfocarme de lleno a este proyectillo dejado a la mitad.
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado fa61an

  • PIC10
  • *
  • Mensajes: 21
Re: PID DISCRETO.
« Respuesta #85 en: 18 de Agosto de 2007, 20:42:40 »
Trate de leer los dos primeros enlace pero no me alcanzo el tiempo, así que el lunes los leo mejor.

De todas maneras lo poco que leí aun no me convence, en resumen lo que entendí que propones es hacer un limite a la salida del PID eso es claro, pero ese limite debería oscilar entre un rango a < x < b , en donde a es un numero negativo y b es numero positivo, se me ocurre a mi opinen.

Ese rango de valores es el que debe limitar la salida de la acción de Control sea P, PI, PD o PID, porque he notado en algunos post que han intentado limitar pero antes de la acción de control, en donde comparan si el valor del error es negativo o positivo, a mi me parece que ahí no debe haber ninguna limitación, la limitación se debe hacer en el resultado que arroje el controlador.

En el caso de un motor DC, de por ejemplo 6 V y se quiera hacer un control para mejorar la respuesta a un escalón se debería hacer lo siguiente, primero hacer un lazo abierto, me explico, fijar un pwm y por medio del sensor que se desee usar, ya sea tacogenerador, encoder, efecto hall.... realizar un sensor Indicador y anotar con dicho ancho de pulso que velocidad se obtiene, y realizar una tabla de por lo menos unos 5 datos, luego hacer el control de lazo cerrado, si por ejemplo (caso hipotético) con un PWM del 80 % obtuve son el sensor indicador 700 rpm del primera paso, y con el lazo cerrado fijo un set point de 700 rpm... es obvio que la salida del controlador debería oscilar entre 80 % de PWM cuando permanezca en estado estable... eso quiere decir que cuando el error sea cero la salida del PID debería  tener un valor de PWM cercano al 80 % y no de un valor de 0 % como han propuesto...


La pregunta que hay que hacerse es como diseño el limitador, que rangos debo ponerle al limitador, se me ocurre que lo adecuado es obtener la función de transferencia, pero todos sabemos que eso aveces es engorroso, y no vayan a decir que usar el metodo de Ziger - nicols para obtener la función de transferencia, porque eso es falso,  el método de Ziger, es cuando no se puede obtener la función de transferencia y se desea realizar un control casi optimo por un metodo experimental hecho por ellos.


Colombia - Bucaramanga UTS

Desconectado hard8507

  • PIC10
  • *
  • Mensajes: 44
Re: PID DISCRETO.
« Respuesta #86 en: 02 de Mayo de 2009, 13:32:51 »


aki les pongo una paguina de microchip el cual dan todo para hcer un pendulo invertido

http://ww1.microchip.com/downloads/en/AppNotes/00964A.pdf

y el codigo fuente lo encuentran aki

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en021807

si alguien lo prueba y nos indica q tal funciona seria mejor

Desconectado pantera

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 215
Re: PID DISCRETO.
« Respuesta #87 en: 23 de Junio de 2011, 23:04:21 »
Hola chicos que tal.. en verdad he estado super desaparecido ya egrese de la carrera hace cuatro años actualmente me encuentro trabajando con controloes CNC y la verdad son la neta...

Saludos de mexico
La música es sinónimo de libertad, de tocar lo que quieras y como quieras, siempre que sea bueno y tenga pasión, que la música sea el alimento del amor y del alma.

        :-)El Rock es Cultura :-)

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: PID DISCRETO.
« Respuesta #88 en: 24 de Junio de 2011, 17:23:02 »
¡qué bueno!  por fin de regreso.


Yo también he andado fuera, espero recuperarme en las lecturas del foro.
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado gab163

  • PIC16
  • ***
  • Mensajes: 111
Re: PID DISCRETO.
« Respuesta #89 en: 25 de Mayo de 2013, 15:46:32 »
Hola a todos existe tambien el PID Takagachi-chan-auslander es un controlador pid en forma discreta el cual esta descrito por
Uk=DeltaUk+Uk-1
donde DeltaUk=Kp(yk-1-yk)+KI(refk-yk)+KD(2yk-1-yk-2-yk)

Donde KP, KI y KD son las ganancias del controlador, ref la referencia, yk salida del sistema en ese instante, yk-1 la salida del sistema un instante anterior y yk-2 la salida del sistema dos instantes antes. siendo Uk la entrada de control suministrada al sistema.
 para un controlador PI:

     KP=0.9/(R*(L+(Tm/2)))-1/2*(KI),                       KI=0.27Tm/(R*(L+(T/2))^2)
para un controlador PID:

    KP=1.2/(R*(L+Tm))-1/2*KI,              KI=0.6T/(R*(L+(Tm/2))^2)                   KD=0.6/(R*Tm)

donde Tm es el tiempo de muestreo


donde R=K/T    ,     K es la ganancia del sistema(ojo no es la del controlador) y T (es el tiempo de subida del intervalo mostrado en la imagen)
nota: no confundir T con Tm son diferentes.



 

anything