Battery Pack, individual cell voltage measurement

Hello,

I need to be able to monitor the individual cell voltages within a pack of 45 lithium cells. Each cell's voltage woud range between 2.5 and 4.0 VDC. I've read that I could use my Arduinio Mega to monitor voltage up to 5 VDC but that measurement depends on a connection to ground.

Obviously, to measure the voltage of one cell in the middle of the pack, I can't measure between a cell terminal and ground.

So are there any options that I can use with an arduino to measure individual cell voltage?

Ideally, I'll want monitor all 45 cells and stop charging the pack when any one of the cells hits a preset voltage.

Thanks,
Pete

Are they wired in series, 189 vdc?

Lefty

Yes, the pack is normally kept between 134 and 151 VDC. This is the traction pack on an Electric Vehicle.

I have an off-the-shelf battery management system installed but it is failing and I can't afford to replace it.

Thanks,
Pete

There are many ways involving relays, muxes etc but my preferred method would be to use 45 small processors each powered from the cell being measured and with an isolated serial link.

I stress that I haven't actually done this yet so there may be a gotcha, but I do have what I think is a workable idea I plan to build up soon.


Rob

Since I'm more of a software than hardware person, I'm unsure how to even get started with this idea. But currently have 46 wires running from each of the 45 cells, to a junction box full of terminal strips where the current Battery Managment System (BMS) is housed. I'm hoping that anything I can come up with, can be used with those existing wires because they were put in place during the build of my EV and it is not practical to run new wires at all.

The current BMS monitors individual cells and exchanges information between each of those 45 monitoring circuits and in theory, the first cell to reach 3.65 volts, should shut down the charging system. It seems to be starting to fail or feeling the effects of some other problem. So I'm hoping to use an Arduino to monitor all of the cell voltages and apply the appropriate logic to determine when a charge cycle must be terminated. I've got a LOT of money in the batteries and will do just about anything to make sure they last as long as possible. At the moment, I'm manually monitering each charge because I don't trust the BMS or the charger to cut off charging at the right time.

I'd LOVE to find something like the digital temperature sensors that I used with the Arduino. They all share the same +5 power source and they all share the same data line to the Arduino. They are individually addressed and are polled individually, ever few seconds. Based on that information, I'm switching on and off 6 solid state relays connected to heating elements in the boxes. It actually uses a product called FlexiWatt to provide the heat. That is a product used to warm reptiles in pet stores or at home.

Somehow, I don't think this is going to be easy. :astonished:

Peter

They all share the same +5 power source and they all share the same data line to the Arduino.

That would be nice, but in this case after the first cell the voltages are too high.

Somehow, I don't think this is going to be easy.

Not as easy as you would like I'm sure.

I'm hoping that anything I can come up with, can be used with those existing wires

My 45-processor idea is designed to reduce wiring and it could still use those wires, however in this case the wires are already in place so probably using relays would be better.

What you need to do is the automatic equivalent of the manual method you are currently employing. Using relays (or maybe MUXs) you "walk" two connections along the 45 batteries taking readings as you go. This means that, like your hand-held meter the Arduino has to be floating and not powered from the same source or connected to the same ground.


Rob

Let's say you need to measure within 0.08v. Then make 2 banks of 20. Put Gnd at one end and measure the total voltage of each point along the way using a simple voltage divider. 20*4v/1024 is about 0.08v. In this case you need 1k and 15k resistors x45, cheap. With a Mega there are nearly 20 analog inputs, but darn only 16.

Let's say you need to measure within 0.04v. Then make 4 banks of 12. Put Gnd at one end and measure the total voltage of each point along the way using a simple voltage divider. 12*4v/1024 is about 0.05v. In this case you need 1k and 9k resistors x45, cheap. With a Mega there are >12 analog inputs, so no switching is needed!

I'm afraid that in my case, I need to measure individual cell voltage to an accuracy of .01 volts. My goal is to keep any of the cells from exceeding 3.65 volts. I would also like to be able to adjust that cut off point downward in the future but that would be easy in the software.

I like the idea of examining each cell in turn and just keeping up that cycle of readings as the program watches for the voltage cutoff to be reached.

I suspect that I need to find a design for a small processor controlled board that is powered by the cell being monitored and can reply to a request from a central Arduino.

Of course, the communications line will also have to be isolated from the cells.

I need a circuit that can monitor a serial communciations line for a specific address, and then respond with voltage value and then go quiet until it is polled again.

I'm already out of my depth on this subject.... but that won't stop me from trying. :slight_smile:

Pete

I'd go with Graynomad's suggestion. One ATTiny or similar processor per cell, connecting to a shared bus (or several shared busses - 145 devices on one bus is probably too many) using 2 opto isolators each. Put the mcu in sleep mode when it isn't being used so that it doesn't drain the cell. You'll need to calibrate the internal voltage reference to get 0.01V accuracy - you can store the calibration data in the EEPROM.

I suspect that I need to find a design for a small processor controlled board that is powered by the cell being monitored and can reply to a request from a central Arduino.

Like this you mean?

I resurrected my old design. It uses a mega328, bit of an overkill I guess but that's the smallest AVR that has both a UART and an ADC. A tiny84 might be better using soft serial but that doesn't save many $.

This is designed to work on any cell from 2-12v, the nodes are daisy-chained so as many as you like can be placed in series with no bus loading issues. Each node can also measure the temperature. Each node is isolated from the next and only a single UART input is required on the Arduino. No addressing required.

I just changed it to 3v3 today but haven't modified the voltage divider which was set for a 5v processor. I'm also not sure about the transistor "pre-regulator", that's getting a little too far into the analogue domain for me.

I designed this a year or so back but never did anything with it, however it actually fits well with my current project (a monitoring and control network) so as long as you don't need it next week I can bring this back to life.

Just a thought.


Rob

If your goal is to maintain the battery's health, I think 0.04 is enough precision. Accuracy requires calibration. You will be lucky to get 0.04 anyway even with 0.01 precision. Do you understand my solution? No switching is needed within each bank.

Do you understand my solution?

I confess that I don't.

I can see using 45 voltage dividers but I don't get the banks, as each "bank" has to have the same 0v reference what is the difference between that and just a MUX?

I do admit that say a 45:8 (or whatever) MUX would be much cheaper, but I think you'd probably want to customise each voltage divider to get full resolution.


Rob

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?