Battery Pack, individual cell voltage measurement

Offhand, I was wondering what was the original electric vehicle?

I've been thinking about this problem overnight. Measuring to 0.01 volt accuracy seems
a little unrealistic, but to mainly gauge health, that's probably overkill, as SB33 says.
I'm not sure about Li cells, but when a NiMH cell in a series pack goes bad, it's voltage
really goes haywire, compared to the other cells. Individual cell voltages can actually
"reverse" in polarity during the charging process.

I thought about the 45 voltage divider idea, but for the highest level cells, you would be
dividing down by 151:5, and this would give a very poor resolution with a 10-bit A/D.

However, I think you might get by with the banking idea, of using 45/6 => 8 separate
Arduino processors, powered at different points in the battery chain, and each reading
6 A/D channels, and with output signals optoisolated going to a central processor. Each
bank only needs to read over the range of 8*3.3V, or 18.9V. This way you should have
18.9V/1024, or 0.018V resolution.

The main processor could sample some thermistors to monitor a few cell temperatures
too.

Could you not use an op-amp that has a very high common mode voltage rejection rating? Check out the linked pdf doc. You could either have an op-amp dedicated to each of the cells or do front-end switching such that only one cells voltage at a time is routed to a single op-amp input. Check out this article to see if that might not be a very good method for measuring each cells individual terminal voltage.

Lefty

op-amp that has a very high common mode voltage rejection rating

I thought about something like that, but it requires much more circuitry [45 opAmps,
plus etc] than the other approaches. But would be very good for a few sample points
only.

oric_dan(333):

op-amp that has a very high common mode voltage rejection rating

I thought about something like that, but it requires much more circuitry [45 opAmps,
plus etc] than the other approaches. But would be very good for a few sample points
only.

Or just one with a 2 pole 45 throw switch ahead of the opamp. This could just be 45 DPST relays that you select one at a time to route the selected cells terminals to the single opamp.

Lefty

45 DPST relays

On the other thread you mentioned old style CMOS chips. There was also a time
between vacuum tubes and transistors that they used relays for computer logic gates.
I imagine your 45 relay design would sound something like one of those computers,
:-). The reptiles might go crazy, LOL.

Check out the linked pdf doc.

Wow, +-250V CMRR. That's impressive.

separate Arduino processors, powered at different points in the battery chain, and each reading 6 A/D channels,

I also was thinking about this overnight. I thought that my above design could be modified to handle either 6 batteries (although 6x15v is getting too high for good resolution) or maybe "12 volts" where that is made up of various combinations, 6x2v, 3x4v, 2x6v or 1x12v.

You would then hang boards at various location on the battery string as required. In the case of this thread's application that would mean 3 batteries per board or 15 boards, maybe as few as 8 if you up the range per board.

Another option it to incorporate a special monitor chip like the 12-channel MAX11068, they can only handle 5v per cell which is no good for me but would work here. Also there's the LTC6802.


Rob

The off the shelf battery management system that is failing, is it a balancer type system or just a battery monitor.
A balancer type does more than just measure individual cell voltage.

Or just one with a 2 pole 45 throw switch ahead of the opamp.

Can you get those at Radio Shack?

A balancer type does more than just measure individual cell voltage.

Good point mauried.

@phoyt
How much to these gadgets cost?


Rob

That's what I'm talking about @oric_dan. You only need 4 banks, and 4 Megas for 0.04v resolution.
45x2 tiny resistors. No other hardware.

relays for computer logic gates.

We did an entire runway lighting control system with relays once, 1000s of them in 19" racks, all plug-in modules with NAND, AND, OR, flip flop etc functions and all at 48 volts.

It was destined for an Asian country (Malaysia I think) and the design brief was that it had to be simple technology that the "natives" could fix.

and 4 Megas

You didn't mention 4 megas originally which partly explains why I didn't get it but you still have to isolate the megas from each other. This means powering each mega off it's bank, then having an isolated comms link. Is that what you have in mind?


Rob

You got it Rob!

I'm not the fastest horse in the race, but I get there eventually :slight_smile:

I've modified my design to allow monitoring of 6 batteries and 2 temperatures. If phoyt or anyone is interested I'll post the new design. This is very similar to what you're proposing but without the extra crap that comes with a Mega and that isn't needed. However with mine you still need a single Arduino (just a small one will do) to talk to a PC, display the results etc.


Rob

We did an entire runway lighting control system with relays once, 1000s of them in 19" racks, all plug-in modules with NAND, AND, OR, flip flop etc functions and all at 48 volts.

It was destined for an Asian country (Malaysia I think) and the design brief was that it had to be simple technology that the "natives" could fix.

And the byline to this is that they could hear it in Indonesia.
[check your map if you don't know geography].

Would it be possible to use zener diodes to drop the voltages down into the range that the Arduino can measure?

Nope, leastways I can't think of a way to use zeners.

If you just want to drop the voltage down the easiest way is to use 45 voltage dividers, all set to provide the best range possible for the voltage at that point in the battery string.

Truth is that's probably the simplest method but it's not scalable, picking all the resister would be a pain and this approach needs 46 wires. Also it means some very high voltages are on your PCB, something I would not be happy with.


Rob

With my idea, there is no reason to use different values for each resistor. Only 2 values are needed. Sure with different values you could get more precision with the first few cells, but the one at the end would only get 0.04v precision. So why not just use the same resistors for all, giving them all the same precision instead of increasing the precision of the first cell to 5/1024v. Maybe I haven't explained it properly. It seems like Rob and Dan got it.

Peter is on to something. If you use Zeners to drop the 30-40v wires toward the end in my plan down to 10v, you would get more precision, if you needed it. Everything would have to be calibrated manually in software with a DMM. With this method, and 45 inputs, you could possible do it with only 1 Mega?

Graynomad:
Nope, leastways I can't think of a way to use zeners.

If you just want to drop the voltage down the easiest way is to use 45 voltage dividers, all set to provide the best range possible for the voltage at that point in the battery string.

The voltage divider approach obviously loses resolution the further you need to drop the voltage - I don't know what resolution is needed here, but there must come a point where the voltage is so high that it isn't possible to achieve enough resolution.

I was thinking with the zener something like connecting each battery junction to a zener and then through a voltage divider to ground, the idea being that the zener would drop the voltage by a known constant amount to bring the voltage down to a range that can be measured, with no loss of resolution.

By the time you have several cells in series all with varying voltages the range of values that needs to be measured could easily exceed 5V hence the voltage dividers to reduce the range - still some loss of resolution due to the voltage dividers used for that, but nothing like as much as there would have been if dividers were used to drop the full voltage down to 5V.

Works for me! This is the easiest solution for hardware. Calibrating it using a DMM in the code will take some time and effort.