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="">16f876a>
#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
}
}
Hola. He intentado realizar tu proyecto y me encuentro con errores. Quizá podrías echarme una mano pues preciso de ayuda. Mi correo es albertomarinpagan@gmail.com. Gracias.
ResponderEliminarHola Albert, prefiero que me consultes tus dudas en aquí ya que si hay más personas que tengan tus dudas queda resuelta.
EliminarUn Saludo.
me sale error en la linea: lcd_enviar(LCD_COMANDO,LCD_HOME); //Colocar el cursor
ResponderEliminar