I plan to use a relatively high-end microcontroller (Piccolo TMS320F28035, 12-bit resolution, +/- 4LSB offset, +/- 60 LSB gain) to measure voltage across stacked battery cells and control associated analog electronics to equalize their charge. The microcontroller will also store data in an eeprom memory (blackbox).

The current plan is to read up to 10 cell voltages. The problem is the large common mode voltage (each cell can go up to 3.5 V) - I cannot use isolated amplifiers such as INA124 or non-isolated high-precision INA117 due to high cost.

The current plan is to use voltage dividers (0.1%) at each tap and calculate cell voltages relatively to each other:

  1. V1 is measured directly
  2. V2 is calculated as measured V2 value less calculated V1
  3. and so forth

enter image description here

The problem with this setup is that the tenth measured voltage will suffer from high voltage-divider ratio and thus could be off by too much.

Another approach is to use a battery monitoring chip and use is as an analog front end (BQ77PL900) but the cost is quite high as well.

Are there better ways to precisely read battery cell voltages?



  • 1
    \$\begingroup\$ Correct for the "high voltage-divider ratio" in software. You mentioned you have an EEPROM, store some calibration values in it. \$\endgroup\$
    – jippie
    Mar 31 '13 at 21:07
  • \$\begingroup\$ Have you considered to use one op-amp per cell to subtract the 'common mode' voltage and possibly amplify the actual dV to make the best use of your ADC's input range in one step? Through the amplification you may even increase the accuracy of the measurement. \$\endgroup\$
    – JimmyB
    Apr 2 '13 at 21:40
  • \$\begingroup\$ @HannoBinder the dif opamps would have to have a very high MPRR ratio and voltage supply that exceeds the maximum / minimum input voltage, right? \$\endgroup\$
    – SunnyBoyNY
    Apr 2 '13 at 21:47
  • 1
    \$\begingroup\$ Sorry, but what's an "MPRR ratio"? - Yes, the supply voltage must usually cover (at least) the absolute input voltage range. You can still use voltage deviders to reduce the input voltage (and then have it amplified by the amplifier again), or you maybe you can use the battery pack's output itself as supply for the op-amps. \$\endgroup\$
    – JimmyB
    Apr 4 '13 at 7:58
  • \$\begingroup\$ @HannoBinder Sorry, I meant CMRR, not MPRR. I actually do like your suggestion - opamps with good (80dB+ CMRR) are quite common and the idea with lowering the cell voltage by a little bit using voltage dividers should work out as well. \$\endgroup\$
    – SunnyBoyNY
    Apr 4 '13 at 13:26

I was thinking about a circuit like this one to 'extract' the single cell's voltage:
(My first shot at circuitlab, please be lenient :))


simulate this circuit – Schematic created using CircuitLab

This scheme can be applied identically to every cell to be measured.

I'm not sure if this works when "self-powered" from the battery pack as sketched. You should definitely go for a rail-to-rail op-amp, which kind of excludes bi-polar devices.

Are you actually charging batteries or rather "supercapacitors"? - Maybe you can find some ideas for either case by searching for "supercap balancing", resulting for example in this paper on the topic.


Maybe it's worth mentioning that with this op-amp-based circuit you can of course scale the output value to your exact needs by varying the resistor values. For example, one might want to scale some "3V max." of the cells (= range from 0V to 3V) to an output of "5V max." (range 0V to 5V) to feed into a 5V-ADC. Or one may scale the voltage down, for example to measure "4.2V max." LiPos with a 3.3V µC/ADC.

Edit #2:

With one more op-amp per cell it's also possible to remove some constant offset voltage and increase the resolution of the measurement. If, for example, a single cell needs only be measured between 2.5V and 3V, the 2.5V constant voltage can be subtracted by the 2nd op-amp, and the resulting, limited voltage range of only 0V - 0.5V can then be scaled up to, e.g., 0V - 3.3V. With a 10-bit ADC this would yield a (theoretical) resolution of 0.5V/1024 ~ 0.5mV/LSB.

  • \$\begingroup\$ Thank you, this is exactly what I have been looking for : an inexpensive, precise, and robust solution. \$\endgroup\$
    – SunnyBoyNY
    Apr 4 '13 at 18:08

A radical approach would be to put a separate microcontroller at each battery. A uC with a 10-bit A/D costs almost nothing these days. No need for a resistor divider, simple use a reference (TL431 or similar) and have the uC measure the reference's voltage with respect to its supply voltage. The uC's can send their measurements to the central uC via optocouplers or and IR LED (one per slacve uC) + a TSOP receiver (one).

  • \$\begingroup\$ That's is indeed a radical approach - unfortunately, the capacitor voltage will swing wildly between ~ 0.5 and 3 V (it's actually an ultracap). I have seen your method used in fuel cell and other systems with reasonably small voltage swings. \$\endgroup\$
    – SunnyBoyNY
    Apr 2 '13 at 19:23
  • \$\begingroup\$ If it is 'often enough' 3V a diode + capacitor will solve the voltage swing problem. \$\endgroup\$ Apr 2 '13 at 21:04
  • \$\begingroup\$ I think I forgot to mention that the voltage swing might last minutes or even hours. \$\endgroup\$
    – SunnyBoyNY
    Apr 2 '13 at 21:46

Use an analogue multiplexer followed by a single high-precision resistor divider. The multiplexer will need to be powered from the highest point in the battery stack for it to work correctly. Control the multiplexer from IO pins on your MCU - 4x IO pins will address up to 16 multiplexed inputs - in this way you also save 9x analogue input pins. Net gain is 5 pins.

EDIT - I would recommend using an external ADC and one that is 16-bit. It can sit on the output of the precision attenuator. You can find decent ones that are much more linear than internal MCU ADCs.

I would also suggest powering the MCU at midrail on the battery stack so that a cheaper lower voltage range multiplexer can be used. This will mean that the ADC has to measure negative voltages but there are some that can do this.

  • \$\begingroup\$ I did think about this option as well but could not find a suitable part- would you have a specific part number? Please note that the maximum multiplexer voltage should be above 45 V (10 * 3.5 V + 20 % margin). \$\endgroup\$
    – SunnyBoyNY
    Mar 31 '13 at 20:41
  • \$\begingroup\$ Also, an output of such multiplexer would be the same voltage as its input. I did specifically ask about increasing ADC absolute accuracy. Analog input pin count is not the problem here. \$\endgroup\$
    – SunnyBoyNY
    Mar 31 '13 at 20:50
  • \$\begingroup\$ This one maximintegrated.com/datasheet/index.mvp/id/6127 is good for +/-100V on the inputs. It's the first I came across so i reckon there'll be more from the usual suppliers such as analog devices, Texas etc.. \$\endgroup\$
    – Andy aka
    Mar 31 '13 at 20:52
  • \$\begingroup\$ Maybe use a better ADC on the front end right after the multiplexer - 16 bits would be pretty good - there are tones of them on the market \$\endgroup\$
    – Andy aka
    Mar 31 '13 at 20:54
  • \$\begingroup\$ The analog multiplexer sells for $20+ per piece. That's way more than the entire projected board cost. 16-bit ADC would be nice, true. But those are not inexpensive either. \$\endgroup\$
    – SunnyBoyNY
    Mar 31 '13 at 20:59

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.