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.

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.

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.

Quote

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

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

Quote

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.

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.

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.

Formal verification of safety-critical software, software development, and electronic design and prototyping. See http://www.eschertech.com. Please do not ask for unpaid help via PM, use the forum.

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.

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.

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 voltagereally 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 separateArduino processors, powered at different points in the battery chain, and each reading6 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.