I want to measure the Open Circuit Voltage of an electrochemical battery. When I measure this voltage using a multimeter, I get the measure correctly (around 1.12 V and without noise).

However, when I use an Arduino Mega with an Adafruit ADC1115, I get different readings (around 1 V, but with noise, because the reading changes in time in the range of centivolts and also sometimes in decivolts).

I would like to get the same reading as with the multimeter. What do I need to do? Maybe use a filter?

I think that the ADC is working fine, because if I measure a 1.5V AA battery, the measurement matches the one of the multimeter.

The electrochemical battery is continuously doing a series of charge/discharge cycles, so the voltage increases/decreases slowly in one direction per series (centivolts per second).

  • \$\begingroup\$ To average this change with a low ESR Cap, we need to know your tolerance for change dV over time and the battery ESR resistance with any current measurements you might have then C=V/R(=Ic) * dt/dV \$\endgroup\$ Jan 29, 2022 at 12:52
  • \$\begingroup\$ What is the output impedance of your cell? If it is high then you may need a buffer between the cell and the ADC. \$\endgroup\$ Jan 29, 2022 at 13:09
  • \$\begingroup\$ You say your readings vary by centivolts and then you say that the battery is also changing by centivolts/sec. So what is your problem? \$\endgroup\$
    – Barry
    Jan 29, 2022 at 13:14
  • \$\begingroup\$ Are there bubbles forming in a wet electrolyte? If so ... possibly related electronics.stackexchange.com/questions/531190/… \$\endgroup\$ Jan 29, 2022 at 14:11
  • \$\begingroup\$ @bardulia if you are doing serious research on AL ION, ask a more pertinent question for all uncertain goals. \$\endgroup\$ Jan 29, 2022 at 14:43

1 Answer 1



simulate this circuit – Schematic created using CircuitLab

If the dV/dt is small, meaning dt >> dV and dV is ~ 1% then adding bulk very low ESR capacitors will filter only some of this instant change.

Otherwise, a compromise between digital filtering and expectations for decay time and standard-deviation comes from knowing why it changes.

This simple model is not enough as there are more than one RC equivalent circuit in every battery cell, the obvious parallel plates and the double-electric charge layers. But let's use it anyways.

\$V_{bat}= V_{C1} - I_{bat}*R_1\$

So there will be burst drops in decivolts due to I*R1 and gradual drops in mV due to C1 being discharged.

While batteries have ESR*C time constants in the order of seconds to minutes, low ESR e-caps have time constants on the order of 10 us ,so filtering above is only useful for preventing aliasing sampling errors in the step voltage changes due to burst loads.

The time constants are also extended greatly by increasing the resistance of the load ( reduce load current) relative to the source. This is almost the definition of Load Regulation Error. which is merely the ratio of source ESR to load R % or the measured Vdrop in % for rated current.


1. Define the stability limits you want. i.e. tolerance spec

  1. Average your ADC results with fast enough resolution using statistics
  2. fast enough or slow down the step voltage from slew rate with a bulk cap R1(ESR)*C3 = T3 Let T3 > 5x sampling interval Ts to reduce aliasing error.
  3. Verify it meets spec (1.) (adjust if necessary)
  4. Decide if your battery ESR*C meets your TBD overall Load Regulation specs over time. Bigger is better and also some chemistries (Li Ion) are better than others like Al Ion.

6. Come up with better specs and test methods with DoE methods using Test Engineer's skills.

I've had these skills for many decades.

  • \$\begingroup\$ Thank you! I will check this and come back to you once I have some results. \$\endgroup\$
    – bardulia
    Jan 29, 2022 at 18:33

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

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