TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: francpa en 18 de Abril de 2013, 17:58:45

Título: medicion de voltaje de bateria con pic
Publicado por: francpa en 18 de Abril de 2013, 17:58:45
hola a todos

mi problema es el siguiente estoy midiendo voltaje de una batería de plomo ácido 12 v 7Ah con un Microcontrolador, lo que pasa es que necesito encender un led dependiendo del estado de carga de la batería, por ejemplo 13.8v  enciende un Led, pero la curva de carga de esta batería es como muestro en el dibujo. por lo que llega a un nivle de 13.8 pero despues llega  a  14.5 y despues baja hasta 13.8 de nuevo donde se mantiene definitivamente a ese valor y es ahi donde quiero que se encienda el led no antes. ojala me haya explicado bien(http://wetfloor.ruido-blanco.net/uploaded/20130418135213/13.8-wetfloor.png)
con el código que he hecho se prende el led en la etapa de transicion no de flotación como debe de ser
adjunto el codigo
Código: [Seleccionar]
#include <PRUEBA_RS232_2.h>


void main() {

   int iteracion=0;
   int16 medicion1=0, medicion2=0;
   float voltaje1=0, var_aux1=0, sumatoria=0, sumatoria2=0, volt=0, voltDS=0, voltaje2=0, var_aux2=0;
   setup_adc_ports(sAN2|sAN3);
   setup_adc(ADC_CLOCK_DIV_64);
   setup_timer_4(T4_DISABLED,0,1);
   setup_timer_6(T6_DISABLED,0,1);

   setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
   
while(TRUE){

   sumatoria=0;
   sumatoria2=0;
   iteracion=1;
   
 
         for(iteracion= 1; iteracion<=50; iteracion++)
      {
      set_adc_channel(3); 
      delay_us(20);
      medicion1 = read_adc();
      var_aux1=medicion1;
      voltaje1 = ((var_aux1/1023)*(15-5)*1/2)*2+5.16;
      sumatoria=voltaje1+sumatoria;
     
      set_adc_channel(2);
      delay_us(20);
      medicion2 = read_adc();
      var_aux2=medicion2;
      voltaje2=((var_aux2/1023)*5);
      sumatoria2=voltaje2+sumatoria2;
     
      }
      volt=sumatoria/50; //tensiones de entrada
      voltDS=sumatoria2/50; //tensiones de entrada 
     
      printf(/*lcd_putc,*/ "Promedio = %01.2fV\r\n", volt);
      printf("VDS = %01.2fV\r\n", voltDS);
     
      if((volt>=13.8)
      output_high(PIN_C5);
      delay_us(20);
      }
      else{
      output_low(PIN_C5);
      }
}
     

no se como hacerlo su ayuda seria de mucha ayuda
saludos y gracias de ante mano
Título: Re: medicion de voltaje de bateria con pic
Publicado por: jeremylf en 18 de Abril de 2013, 18:46:06
Facil, con un contador. En la primera que llege a 13.8 (con una histerisis de 0.5 talvez), lo pones a 1 y cuando pase lo mismo, lo pones a 2. y ahi recien aactivas el led.

algo asi:
cont = 0; flag = 0;

while(1){
if (adc >= 13.8-0.5 && adc <= 13.8+0.5)
   {if (flag == 0) { cont++; flag = 1;}}
else flag = 0;

if cont >= 2
{led = 1;}
}
Título: Re: medicion de voltaje de bateria con pic
Publicado por: PCCM en 18 de Abril de 2013, 18:55:05
Podría ser como dice jeremy, pero ten en cuenta la velocidad de adquisición del ADC, ya que por lo que se ve en tu código es inmediato y leer con un contador sin darle un buen retardo hará que se confunda ya que el valor de 13.08 con histéresis de 0.5 lo cumplirá muchísimas veces en la primera llegada.

Título: Re: medicion de voltaje de bateria con pic
Publicado por: PalitroqueZ en 18 de Abril de 2013, 19:51:03
Podría ser como dice jeremy, pero ten en cuenta la velocidad de adquisición del ADC, ya que por lo que se ve en tu código es inmediato y leer con un contador sin darle un buen retardo hará que se confunda ya que el valor de 13.08 con histéresis de 0.5 lo cumplirá muchísimas veces en la primera llegada.



una solución sería tomar cada valor y compararlo con el anterior, si el resultado es positivo, entonces el voltaje es decreciente, bastaría realizar esta comparación hasta que el voltaje medido= 13.8 (verificado varias veces también)

Título: Re: medicion de voltaje de bateria con pic
Publicado por: francpa en 19 de Abril de 2013, 18:04:48
muchas gracias por su respuestas ,  me funciono super bien lo de la bandera y el contador mencionado por jeremylf, pero como lo puedo hacer para poner otro nivel de voltaje por ejemplo 13 volt pero donde se encienda el led en subida y luego en bajadad despues de 13.8v  no quiero abusar de ustedes pero no me sale, cualquier ayuda muchas gracias
saludos