Maker Pro
Maker Pro

How can you monitor the charge of a sealed, lead acid (UPS) battery

J

Jack Snodgrass

I'm building a robot that I plan on running off of 12 volt
sealed, lead acid batteries ( UPS Batteries )

One of my 'things to do' is to figure out how to have the
robot recognize that the batteries are running low.

Is there a simple circuit ( that won't consume a lot of power
it self ) that will report the battery charge level via a
couple of I/O pins or RS-232 signals?

Thanks - jack
 
G

Gordon McComb

The voltage of most batteries goes down as the battery is discharged. A
simple battery monitoring circuit merely samples that voltage.

One older method is to use a bargraph IC. These ive you output pins that
can indicate voltage within a fairly narrow range. The IC is intended to
connect to LEDs, which you can use for visual feedback. Pick one or two
pins to connect to your microcontroller as "getting low" and "really
low." Look on Google for some circuit ideas.

If you are connecting to an MCU with an ADC, you can connect a resistor
across the battery and load (a fairly high value to limit drain). Use
Ohm's Law to calculate the voltage.

Maxim and others make battery monitor ICs you might try out. Many of
these companies will send free samples. Some of these have 1- and 2-wire
serial interfaces. They're made for polymeer and rechargeable lithium
cells, and are probably more sophisticated than you need for lead acid,
though.

A somewhat crude but workable method is to use a zener diode, which
"folds back" if the voltage drops below a certain level (essentially,
outputting a HIGH or LOW depending on battery level). You select the
zener based on the minimum voltage desired from the battery, and the
characteristics of the zener. Google should have circuit examples.

RS-232 wouldn't be as easy, but it could be done with a PIC or AVR using
just the analog comparator inputs. Some PICs and AVRs have serial
UARTs, but you may need a MAX232 chip or equivalent if you need real
RS-232 signals.

-- Gordon
Author: Constructing Robot Bases,
Robot Builder's Sourcebook, Robot Builder's Bonanza
 
J

John Fields

I'm building a robot that I plan on running off of 12 volt
sealed, lead acid batteries ( UPS Batteries )

One of my 'things to do' is to figure out how to have the
robot recognize that the batteries are running low.

Is there a simple circuit ( that won't consume a lot of power
it self ) that will report the battery charge level via a
couple of I/O pins or RS-232 signals?

---
A 12 lead-acid battery is usually considered discharged when its
terminal voltage falls to 10V, so this will give you a low-going output
when that happens, and you'll only need a single polled µC I/O to read
it:

VBAT VBAT
| |
[51K] [10K]
| |
| +---[1M]---+
| | |
VBAT>---[10K]--+-------------+----|+\ |
| | | >--+--->LOBAT-
[10K] +--------| /
| | 1/2 LM393
| [LM4040-5.0]
| |
GND>-----------+---------+---------+
| |
+---|+\ |
| | >--+
+---| /
1/2 LM393

With the battery charged to 14V, the worst case total current draw will
be:

Input divider: 700µA
Reference: 176µA
Feedback R: 7µA
Pullup R: 0µA
LM393: 2500µA
--------
Total 3383µA ~ 3.4mA



With the battery at 10V,

Input divider: 500µA
Reference: 98µA
Feedfack R: 5µA
Pullup R: 1000µA
LM393: 2500µA
--------
Total 4103µA ~ 4.1mA



With two I/O's you can get a little warning before you got to 10V, and
then another hit when you got there you could use the spare comparator
and do this:




VBAT VBAT
| |
[51K] [10K]
| |
| +---[1M]---+
| | |
VBAT>--+--[10K]--+-------------+----|+\ |
| | | | >--+---> E1
| [10K] +--------| /U1A
| | | 1/2 LM393
| GND |
| |
| | VBAT
| | |
| | [10k]
| | |
| | +---[1M]---+
| | | |
+--[10K]--+-------------+----|+\ |
| | | >--+---> E2
[R2] +--------| /U1B
| | 1/2 LM393
GND |
|
[LM4040-5.0]
|
GND

With VBAT = 10V, the voltage on U1A+ will be +5V, and as soon as it
drops below that (since U1A is tied to the +5V reference) E1 will go
low, signalling that the battery is discharged.

Before that, the voltage at E2 will have gone low at the battery voltage
determined by when U1B+ fell to less than 5V, and that battery voltage
can be determined by setting up the voltage divider R1R2 so that when
VBAT is at the desired trip voltage the voltage at U1B+ will be +5.0V

Looking at the voltage divider like this:


VBAT E1
| |
[10K] [R1]
| |
+---5.0V = +---E2
| |
[R2] [R2]
| |
GND 0V


The relationship between the voltages and resistances can be stated by:


E2 = (E1R2)/(R1+R2)

So, since we know everything but the value of R2, we can rearrange to
solve for R2 like this:


R2 = (E2R1)/(E1-E2)

