I am making an Arduino based safety system for 18650 based packs, other people may find this project useful.
The system will measure the voltage of each cell string in a 16S li-ion 18650 pack. The system will be between the receiver and motor controller the battery is powering. If any cell drops below a set voltage (~3v) the system will interrupt the commanded throttle value being sent to the esc from the receiver and reduce power until the battery hits the cutoff limit (~2.8v), where the motor is commanded to stop.
WHY? The reason I am proposing this system instead of an off the shelf battery management system is because of cost and space savings.
My battery will providing more current than any affordable BMS can handle, additionally, BMS's that can handle currents of 400A are large in size, and increase the size of the battery case significantly. My plan is to use a smaller size, low current BMS to manage charging of the battery. Then this Arduino voltage system will be the safety system for battery discharge, the BMS will be completely bypassed for battery discharge.
What voltage sensor is available that would suit these requirements? I'd rather stay clear of custom designed circuits if possible.
It won't be possible to do this without some circuitry so I'm not sure what you mean by avoiding "custom designed circuits". Maybe if you explain more we can provide a better answer. But here's 2 potential solutions to throw into the mix:
To keep the bill of materials cheap while still using Arduino, you could go with an 8 pin ATtiny85 microcontroller and pair it with a 74HC4067 16-channel multiplexer. You'd connect the 16 batteries to each of the 74HC4067's channels and use 4 of the ATtiny85's pins to select which one of the channels to measure, and then read the voltage with the ATtiny85's ADC on the 5th pin. You could use the 5V output from the receiver to power the ATtiny and 74HC4067. In order to signal the ESC to cut motor power you'd need a 6th pin though and doing that with the ATtiny's RESET pin is possible, but it's not as straightforward as using a microcontroller with more pins. So to make it easier while sticking with a cheap ATtiny board, you could use the 14 pin ATtiny84 instead. Obviously you could also use the Arduino Uno's ATmega328 as well, it's just more costly.
Another more expensive option would be to use an ATmega2560. It has 16 pins that can read analog voltages so would bypass the need for the 74HC4067, so each of the 16 batteries could be directly measured with this microcontroller.
Welcome! Sorry I cannot answer your question, you give us almost no information. You state: "The system will measure the voltage of each cell string in a 16S li-ion 18650 pack" Define the pack is it 16 cells in series or some other configuration? You are going to supply in excess of or not to exceed 400A, at what voltage? Post a "Schematic", not a frizzy picture of what you propose and links to technical information on all the hardware items. At what temperature range is this going to operate at. What is the source of power for charging? These are questions to help us get started.
@waterjet1 I had another thought on an issue with signalling the ESC, the ATtiny85 won't work because you'll need to read the signal being sent by the receiver to the ESC and then output a new signal, so there's not enough pins. You'll need that 14 pin ATtiny84 for example. I know you just asked about a voltage sensor but wanted to correct my oversight.
@gilshultz I'm familiar with the application so can answer some of your questions. I'm really interested to see if you will have something significant to contribute since I'm not incredibly familiar with voltage sensors (OP's question) and maybe you are, so here goes:
Q: Define the pack is it 16 cells in series or some other configuration?
A: 16 cells in series (16S is short for this configuration).
Q: You are going to supply in excess of or not to exceed 400A, at what voltage?
A: The safety system will not supply any amperage to any device, it will simply monitor the voltage of each cell individually and when one cell goes below 3V, the safety system will intercept the signal being sent to the ESC (short for electronic speed controller) that is drawing the high amperage from the battery and signal it to reduce the power draw until one of the cells goes below 2.8V at which point it will entirely stop the receiver from being able to signal the ESC to allow a power draw.
Q: At what temperature range is this going to operate at?
A: We should assume normal Li-Ion discharge temperatures, so 10-55C, but do you have something meaningful to contribute about measuring battery voltages outside of a typical Li-Ion battery operating range?
Q: What is the source of power for charging?
A: This is not applicable, OP indicated a separate BMS (battery management system) will be used for charging and "will be completely bypassed for battery discharge".
Q: Post a "Schematic", not a frizzy picture of what you propose and links to technical information on all the hardware items.
A: OP is asking for help selecting a voltage sensor for measuring 16 Li-Ion battery cells individually. If they asked for detail on how to control the ESC we'd definitely need more information, but from what they said we have enough information to at least give OP some useful information to select a voltage sensor that can be used with a typical Arduino don't you think? Not trying to be mean or anything, I just don't see why a schematic is needed at this point in the project though I can definitely understand why it might be confusing to someone who is not familiar with Li-Ion batteries and receivers and ESC's and BMS's and such.
I want to avoid custom PCB design for this device. I'd rather be able to assemble the hardware by hand and without too much time invested.
@dparson thanks for the solutions. For me I would probably choose the Arduino Mega2560 to measure the voltages for simplicity.
However...
I had an idea this morning to achieve my goal:
Since the BMS is just an on/off switch, that is turned on when the battery is safe to operate, and off otherwise. I could simply connect an Arduino to the BMS output, when it reads 0v, the throttle signal can be terminated to 0 and electrical load removed from the battery... When the battery is safe to operate the BMS output voltage will be simply displaying battery voltage.
I would now need to measure a voltage from 0-70v (16S li-ion is 67.2v full), and when the voltage drops to 0 (BMS switches off) the throttle must be cut. A benefit of this solution is that the Arduino can also switch off the motor if the battery gets too hot, as the BMS also monitors temperature. This new solution will be easier for me as I don't have much experience with Arduino coding.
To measure that single voltage you can just use the ADC of the Arduino, you'll just need a voltage divider circuit and here's a tutorial along with Arduino code to introduce the concept:
You need a voltage divider because the ADC of the Arduino can only measure voltages lower than the voltage running the Arduino itself, so no more than the 5V coming from the ESC. One complication that the article doesn't address though is the Arduino's ADC won't give you a good measurement when the input impedance (described in the article) is more than about 10 kiloohms, and when measuring such a large voltage you'll want to use resistors that result in a high impedance to reduce the amount of current flowing through the voltage divider circuit (you don't want to exceed the rated wattage of the resistors). The work-around is to add a 0.1uF capacitor between the Arduino pin and GND. This capacitor will charge up to the voltage created by the voltage divider and allow the ADC to take a good measurement.
This is a voltage divider calculator to help pick the resistors to use. For an example, put in the absolute max voltage the battery will be charged to and round up, e.g. 70, leave R1 empty and select megaohms, enter 1 megaohm for R2, and enter 4.5 for the output voltage (a safe number below the 5V from the ESC). Then hit calculate and you'll see the value for R1 should be about 15 megaohms. Resistor values have various accuracies and the 5V being provided to the Arduino from the ESC won't be perfectly accurate as well, so you want to give your resistors and output voltage some wiggle room as to not exceed the 5V the ESC is providing to the Arduino.