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

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

Desconectado pantera

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 215
Re: PID DISCRETO.
« Respuesta #15 en: 06 de Octubre de 2006, 01:54:27 »
El principal problema es que es solo un archivo no podria separalo en varios chiquitos, si te refieres a eso, verdad?
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 Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: PID DISCRETO.
« Respuesta #16 en: 06 de Octubre de 2006, 11:31:33 »
Hola pantera, ya me habia imaguinado que era solo un harchivo, pero el WinRar tiene una función que tu le colocas el tamaño máximo que deseas para los archivos y eso es lo que hace, los divide en tantos archivos sea necesario para no superar el tamaño que as definido. Por lo tanto no importaría que solo sea un archivo el que deseas comprimir.

Un saludo.

Atte. CARLOS.
La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado pantera

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 215
Re: PID DISCRETO.
« Respuesta #17 en: 06 de Octubre de 2006, 15:21:44 »
PARTE 1 y 2
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 #18 en: 06 de Octubre de 2006, 15:22:33 »
Parte 3 y 4
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 5GTT

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 915
Re: PID DISCRETO.
« Respuesta #19 en: 06 de Octubre de 2006, 19:33:51 »
Respecto al analisis de datos todo sale bien salvo el polo en p2=-70 ya que realmente el que por analisis deveria de salir sale positivo y por analisis basicos del lugar de las raices de un sistema eso es inestabilidad.

Asi con esta problematica realmente la desicion de tomar p2 = -70 fue en base graficar y verificar y pues no creo que sea mucho problema ya que es el polo menos significativo. Tiene que esta mas asi la izquierda del plano s

¿Algun comentario respecto a esto ultimo, me gustaria saber que piensan respecto de esto? :

Pero bueno ya estamos listos para seguir con el programa en el microcontrolador :
EL PID DISCRETO


Lo primero, me encantaria ver como has obtenido finalmente la FDT, yo basandome en la señal de respuesta suelo hacer el metodo que comente. Pero si conoces otro me gustaria saberlo a mi tambien. Ha quedado de 10 y sin retardo inical como con mi metodo, asi que me parece muy interesante.

Respecto a lo que comentas del problema con el polo en -70 no entiendo que quieres decir, si el polo esta en el semiplano negativo el sistema es estable, el problema seria que fuera 70. De hecho si el sistema no fuera estable se hubiera visto en la respuesta al escalon ya que no habria sido como la que mostro el osciloscopio.

Saludos.

Tutoriales y proyectos de electrónica

Desconectado pantera

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 215
Re: PID DISCRETO.
« Respuesta #20 en: 07 de Octubre de 2006, 00:36:50 »
ok
 
a lo que me referia con respecto al polo de -70 es que ese lo saque  a prueba y error ya que mediante el metodo que realice este calculo no da un resultado rasonable.