then plug in everything and solve for R2 with VBAT equal to whatever we
want it to be, say 11.0V for this example:


R2 = (5.0V*10KR)/(11.0V-5.0V) = 50000/6 = 8333 ohms

8333 ohms is an oddball value, being bracketed by 8200 ohms on one side
and 9100 on the other with 5% resistors and 8060 and 8250 ohms with
1%'ers.

If we look at the 1% band bounding the closest available 1%'er,8250
ohms, we'll get 8167.5 ohms for the low end and 8282 ohms for the high
end, so that means with a perfect 10K ohm for R1, a perfect reference, a
perfect comparator, and neglecting the effect of the hysteresis resistor
we'll get somewhere between

E1 = E2(R1+R2)/R2 = 5.0V*(10000R+8167.5R)/8167.5R ~ 11.122V

with R2 at its low resistance end, which is 11.0V + 1.11% and

E1 = E2(R1+R2)/R2 = 5.0V*(10000R+8282R)/8282R ~ 11.037V

at its high resistance end, which is 11.0V - 0.336%

Not too shabby...


The current drawn will be about a milliamp and a half more than the
single comparator with both comparator outputs low, but still not too
shabby!-)
 
J

Jack Snodgrass

I'm building a robot that I plan on running off of 12 volt
sealed, lead acid batteries ( UPS Batteries )

One of my 'things to do' is to figure out how to have the
robot recognize that the batteries are running low.

Is there a simple circuit ( that won't consume a lot of power
it self ) that will report the battery charge level via a
couple of I/O pins or RS-232 signals?

---
A 12 lead-acid battery is usually considered discharged when its
terminal voltage falls to 10V, so this will give you a low-going output
when that happens, and you'll only need a single polled µC I/O to read
it:

VBAT VBAT
| |
[51K] [10K]
| |
| +---[1M]---+
| | |
VBAT>---[10K]--+-------------+----|+\ |
| | | >--+--->LOBAT-
[10K] +--------| /
| | 1/2 LM393
| [LM4040-5.0]
| |
GND>-----------+---------+---------+
| |
+---|+\ |
| | >--+
+---| /
1/2 LM393

With the battery charged to 14V, the worst case total current draw will
be:

Input divider: 700µA
Reference: 176µA
Feedback R: 7µA
Pullup R: 0µA
LM393: 2500µA
--------
Total 3383µA ~ 3.4mA



With the battery at 10V,

Input divider: 500µA
Reference: 98µA
Feedfack R: 5µA
Pullup R: 1000µA
LM393: 2500µA
--------
Total 4103µA ~ 4.1mA



With two I/O's you can get a little warning before you got to 10V, and
then another hit when you got there you could use the spare comparator
and do this:




VBAT VBAT
| |
[51K] [10K]
| |
| +---[1M]---+
| | |
VBAT>--+--[10K]--+-------------+----|+\ |
| | | | >--+---> E1
| [10K] +--------| /U1A
| | | 1/2 LM393
| GND |
| |
| | VBAT
| | |
| | [10k]
| | |
| | +---[1M]---+
| | | |
+--[10K]--+-------------+----|+\ |
| | | >--+---> E2
[R2] +--------| /U1B
| | 1/2 LM393
GND |
|
[LM4040-5.0]
|
GND

With VBAT = 10V, the voltage on U1A+ will be +5V, and as soon as it
drops below that (since U1A is tied to the +5V reference) E1 will go
low, signalling that the battery is discharged.

Before that, the voltage at E2 will have gone low at the battery voltage
determined by when U1B+ fell to less than 5V, and that battery voltage
can be determined by setting up the voltage divider R1R2 so that when
VBAT is at the desired trip voltage the voltage at U1B+ will be +5.0V

Looking at the voltage divider like this:


VBAT E1
| |
[10K] [R1]
| |
+---5.0V = +---E2
| |
[R2] [R2]
| |
GND 0V


The relationship between the voltages and resistances can be stated by:


E2 = (E1R2)/(R1+R2)

So, since we know everything but the value of R2, we can rearrange to
solve for R2 like this:


R2 = (E2R1)/(E1-E2)

then plug in everything and solve for R2 with VBAT equal to whatever we
want it to be, say 11.0V for this example:


R2 = (5.0V*10KR)/(11.0V-5.0V) = 50000/6 = 8333 ohms

8333 ohms is an oddball value, being bracketed by 8200 ohms on one side
and 9100 on the other with 5% resistors and 8060 and 8250 ohms with
1%'ers.

If we look at the 1% band bounding the closest available 1%'er,8250
ohms, we'll get 8167.5 ohms for the low end and 8282 ohms for the high
end, so that means with a perfect 10K ohm for R1, a perfect reference, a
perfect comparator, and neglecting the effect of the hysteresis resistor
we'll get somewhere between

