jueves, 7 de febrero de 2013

SENSOR NIVEL DE BATERÍA

A continuación explicaremos cómo realizar un sencillo sensor de nivel de batería con un microcontrolador PIC y un divisor de tensión formado por un condensador y dos resistencias.

La idea es usar una entrada analógica del PIC y convertir ese valor analógico en digital para saber en todo momento el nivel de carga de una batería. Nosotros hemos utilizado una Li-Po de 7.2V, pero este circuito sirve para cualquier tipo de batería.

Lo primero que hay que hacer es medir la tensión de la batería en carga máxima y descargada. En nuestra batería hemos obtenido un valor máximo de 8.45V y uno mínimo de 6.5V. Observamos que la diferencia entre carga máxima y descarga es de 1.95V.

Después crearemos un circuito con un LCD para visualizar el nivel digital de dicha tensión. El circuito será lo más simple posible, como se muestra a continuación, teniendo en cuenta que el PIC necesita una alimentación de 5V.


Antes de realizar el circuito tenemos que saber el valor de las resistencias que usaremos en el divisor de tensión, determinado por la batería elegida (7,2V – 1000mA/h). Para ello debemos hacer un pequeño circuito que ira conectado de la batería a la patilla AN0 de nuestro PIC. Para medir el nivel de la batería hemos colocado un un divisor resistivo, puesto que el conversor ADC del PIC tiene un rango de 0 a 5V, y la batería sera en cualquier caso de 7V o más.

: 
Viendo el pequeño esquema de nuestra derecha, la relación del voltaje a medir (AN0) con la batería es la siguiente:


Sabiendo esta formula, podremos calcular teóricamente el valor de las resistencias.

Procederemos a calcular el valor de las resistencias del divisor de tensión sabiendo:

  •   VAN0= 4V entrarán como máximo por el ADC
  • V D1 = 0,7V
  • V Bateria = 8.45V (valor máximo)


Le daremos un valor a R19 para despejar R18 ; por ejemplo 4K7ohm. De aquí despejamos R18 = 4k3Ω 

El valor de ambas resistencias serán iguales, de 4k3Ω, en el mercado no existe ese valor, pero utilizaremos el más cercano que es de 4K7Ω.
Una vez hecho el circuito, visualizamos en el LCD la conversión digital de la tensión máxima y mínima. En nuestro caso hemos obtenido 0864 para la tensión máxima, y 0665 para la mínima. Vemos que hay una diferencia de 199 entre el máximo y el mínimo.

Ya con estos datos sólo tenemos que hacer una regla de 3 para obtener valores entre 1 y 100:

nivel = [(resultado_A/D – valor_mínimo) · 100] / diferencia
nivel = [(resultado_A/D – 665) · 100] / 199
nivel = (resultado -665) · 0.503

A la hora de programar el PIC introduciremos esta formula para visualizar directamente el porcentaje del nivel de batería.
Como muestra de la simulación aquí podéis ver el siguiente vídeo:
 

Componentes utilizados:

  • PIC 16f876A
  • Cristal de 4MHz
  • 2 condensadores de 22 pF (para el cristal)
  • 1 condensador de 1uF (para el divisor de tensión)
  • 1 condensador de 330 nF
  • 1 condensador de 100 nF
  • 2 resistencias de 4k7Ω (para el divisor de tensión; calcular para otros casos)
  • 1 resistencia de 1KΩ
  • 1 diodo de seguridad 1N4007
  • 1 LM7805
  • 1 pulsador para el Reset
  • Un visualizador LCD
  • 1 batería Li-Po de 7.2V

Código fuente: (en lenguaje C)

/*
Programa para visualizar el nivel de carga de una batería.
2012-2013. G2E LSB. Andoain.
*/
#include <16f876a .h="">
#fuses XT, NOWDT, NOPROTECT
#fuses NOLVP,PUT,NOWDT
#fuses NOWRT
#device ADC=10 //Conversor ADC de 10 bits de resolución
#use fast_io (A)
#use fast_io (B)
#use delay(clock=4000000)

#include //Incluye funciones del manejo del LCD

int16 resultado, nivel; //Variable para el resultado de la conversión AD
main()
{
delay_ms(50);
lcd_init(); //Inicia la pantalla LCD
setup_adc(adc_clock_div_32); //Ajusta frecuencia de muestreo del ADC

while(1)
{
setup_adc_ports(AN0); //RA0 entrada analógica
set_adc_channel(0); //Selección del canal 0 (RA0)
delay_us(10); //Temporiza 10uS
resultado=read_adc(); //Inicia la conversión y lee el resultado
nivel=(resultado-665)*0.503;
lcd_enviar(LCD_COMANDO,LCD_HOME); //Colocar el cursor
printf(lcd_putc,"%03Lu %%",nivel); //Visualiza el resultado
}
}