Quick and (very) dirty 10S cell voltage checker

Wanted to share this very rough DIY 10S voltage checker. Maybe someone more skilled than I can improve on it.

Based on the work done here: https://www.youtube.com/watch?v=gCS-p8VnSlg although be careful of his code - there was a nasty bug that took me a bit to sort out.

Can be assembled for about $15USD. Parts list on the GIT.


6 Likes

Very cool, thanks for posting!

I’m so n00b, but is this a voltage divider for each cell? Do the resistors have to be like 1% resistors?

10s – is it possible to get it higher, like 13s or more? Do you use a gpio pin for each cell?

And, can you rotate the photos? My neck hurts :slight_smile:

Yes. It can be expanded for higher Serial cell counts. The voltages are read by a analog to digital converter, the MCP3008 which is read on the Spi bus. This gave me the needed 10 inputs. Conceivably you could go up to 16S with this setup.

1 Like

Sorry for the basic questions. I’m thinking out loud, I think if I could learn enough stuff to make a tiny board to drive a display or do serial over btle, and perhaps an audible alarm, this would replace BMS for most of my applications. Check cell status at will, and balance only when required using external balancers…

MCP3008 is an 8 channel 10bit ADC, converting 0v to “0” and 3.3v to “1023”. So 2 of these will yield 16 channels. Around $2 on mouser, and available in SOIC-16 (smt).

Since lithium ion is 0-4.2v (maybe 4.35v max to be safe), must scale the voltage down.

Because of the series connections and shared ground, each cell must be measured with respect to pack ground, so 1s is 0-4.2v, 2s is 0-8.4v and so on? So each series group needs to be scaled differently, to 0-3.3v? Since resistor values are kind of all over the place, if accuracy is desired, can calibrate in software?

4.2v / 1024 = .004v resolution, just good enough, but for the 10th group, 42v/1024 = .04v resolution, which is not really that good (but maybe just barely good enough)? 13s is 54.6v/1024 = .05v.

I’m probably gonna do your build to see what’s going on. Thanks for posting this!

1 Like

Yes, you do lose a bit of resolution in the upper cells but that is par for the course. This results in a bit of jitter but overall the performance is OK. This is why you’ll see a 16 point average being used as a sort of filter. You can easily bump that up. On the MCP3008, if you use 5v as the reference you can increase the resolution to 0-5.0v on the pin. The OLED screen control is trivial in Arduino. Also, nothing stopping you from sticking a Bluetooth on the Arduino for easy transport to a companion app on your android device (or a more fruit-based phone if you are supremely motivated). Check out the .ino file on github, that’ll answer your scaling questions. BTW, I have this thing installed between the battery and the BMS as sort of a pass through device. It is a direct feed so no fear of interrupting power if the board fries itself. Be very careful with polarity. I didn’t include any reverse current protection. Might want to add diodes do that on your design. Right now I have it powered off of the first 2 cells through a 5v regulator. I’ll probably pull power off of the VESC or a UBEC down stream from my anti- spark switch. Finally, my BMS is set up as charge only.

1 Like

whats wrong with getting something like this?

I have something similar in my prebuild. just 2 wires coming out that attaches to the esc/battery.

For an “on the fly” version, just plug it into your charge port to check mid ride

That only shows the voltage of the pack as a whole not each individual p group.

1 Like

I’ve thought a lot about how to use those. The problem is, if you put them on each p-group, they’re always on. They come in 2wire or 3wire versions, with the 3wire having a different input for VCC, but the ground is still shared so you can’t tie vcc and ground to common and add a switch.