E1 = E2(R1+R2)/R2 = 5.0V*(10000R+8167.5R)/8167.5R ~ 11.122V

with R2 at its low resistance end, which is 11.0V + 1.11% and

E1 = E2(R1+R2)/R2 = 5.0V*(10000R+8282R)/8282R ~ 11.037V

at its high resistance end, which is 11.0V - 0.336%

Not too shabby...


The current drawn will be about a milliamp and a half more than the
single comparator with both comparator outputs low, but still not too
shabby!-)


Thanks for the info.

jack
 
J

John Fields

I'm building a robot that I plan on running off of 12 volt
sealed, lead acid batteries ( UPS Batteries )

One of my 'things to do' is to figure out how to have the
robot recognize that the batteries are running low.

Is there a simple circuit ( that won't consume a lot of power
it self ) that will report the battery charge level via a
couple of I/O pins or RS-232 signals?

---
A 12 lead-acid battery is usually considered discharged when its
terminal voltage falls to 10V, so this will give you a low-going output
when that happens, and you'll only need a single polled µC I/O to read
it:

VBAT VBAT
| |
[51K] [10K]
| |
| +---[1M]---+
| | |
VBAT>---[10K]--+-------------+----|+\ |
| | | >--+--->LOBAT-
[10K] +--------| /
| | 1/2 LM393
| [LM4040-5.0]
| |
GND>-----------+---------+---------+
| |
+---|+\ |
| | >--+
+---| /
1/2 LM393

With the battery charged to 14V, the worst case total current draw will
be:

Input divider: 700µA
Reference: 176µA
Feedback R: 7µA
Pullup R: 0µA
LM393: 2500µA
--------
Total 3383µA ~ 3.4mA



With the battery at 10V,

Input divider: 500µA
Reference: 98µA
Feedfack R: 5µA
Pullup R: 1000µA
LM393: 2500µA
--------
Total 4103µA ~ 4.1mA



With two I/O's you can get a little warning before you got to 10V, and
then another hit when you got there you could use the spare comparator
and do this:




VBAT VBAT
| |
[51K] [10K]
| |
| +---[1M]---+
| | |
VBAT>--+--[10K]--+-------------+----|+\ |
| | | | >--+---> E1
| [10K] +--------| /U1A
| | | 1/2 LM393
| GND |
| |
| | VBAT
| | |
| | [10k]
| | |
| | +---[1M]---+
| | | |
+--[10K]--+-------------+----|+\ |
| | | >--+---> E2
[R2] +--------| /U1B
| | 1/2 LM393
GND |
|
[LM4040-5.0]
|
GND

With VBAT = 10V, the voltage on U1A+ will be +5V, and as soon as it
drops below that (since U1A is tied to the +5V reference) E1 will go
low, signalling that the battery is discharged.

Before that, the voltage at E2 will have gone low at the battery voltage
determined by when U1B+ fell to less than 5V, and that battery voltage
can be determined by setting up the voltage divider R1R2 so that when
VBAT is at the desired trip voltage the voltage at U1B+ will be +5.0V

Looking at the voltage divider like this:


VBAT E1
| |
[10K] [R1]
| |
+---5.0V = +---E2
| |
[R2] [R2]
| |
GND 0V


The relationship between the voltages and resistances can be stated by:


E2 = (E1R2)/(R1+R2)

So, since we know everything but the value of R2, we can rearrange to
solve for R2 like this:


R2 = (E2R1)/(E1-E2)

then plug in everything and solve for R2 with VBAT equal to whatever we
want it to be, say 11.0V for this example:


R2 = (5.0V*10KR)/(11.0V-5.0V) = 50000/6 = 8333 ohms

8333 ohms is an oddball value, being bracketed by 8200 ohms on one side
and 9100 on the other with 5% resistors and 8060 and 8250 ohms with
1%'ers.

If we look at the 1% band bounding the closest available 1%'er,8250
ohms, we'll get 8167.5 ohms for the low end and 8282 ohms for the high
end, so that means with a perfect 10K ohm for R1, a perfect reference, a
perfect comparator, and neglecting the effect of the hysteresis resistor
we'll get somewhere between

E1 = E2(R1+R2)/R2 = 5.0V*(10000R+8167.5R)/8167.5R ~ 11.122V

with R2 at its low resistance end, which is 11.0V + 1.11% and

E1 = E2(R1+R2)/R2 = 5.0V*(10000R+8282R)/8282R ~ 11.037V

at its high resistance end, which is 11.0V - 0.336%

Not too shabby...


The current drawn will be about a milliamp and a half more than the
single comparator with both comparator outputs low, but still not too
shabby!-)


Thanks for the info.

---
You're welcome. Unfortunately, there's an error, since 8333 ohms is
bracketed by 8250 ohms on the low end and 8450 ohms on the high end.

Serendipitously, it turns out that 8250 is the better choice between
the two, so all the numbers come out right!
 
Top