A con respecto al metodo que te cuento, mira necesito hacer un reporte asi que eso no lo dudes. Si voy a explicar como lo hice. Tambien quiero escanear escanear el libro del cual lo saque pero no tengo escaner :(
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 #21 en: 07 de Octubre de 2006, 19:37:44 »
Hola este es el motor de DC. El motor ya tiene un tacometro incorporado. Justo ahora voy a crear el  programa el cual priero mida la velocidad del motor.
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 #22 en: 07 de Octubre de 2006, 21:47:16 »
Primero para hacer el programa se necesita verificar la linealidad del sensor. Ya que la velocidad de salidad del sistema será la velocidad del motor (RPM).

Donde los datos estan en el archivo, XSL.

Y la respuesta del sistema es la siguiente. Donde se puede observar que el sensor quizas no sea tan lineal. Donde a mi parecer hay algo raro ya que si se ve la relacion lineal. Asi que quizas sea necesario volver a realizar las mediciones para crear el programa en el PIC.
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 #23 en: 15 de Octubre de 2006, 00:37:39 »
Hola he estado ya trabajando en el codigo del microcontrolador y hasta el momento ya tengo unas rutinas para un teclado matricial y para la LCD.  El microcontrolador por el canal ADC0 toma la señal del tacometro que tiene el motor.

Microcontrolador:
       Las rutinas programadas hasta el momento son:

       El teclado matricial  4X4 por medio de interrupcion por cambio en el puerto B
       El LCD
       Mide la velocidad por medio del microcontrolador. PIC18F4550.
       PWM para la activar el Motor de DC, por medio de  un MOSFET.

El programa ya se probo  con respecto al patro y esta midiendo bien en un rango de +- 10 %.

El programa contara con las siguientes caracteristicas, por medio de los botones:
Detener el Motor:
Decrementar Kp:
Incrementar Kp:
Establecer Kp:
Decrementar Ki:
Incrementar Ki:
Establecer Ki:
Decrementar Kd:
Incrementar Kd:
Establecer Kd:
Establecer velocidad:
Calibrar Motor DC:
Decrementos 10 RPM:
Incrementos 10 RPM:
Decrementos 100 RPM:
Incrementos 100 RPM:

Velocidad.h

Código: Matlab M
  1. #include <18F4550.h>
  2. #device adc=10
  3.  
  4. #FUSES NOPROTECT
  5. #FUSES PUT
  6. #FUSES NOLVP
  7. #FUSES NOBROWNOUT
  8. #FUSES NOWDT
  9. #FUSES HSPLL
  10. #FUSES NODEBUG
  11. #FUSES PLL3
  12. #FUSES USBDIV
  13. #FUSES CPUDIV1
  14. #FUSES VREGEN
  15.  
  16. #use delay(clock=48000000)
  17.  
  18. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  19.  
  20. #include <LCD.C>
  21.  
  22. #use fast_io(A)
  23. #use fast_io(B)
  24. #use fast_io(C)
  25.  
  26.  
  27. #byte PUERTOB   = 0xF81
  28. #bit  BEEP      = 0xF83.3
  29.  
  30. byte LSB=0b11111110;
  31. byte tecla,tecla1,tecla2;
  32.  
  33. long  value=0,contB=0;
  34. float Velocidad,Voltaje, Calibracion = 1.4208 ;
  35. int16 Proporcion=1;
  36. float Acomulado=0;
  37.  
  38. Corrimiento(){
  39.         PUERTOB=LSB;
  40.         rotate_left( &LSB, 1);
  41.         if(LSB==0b11101111)
  42.         LSB=0b11111110;
  43.  
  44. }
  45.  
  46. #int_TIMER1
  47. TIMER1_isr(){
  48. Corrimiento();
  49. }
  50.  
  51. Revote(){
  52.         if (tecla!=16){
  53.                 while(tecla1==PUERTOB)
  54.      BEEP=1;
  55.         delay_ms(200);
  56.      BEEP=0;
  57.         }
  58. }
  59.  
  60. Revote2(){
  61.         while(tecla2==PUERTOB)
  62.      BEEP=1;
  63.         delay_ms(200);
  64.      BEEP=0;
  65. }
  66.  
  67. int Entero(){
  68.         tecla=PUERTOB;
  69.         tecla1=PUERTOB;
  70.         switch (tecla) {
  71.           case 0xEE : tecla=15;         break;
  72.           case 0xED : tecla=9 ;              break;
  73.           case 0xEB : tecla=8 ;         break;
  74.           case 0xE7 : tecla=7 ;         break;
  75.           case 0xDE : tecla=14;         break;
  76.           case 0xDD : tecla=6 ;         break;
  77.           case 0xDB : tecla=5 ;         break;
  78.           case 0xD7 : tecla=4 ;         break;
  79.           case 0xBE : tecla=13;         break;
  80.           case 0xBD : tecla=3 ;         break;
  81.           case 0xBB : tecla=2 ;         break;
  82.           case 0xB7 : tecla=1 ;         break;
  83.           case 0x7E : tecla=12;         break;
  84.           case 0x7D : tecla=11;         break;
  85.           case 0x7B : tecla=10;         break;
  86.           case 0x77 : tecla=0 ;         break;
  87.           default       : tecla=16;             break; }
  88.         return tecla;
  89. }
  90.  
  91.  
  92. float Get_Numero( float Actual){
  93.         float decimal=1;
  94.         int     Bandera=0;
  95.  
  96.         Proporcion=1;
  97.         Acomulado=0;
  98.      lcd_gotoxy(1,2);
  99.      printf(lcd_putc,"Actual: %f    ",Actual);
  100.         Revote();
  101.  
  102.         Do{
  103.                 Corrimiento();
  104.                 Entero();
  105.                 delay_ms(50);
  106.         } while(tecla2!=PUERTOB);
  107.         lcd_gotoxy(1,2);
  108.         printf(lcd_putc,"Nuevo: %f             ",Acomulado);
  109.         Revote2()       ;
  110.  
  111.         Do{
  112.  
  113.                 Corrimiento();
  114.                 Entero();
  115.                 delay_ms(50);
  116.  
  117.                 if(tecla==10)
  118.                         Bandera=1;
  119.  
  120.                 if(tecla<10 && Bandera==0){
  121.                         Acomulado = Acomulado*10+tecla;
  122.                         lcd_gotoxy(1,2);
  123.                         printf(lcd_putc,"Nuevo: %f             ",Acomulado);
  124.                         Revote();
  125.                 }
  126.  
  127.           if(tecla<10 && Bandera==1){
  128.                   decimal=decimal*0.1;
  129.                   Acomulado = Acomulado+tecla*decimal;
  130.                   lcd_gotoxy(1,2);
  131.                   printf(lcd_putc,"Nuevo: %f             ",Acomulado);
  132.                   Revote();
  133.           }
  134.  
  135.         } while(tecla2!=PUERTOB);
  136.  
  137.  
  138.         Revote2();
  139.  
  140.         lcd_gotoxy(1,1);
  141.         printf(lcd_putc," \f ");
  142.  
  143.         return Acomulado;
  144. }
  145.  
  146.  
  147. #int_RB
  148. RB_isr(){
  149.         Entero();
  150.         tecla2=tecla1;
  151.  
  152.         lcd_gotoxy(1,1);
  153.         switch (tecla) {
  154.  
  155.                 case 0  :
  156.                         printf(lcd_putc,"Detener el Motor:   ");
  157.                         Revote();
  158.                         break;
  159.  
  160.                 case 1  :
  161.                         printf(lcd_putc,"Decrementar Kp:     ");
  162.                         Revote();
  163.                         break;
  164.  
  165.                 case 2  :
  166.                         printf(lcd_putc,"Incrementar Kp:     ");
  167.                         Revote();
  168.                         break;
  169.  
  170.                 case 3  :
  171.                         printf(lcd_putc,"Establecer Kp:      ");
  172.                         Revote();
  173.                      break;
  174.  
  175.  
  176.                 case 4  :
  177.                         printf(lcd_putc,"Decrementar Ki:     ");
  178.                         Revote();
  179.                         break;
  180.  
  181.                 case 5  :
  182.                         printf(lcd_putc,"Incrementar Ki:     ");
  183.                         Revote();
  184.                         break;
  185.  
  186.                 case 6  :
  187.                         printf(lcd_putc,"Establecer Ki:      ");
  188.                         Revote();
  189.                      break;
  190.  
  191.  
  192.                 case 7  :
  193.                         printf(lcd_putc,"Decrementar Kd:     ");
  194.                         Revote();
  195.                         break;
  196.  
  197.                 case 8  :
  198.                         printf(lcd_putc,"Incrementar Kd:     ");
  199.                         Revote();
  200.                         break;
  201.  
  202.                 case 9  :
  203.                         printf(lcd_putc,"Establecer Kd:      ");
  204.                         Revote();
  205.                      break;
  206.  
  207.                 case 10  :
  208.                         printf(lcd_putc,"Establecer velocidad");
  209.                         Revote();
  210.                break;
  211.  
  212.                 case 11  :
  213.                         printf(lcd_putc,"Calibrar Motor DC:  ");
  214.                         Calibracion=Get_Numero(Calibracion);
  215.  
  216.                         break;
  217.  
  218.                 case 12 :
  219.                         printf(lcd_putc,"Decrementos 10 RPM: ");
  220.                         Revote();
  221.                         break;
  222.  
  223.                 case 13 :
  224.                         printf(lcd_putc,"Incrementos 10 RPM: ");
  225.                         Revote();
  226.                         break;
  227.  
  228.                 case 14 :
  229.                         printf(lcd_putc,"Decrementos 100 RPM:");
  230.                         Revote();
  231.                         break;
  232.  
  233.                 case 15 :
  234.                         printf(lcd_putc,"Incrementos 100 RPM:");
  235.                         Revote();
  236.                      break;
  237.  
  238.                 default   :              ;   break; }
  239.  
  240.  
  241. }
  242.  
  243.  
  244. void inicializar(){
  245.         lcd_init();
  246.  
  247.         set_tris_b(0b11110000);              // Inicializacion del Teclado
  248.         set_tris_c(0x00);
  249.  
  250.         port_b_pullups(TRUE);
  251.         LSB=0b11111110;
  252.         PUERTOB=LSB;
  253.  
  254.         setup_adc_ports(AN0|VSS_VDD);        // Inicializacion del ADC
  255.         setup_adc(ADC_CLOCK_DIV_8);
  256.         set_adc_channel( 0 );
  257.  
  258.         setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
  259.         setup_timer_3(T3_INTERNAL|T3_DIV_BY_8);
  260.  
  261.         enable_interrupts(INT_TIMER1);
  262.         enable_interrupts(INT_TIMER3);
  263.  
  264.         enable_interrupts(INT_RB);
  265.         EXT_INT_EDGE(1,H_TO_L);
  266.         port_b_pullups(TRUE);
  267.  
  268.         enable_interrupts(GLOBAL);
  269.  
  270.         setup_ccp1(CCP_PWM);   // Configure CCP1 as a PWM
  271.         setup_timer_2(T2_DIV_BY_16, 127, 1);
  272.  
  273.         //   setup_ccp1(CCP_PWM_FULL_BRIDGE|CCP_SHUTDOWN_AC_L|CCP_SHUTDOWN_BD_L);
  274.  
  275. }

velocidad.c
Código: Matlab M
  1. #include "velocidad.h"
  2.  
  3. #int_TIMER3
  4. TIMER3_isr()
  5. {
  6. //      lcd_gotoxy(1,1);
  7. //      printf(lcd_putc,"Valor del ADC0  %lu     ",value);
  8.  
  9. }
  10.  
  11.  
  12. void main()
  13. {
  14.         inicializar();
  15.  
  16.         while (true){
  17.         value   = read_adc();
  18.         Velocidad       = Calibracion*value;
  19.         Voltaje         = 0.0048828125*value;
  20.  
  21.         lcd_gotoxy(1,1);
  22.         printf(lcd_putc,"Vel : %.3f RPM        \nADC0: %.1f volts        ",Velocidad,Voltaje);
  23.  
  24.      set_pwm1_duty(value);          // This sets the time the pulse is
  25.  
  26.         }
  27. }
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 #24 en: 15 de Octubre de 2006, 16:49:29 »
Hola lo que resta es analizar la función del controlador PID. Lo primero que se debe de tener desde mi punto de vista es obtener la función del PID pero en la variable Z posterior de ahí hacer el análisis de la respuesta pero con el programa MATLAB.

Bueno creo que ya he excedido el up load que el servidor me permite pero pues mediante el siguiente enlace se tendrá a un archivo PDF donde se explica la función de transferencia en Z del controlador PID.

Discretización_PID
« Última modificación: 15 de Octubre de 2006, 16:52:08 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 #25 en: 15 de Octubre de 2006, 17:02:38 »
En otro post he subido el esquematico y el proyecto de protel DXP del teclado matricial que estoy utilizando.

Teclado_Matricial
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 #26 en: 17 de Octubre de 2006, 14:25:11 »
Hola el programa base del Controlador ya esta terminado.

Consiste en general de:

Obtencion del numero entero mediante el teclado matricial
Los datos se despliegan mediante un corrimiento en el LCD ya que no cuento con un LCD muy grande .

velocidad.h
Código: Matlab M
  1. #include <18F4550.h>
  2. #device adc=10
  3.  
  4. #FUSES NOPROTECT
  5. #FUSES PUT
  6. #FUSES NOLVP
  7. #FUSES NOBROWNOUT
  8. #FUSES NOWDT
  9. #FUSES HSPLL
  10. #FUSES NODEBUG
  11. #FUSES PLL3
  12. #FUSES USBDIV
  13. #FUSES CPUDIV1
  14. #FUSES VREGEN
  15.  
  16. #use delay(clock=48000000)
  17.  
  18. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  19. #priority RB,TIMER3,TIMER1
  20. #include <LCD.C>
  21. #include <string.h>
  22.  
  23.  
  24. #use fast_io(A)
  25. #use fast_io(B)
  26. #use fast_io(C)
  27. #use fast_io(E)
  28.  
  29. #byte PUERTOB   = 0xF81
  30. #bit  BEEP      = 0xF83.3
  31. #bit  BOTON1    = 0xF84.0
  32.  
  33. #opt 11
  34.  
  35.  
  36. byte LSB=0b11111110;
  37. byte tecla,tecla1,tecla2;
  38.  
  39. int8 i,No_Caracter,Array_length,Offset,Prescaler=20,text_array[80];      //Corrimiento
  40.  
  41. int16 Proporcion=1;
  42. long  value=0,contB=0;
  43. float Acomulado=0,Velocidad=500,VelocidadMedida,Voltaje, Calibracion = 1.45 ;
  44. float Kp=0,Ki=0,Kd=0;
  45. float a0,a1,a2;
  46. byte BanderaB;
  47.  
  48. Corrimiento(){
  49.                 PUERTOB=LSB;
  50.                 rotate_left( &LSB, 1);
  51.                 if(LSB==0b11101111)
  52.                 LSB=0b11111110;
  53. }
  54.  
  55. #int_TIMER1
  56. TIMER1_isr(){
  57. Corrimiento();
  58. }
  59.  
  60. #int_TIMER3
  61. TIMER3_isr(){
  62. Prescaler++;
  63. }
  64.  
  65. Revote(){
  66.         if (tecla!=16){
  67.                 while(tecla1==PUERTOB)
  68.                 while(tecla==tecla2);
  69.                 BEEP=1;
  70.                 delay_ms(100);
  71.              BEEP=0;
  72.         }
  73. }
  74.  
  75. int Entero(){
  76.         tecla=PUERTOB;
  77.         tecla1=PUERTOB;
  78.         switch (tecla) {
  79.           case 0xEE : tecla=15;         break;
  80.           case 0xED : tecla=9 ;              break;
  81.           case 0xEB : tecla=8 ;         break;
  82.           case 0xE7 : tecla=7 ;         break;
  83.           case 0xDE : tecla=14;         break;
  84.           case 0xDD : tecla=6 ;         break;
  85.           case 0xDB : tecla=5 ;         break;
  86.           case 0xD7 : tecla=4 ;         break;
  87.           case 0xBE : tecla=13;         break;
  88.           case 0xBD : tecla=3 ;         break;
  89.           case 0xBB : tecla=2 ;         break;
  90.           case 0xB7 : tecla=1 ;         break;
  91.           case 0x7E : tecla=12;         break;
  92.           case 0x7D : tecla=11;         break;
  93.           case 0x7B : tecla=10;         break;
  94.           case 0x77 : tecla=0 ;         break;
  95.           default       : tecla=16;             break; }
  96.         return tecla;
  97. }
  98.  
  99. float Get_Numero( float Actual){
  100.         float Decimal=1;
  101.         int      Bandera=0;
  102.         int      Decimas=1;
  103.  
  104.         Proporcion=1;
  105.         Acomulado=0;
  106.      lcd_gotoxy(1,2);
  107.         if(Actual==0)
  108.              printf(lcd_putc,"Actual: %.0f            ",Actual);
  109.         else
  110.              printf(lcd_putc,"Actual: %f              ",Actual);
  111.         Revote();
  112.         Do{
  113.                 Corrimiento();
  114.                 Entero();
  115.                 delay_ms(40);
  116.                 if(tecla==15)
  117.                 goto FIN1;
  118.         } while(tecla2!=PUERTOB);
  119.  
  120.         lcd_gotoxy(1,2);
  121.         printf(lcd_putc,"Nuevo: %.0f             ",Acomulado);
  122.         Revote();      
  123.  
  124.         Do{
  125.                 Corrimiento();
  126.                 Entero();
  127.                 delay_ms(30);
  128.                 if(tecla==10 && Bandera==0){
  129.                         lcd_gotoxy(1,2);
  130.                         printf(lcd_putc,"Nuevo: %.0f.             ",Acomulado);
  131.                         Bandera=1;
  132.                         Revote();
  133.                 }
  134.                 if(tecla==14){
  135.                         Acomulado=0;
  136.                         lcd_gotoxy(1,2);
  137.                         printf(lcd_putc,"Nuevo: %.0f              ",Acomulado);
  138.                         Bandera=0;
  139.                         Revote();
  140.                 }
  141.                 if(tecla<10 && Bandera==0){
  142.                         Acomulado = Acomulado*10+tecla;
  143.                         lcd_gotoxy(1,2);
  144.                         printf(lcd_putc,"Nuevo: %.0f             ",Acomulado);
  145.                         Revote();
  146.                 }
  147.           if(tecla<10 && Bandera==1 && Decimas<=4){
  148.                   decimal=decimal*0.1;
  149.                   Acomulado = Acomulado+tecla*decimal;
  150.                   lcd_gotoxy(1,2);
  151.                   switch (Decimas) {
  152.                     case 1 : printf(lcd_putc,"Nuevo: %.1f          ",Acomulado);break;
  153.                     case 2 : printf(lcd_putc,"Nuevo: %.2f          ",Acomulado);break;
  154.                     case 3 : printf(lcd_putc,"Nuevo: %.3f          ",Acomulado);break;
  155.                     case 4 : printf(lcd_putc,"Nuevo: %.4f          ",Acomulado);break;
  156.                         }
  157.                         Decimas++;
  158.                   Revote();
  159.                 }
  160.                 if(Decimas>4) goto FIN;
  161.         }while(tecla!=12);
  162.  
  163.         FIN:
  164.                 Revote();      
  165.                 lcd_gotoxy(1,1);
  166.                 printf(lcd_putc," \f ");
  167.                 return Acomulado;
  168.        
  169.         FIN1:
  170.                 Revote();      
  171.                 return Actual;
  172. }
  173.  
  174. Impresion_LCD(){
  175.         lcd_gotoxy(1,1);
  176.         printf(lcd_putc,"Velocidad:%.1f RPM     ",VelocidadMedida);
  177.         if(BOTON1==1)
  178.                 sprintf(text_array,"P:%.2f I:%.2f D:%.2f ",Kp,Ki,Kd);
  179.         if(BOTON1==0){
  180.                 sprintf(text_array,"%.1f_RPM %.3f_volts %lu_Bits ",Velocidad,Voltaje,value);
  181.                 Array_length=strlen(text_array);
  182.                 lcd_gotoxy(1,2);
  183.                 Offset--;
  184.                 for(i=0,No_Caracter=Offset;i<20;i++,No_Caracter++){
  185.                         if(No_Caracter>=Array_length)
  186.                                 No_Caracter=0;
  187.                         lcd_putc(text_array[No_Caracter]);
  188.                 }
  189.                 Offset++;
  190.         }
  191.         if(Prescaler>20){
  192.                 Array_length=strlen(text_array);
  193.                 lcd_gotoxy(1,2);
  194.                 Prescaler=0;
  195.                 for(i=0,No_Caracter=Offset;i<20;i++,No_Caracter++){
  196.                         if(No_Caracter>=Array_length)
  197.                                 No_Caracter=0;
  198.                         lcd_putc(text_array[No_Caracter]);
  199.                 }
  200.                 Offset++;
  201.                 if(Offset>=Array_length)
  202.                 Offset=0;
  203.         }
  204. }
  205.  
  206.  
  207. #int_RB
  208. RB_isr(){
  209.         Entero();
  210.         tecla2=tecla1;
  211.  
  212.         lcd_gotoxy(1,1);
  213.         switch (tecla) {
  214.                 case 0  :
  215.                      set_pwm1_duty(0);
  216.                         Revote();
  217.                         break;
  218.                 case 1  :
  219.                         Kp-=0.01;
  220.                         BEEP=1;
  221.                         delay_ms(100);
  222.                         break;
  223.                 case 2  :
  224.                         Kp+=0.01;
  225.                         BEEP=1;
  226.                         delay_ms(100);
  227.                         break;
  228.                 case 3  :
  229.                         printf(lcd_putc,"Establecer Kp:      ");
  230.                         Kp=Get_Numero(Kp);
  231.                      break;
  232.                 case 4  :
  233.                         Ki-=0.01;
  234.                         BEEP=1;
  235.                         delay_ms(100);
  236.                         break;
  237.                 case 5  :
  238.                         Ki+=0.01;
  239.                         BEEP=1;
  240.                         delay_ms(100);
  241.                         break;
  242.                 case 6  :
  243.                         printf(lcd_putc,"Establecer Ki:      ");
  244.                         Ki=Get_Numero(Ki);
  245.                      break;
  246.                 case 7  :
  247.                         Kd-=0.01;
  248.                         BEEP=1;
  249.                         delay_ms(100);
  250.                         break;
  251.                 case 8  :
  252.                         Kd+=0.01;
  253.                         BEEP=1;
  254.                         delay_ms(100);
  255.                         break;
  256.                 case 9  :
  257.                         printf(lcd_putc,"Establecer Kd:      ");
  258.                         Kd=Get_Numero(Kd);
  259.                      break;
  260.                 case 10  :
  261.                         printf(lcd_putc,"Establecer velocidad");
  262.                         velocidad=Get_Numero(velocidad);
  263.                break;
  264.                 case 11  :
  265.                         printf(lcd_putc,"Calibrar Motor DC:  ");
  266.                         Calibracion=Get_Numero(Calibracion);
  267.                         break;
  268.                 case 12 :
  269.                         velocidad-=10;
  270.                         BEEP=1;
  271.                         delay_ms(100);
  272.                         break;
  273.                 case 13 :
  274.                         velocidad+=10;
  275.                         BEEP=1;
  276.                         delay_ms(100);
  277.                         break;
  278.                 case 14 :
  279.                   lcd_gotoxy(1,2);
  280.                         velocidad-=100;
  281.                         BEEP=1;
  282.                         delay_ms(100);
  283.                         break;
  284.                 case 15 :
  285.                   lcd_gotoxy(1,2);
  286.                         velocidad+=100;
  287.                         BEEP=1;
  288.                         delay_ms(100);
  289.                         break;
  290.                 default   :              ;   break; }
  291.                 if(velocidad<=0)
  292.                 velocidad=0;           
  293.                 sprintf(text_array,"P:%.2f I:%.2f D:%.2f ",Kp,Ki,Kd);
  294.                 Array_length=strlen(text_array);
  295.                 lcd_gotoxy(1,2);
  296.                 Offset--;
  297.                 for(i=0,No_Caracter=Offset;i<20;i++,No_Caracter++){
  298.                         if(No_Caracter>=Array_length)
  299.                                 No_Caracter=0;
  300.                         lcd_putc(text_array[No_Caracter]);
  301.                 }
  302.                 Offset++;
  303.                 BEEP=0;
  304. }
  305.  
  306.  
  307. void inicializar(){
  308.         lcd_init();
  309.  
  310.         set_tris_b(0b11110000);
  311.         set_tris_c(0b10010001);
  312.         set_tris_e(0xff);
  313.  
  314.         port_b_pullups(TRUE);
  315.         LSB=0b11111110;
  316.         PUERTOB=LSB;
  317.  
  318.         setup_adc_ports(AN0|VSS_VDD);        // Inicializacion del ADC
  319.         setup_adc(ADC_CLOCK_DIV_8);
  320.         set_adc_channel( 0 );
  321.  
  322.         setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);
  323.         setup_timer_3(T3_INTERNAL|T3_DIV_BY_8);
  324.  
  325.         enable_interrupts(INT_TIMER1);
  326.         enable_interrupts(INT_TIMER2);
  327.         enable_interrupts(INT_TIMER3);
  328.  
  329.  
  330.  
  331.         enable_interrupts(INT_RB);
  332.         EXT_INT_EDGE(1,H_TO_L);
  333.         port_b_pullups(TRUE);
  334.  
  335.         enable_interrupts(GLOBAL);
  336.  
  337.         setup_ccp1(CCP_PWM);   // Configure CCP1 as a PWM
  338.         setup_timer_2(T2_DIV_BY_16, 127, 1);   
  339. }

