Autor Tema: PID_EEPROM_FLOAT  (Leído 3072 veces)

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

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
PID_EEPROM_FLOAT
« en: 25 de Abril de 2013, 17:12:27 »
Que tal amigos, eh estado modificando un codigo que me encontre aqui en la red. Se trata de un menú, en el cual configuro los valores de un control PID, (kp,ki,kd). y por medio de pulsadores configuro estos valores y los pretendo guardar en la memoria EEPROM interna del pic.

Bueno, pues como los valores kp,ki,kd son flotantes hice uso de la libreria internal_eeprom incluida ya en el ccs.

Pues este es mi problema. Si se escriben los valoes, y los leo de igual manera. Pero el problema es que cuando desconecto la energia y quiero configurar el valor de las constantes pid se vuelva como si no se hubieran guardado en la eeprom. Les dejo el programa y la simulacion para que me ayuden. No logro que despues de desconectar la energia se que den guardados los valores de las configuraciones kp,ki,kd.


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Anexo todos los archivos para su simulacion y codigo en ccs.


Comenten y ayudenme porfavor!

         #include <18F4550.h>
         #fuses PLL1,CPUDIV1,USBDIV,XTPLL,NOFCMEN,NOIESO,PUT,NOBROWNOUT,VREGEN,NOWDT,NOPBADEN,MCLR,NOSTVREN,NOLVP,NODEBUG,NOPROTECT,NOSTVREN,NOCPB,NOWRT,NOWRTC
         #use delay(clock=48000000)       
           
         #byte pb      = 0xF81
         #bit  t_ok    = pb.1     
         #bit  t_mas   = pb.2     
         #bit  t_mns   = pb.3     
         
         #byte intcon3 = 0xFF0
         #bit  intf1   = intcon3.0
         #include <lcd4x20.c>
         #include <internal_eeprom.c>     
         #include <menu.h>
         
         
                 
         void main()
         {         
         
         port_b_pullups(true);
         setup_adc_ports(NO_ANALOGS);
         read_float_eeprom(KP_EEPROM);
         
         lcd_init();
         intf1=0;
 
         
         enable_interrupts(INT_EXT1);
         enable_interrupts(GLOBAL);
                 
         
         while(true)
         {
         
         lcd_gotoxy(1,2); printf(lcd_putc,"kp: %f        ", read_float_eeprom(KP_EEPROM)); 
         lcd_gotoxy(1,3); printf(lcd_putc,"ki: %f        ", read_float_eeprom(KI_EEPROM));
         lcd_gotoxy(1,4); printf(lcd_putc,"kd: %f        ", read_float_eeprom(KD_EEPROM));
         
         }
         }
         

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Esta es un alibreria:  menu.h


         #define KP_EEPROM 100
         #define KI_EEPROM 200
         #define KD_EEPROM 300               
         
         float kp=682.8,ki=68.28,kd=1707;
         static unsigned int8 testado,i;
         
         void menu_uno(void);
         void menu_dos(void);
         void menu_tres(void);
         
         #INT_EXT1
         menu()
         {
         disable_interrupts(GLOBAL);
         disable_interrupts(INT_EXT1);
         delay_ms(300);
         testado=0;
         lcd_putc("\f");
         lcd_gotoxy(1,1); lcd_putc("      MENU PID      ");
         lcd_gotoxy(1,2); lcd_putc("[1] = Kp    [2] = Ki");
         lcd_gotoxy(1,3); lcd_putc("[3] = Kd   
  • =   ");

         lcd_gotoxy(1,4); lcd_putc("   Opcion: --> [ ]  ");
         
         for(i=0;i!=255;i++)                                         // 5 segundos para pulsar alguna tecla
         {
         delay_ms(20); lcd_gotoxy(17,4); printf(lcd_putc,"%u",testado);
         
         if (!t_ok){delay_ms(300); break;}
         else if (!t_mas){i=0; delay_ms(300); testado++; if(testado>3){testado=0;};}
         else if (!t_mns){i=0; delay_ms(300); testado--; if(testado==255){testado=3;};}
         };
         
         if(testado==0)                                              // Si la opcion seleccionada es la 0, salimos del menú
         {
         intf1=0;
         enable_interrupts(GLOBAL);
         enable_interrupts(INT_EXT1);
         lcd_putc("\f");
         break;
         }
         else if(testado==1){menu_uno(); lcd_putc("\f");}
         else if(testado==2){menu_dos(); lcd_putc("\f");}
         else if(testado==3){menu_tres();lcd_putc("\f");}
         }
         
////////////////////////////////////////////////////////////////////////////////
//    Submenu 1
//
////////////////////////////////////////////////////////////////////////////////

         void menu_uno(void)
         {
         lcd_putc("\f");         
         
         while(t_ok)
         {       
         if (!t_mas) { delay_ms (75); kp=kp+0.1; }       
         if (!t_mns) { delay_ms (75); kp=kp-0.1; }
         
         write_float_eeprom(KP_EEPROM,kp);
         lcd_gotoxy(1,1); printf(lcd_putc,"CONTROL PROPORCIONAL");
         lcd_gotoxy(1,3); printf(lcd_putc,"Variable Kp:  %f",kp);
         
         intf1=0;
         enable_interrupts(GLOBAL);
         enable_interrupts(INT_EXT1);
         }}
   
////////////////////////////////////////////////////////////////////////////////
//    Submenu 2
//
////////////////////////////////////////////////////////////////////////////////

         void menu_dos(void)
         {
         lcd_putc("\f");
         
         while(t_ok)
         {
         if (!t_mas) { delay_ms (75); ki=ki+0.1; }       
         if (!t_mns) { delay_ms (75); ki=ki-0.1; }
         write_float_eeprom(KI_EEPROM,ki);
         lcd_gotoxy(1,1); printf(lcd_putc,"  CONTROL INTEGRAL  ");
         lcd_gotoxy(1,3); printf(lcd_putc,"Variable Ki:  %f",ki);   
         
         intf1=0;
         enable_interrupts(GLOBAL);
         enable_interrupts(INT_EXT1);
         }}
         
////////////////////////////////////////////////////////////////////////////////
//    Submenu 3
//
////////////////////////////////////////////////////////////////////////////////

         void menu_tres(void)
         {
         lcd_putc("\f");     
         
         while(t_ok)
         {
         if (!t_mas) { delay_ms (75); kd=kd+0.1; }       
         if (!t_mns) { delay_ms (75); kd=kd-0.1; }
         write_float_eeprom(KD_EEPROM,kd);
         lcd_gotoxy(1,1); printf(lcd_putc," CONTROL DERIVARIVO ");
         lcd_gotoxy(1,3); printf(lcd_putc,"Variable Kd:  %f",kd);
         
         intf1=0;
         enable_interrupts(GLOBAL);
         enable_interrupts(INT_EXT1);
         }}
         
////////////////////////////////////////////////////////////////////////////////         

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Anexo los archivos y la simulacion en proteus.

Porfavor comenten y ayudenme!

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: PID_EEPROM_FLOAT
« Respuesta #1 en: 25 de Abril de 2013, 17:35:08 »
Ese PIC tiene 256 bytes de EEPROM.
Las direcciones que le das 100, 200 y 300, como las elegiste??

Si 100 es tomado como decimal, es 64 en hexa, deberia guardar el valor...
El caso de 200, si es decimal, tambien debiera guardar su valor.

Pero la direccion 300 no existe en la EEPROM, debiera darte un error, pero debe interpretar otra cosa por eso no te da error.
 :mrgreen: :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Re: PID_EEPROM_FLOAT
« Respuesta #2 en: 25 de Abril de 2013, 17:43:59 »
E cambiado esos valores a 1, 2 y 3 pero en la lcd me muestra puros ceros y si le anexo 10, 20 y 30 pues si escribe las constantes kp,ki,kd con decimales. Por favorpodrias simularlo y compartir tu apinion?

Yo habia guardado valores de la eeprom con esos valores pero cuando se trataba de variables int y no del tipo float.

De hecho yo los guarde de la siguiente manera y si hace lo que quiero en el proteus pero en lo fisico no. Pouendo esto despues del la funcion main:


kp=read_float_eeprom(KP_EEPROM);  
ki=read_float_eeprom(KI_EEPROM);  
kd=read_float_eeprom(KD_EEPROM);  

despues del main y si hace las cosas corecto. es decir, depues de desconectar la energia el valor lo guardaba. Pero comento nuevamente que estolo e realizado para variables del tipo int y no float

que para los de tipo int que ya eh hecho seria:

kp=read_eeprom(KP_EEPROM);  
ki=read_eeprom(KI_EEPROM);  
kd=read_eeprom(KD_EEPROM);  



« Última modificación: 25 de Abril de 2013, 17:53:58 por mariacontenis »

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: PID_EEPROM_FLOAT
« Respuesta #3 en: 25 de Abril de 2013, 18:05:00 »
Cambia esta parte:

Código: C
  1. #define KP_EEPROM 100
  2.          #define KI_EEPROM 200
  3.          #define KD_EEPROM 300

de esta forma:

Código: C
  1. #define KP_EEPROM 1
  2.          #define KI_EEPROM 5
  3.          #define KD_EEPROM 9

(debes reservar 4 posiciones para guardar una float en eeprom)

y en el main() hazlo asi:

Código: C
  1. kp=read_float_eeprom(KP_EEPROM);  
  2. ki=read_float_eeprom(KI_EEPROM);  
  3. kd=read_float_eeprom(KD_EEPROM);

Para visualizarlo deberas hacerlo de esta forma:

Código: C
  1. while(true)
  2.          {
  3.          
  4.          lcd_gotoxy(1,2); printf(lcd_putc,"kp: %5.2f        ", Kp);  
  5.          lcd_gotoxy(1,3); printf(lcd_putc,"ki: %5.2f        ", Ki);
  6.          lcd_gotoxy(1,4); printf(lcd_putc,"kd: %5.2f        ", Kd);
  7.          
  8.          }

Con eso deberia funcionar, no puedo simulartelo aqui...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Re: PID_EEPROM_FLOAT
« Respuesta #4 en: 29 de Abril de 2013, 19:32:16 »
Que tal amigo, eh probado de la manera en que comentas sin resulatados satisfactorios. Me muestra kp=0.00, ki=0.00, kd=0.00

En proteus y en la realidad.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: PID_EEPROM_FLOAT
« Respuesta #5 en: 29 de Abril de 2013, 21:47:21 »
Es extraño, yo testee en Proteus el programa que colgaste y a mi me guarda los valores...
Solo si apago el proteus y lo abro nuevamente se pierden los valores, sino no se pierden...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Re: PID_EEPROM_FLOAT
« Respuesta #6 en: 30 de Abril de 2013, 10:26:09 »
Ok, bien. Ya lo tengo igual!!.

Solo que tambien quisiera que esos datos no se perdieran despues de desconectar la energia. Por que tanto en el proteus como en lo fisico el valor modificado de las constantes de integracion se pierden y a mi me gustaria que se quedaran grabados estos valores.

Y si mientras no desconecto la energia los valores se siquen guardando. Pero con eso ya es un avance, gracias por gran ayuda voy a seguir revisando, espero de igual manera me sigas ayudando. Gracias...