y el programa principal es:
velocidad.c

Código: Matlab M
  1. #include "velocidad.h"
  2.  
  3.  
  4.  
  5. void main()
  6. {
  7.         Impresion_LCD();
  8.         inicializar();
  9.  
  10.         while (true){
  11.                 value            = read_adc();
  12.                 VelocidadMedida = Calibracion*value;
  13.                 Voltaje                  = 0.0048828125*value;
  14.                 Impresion_LCD();
  15.              set_pwm1_duty(value);          // This sets the time the pulse is
  16.         }
  17. }
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 #27 en: 17 de Octubre de 2006, 14:38:16 »
Ahora la idea es programar un PWM para cargar la señal de control, u(k).

La bronca es que nose muy bien como pordria hacerle,  la idea que tengo es:

Hechar a jalar el PWM, lo que no entiendo bien es si el PWM comienza en alto o en bajo, lo ideal es que comiense en bajo. Cuando caiga el PWM que active una interrupcion en el timer2, donde programaré los calculos del algoritmo PWM despues de ahi obtener el valor u(k) y cargarlo en el tiempo de trabajo.

Por lo tanto si la señal de control es Cero pues cargo cero al dutu time + La señal de control anterior.

Espero que alguien pueda darme una ayuda en este punto ya que es lo mas importante del tema.

 
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 LETAL

  • PIC16
  • ***
  • Mensajes: 101
Re: PID DISCRETO.
« Respuesta #28 en: 17 de Octubre de 2006, 15:52:53 »
Suponiendo que cuando las acciones den un resultado igual o menor a 0, asumas como salida 0%.
Entonces simplemente cuando salida sea 0% tu dutycicle será 0 y cuando sea 100% será 255.

Yo en los cálculos lo trabajo en porcentaje por eso en caso de usar pwm debería hacer
(salida en %)*255/100=dutycicle.
Obvio que si haces los cálculos en valor absoluto sería más directa la cosa, solo deberías limitar el valor maximo y mínimo de salida y ese sería tu duty.

Desconectado pantera

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 215
Re: PID DISCRETO.
« Respuesta #29 en: 17 de Octubre de 2006, 15:57:39 »
Ok me late tu consejo tomar en cuenta el maximo error y cargarle ese valor al PWM en el duty_cicly ya de ahi para los otros simplemente son proporciones.

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 :-)


 

anything