Battery Voltage to State of Charge (SOC) Calculator

JJ Ben-Joseph headshot JJ Ben-Joseph

Battery Voltage to State of Charge (SOC) Calculator worksheet with calculator inputs, formula checks, units, and source notes
Use this worksheet-style image as a reminder to check inputs, formulas, units, assumptions, and source notes before relying on the estimate.

Plain-text formula: cellVoltage = packVoltage / seriesCells; referenceVoltage = cellVoltage + tempCoefficient * (batteryTempC - 25); SOC is linearly interpolated between adjacent rested open-circuit-voltage points in the selected chemistry table, and no SOC is reported at all when the reading was taken under load or on charge.

Introduction to reading state of charge from battery voltage

State of charge (SOC) is the share of usable capacity still in a battery, where 100% is full and 0% is empty. The cheapest way to estimate it is to measure the battery's open-circuit voltage (OCV) with a multimeter and look that voltage up on a table for the chemistry you actually have.

The catch is in the word open-circuit. What a meter shows on a working battery is terminal voltage, and terminal voltage is open-circuit voltage minus whatever the internal resistance drops under the current flowing at that instant. Pull 30 A through a 12 V flooded battery with 12 milliohms of internal resistance and the terminal reading falls by about 0.36 V, which is roughly 15 points of state of charge on the Trojan deep-cycle table. Charge the same battery and the reading goes the other way: a surface charge sits on the plates and inflates the voltage until it dissipates. Neither number is a state of charge, which is why every manufacturer table on this page is labelled open-circuit or resting.

This calculator covers five reference curves: lithium-ion (NMC or cobalt, 4.20 V/cell full), LiFePO4 (about 3.40 V/cell rested full), AGM/VRLA lead-acid (2.14 V/cell full), flooded deep-cycle lead-acid (2.122 V/cell full) and flooded starter (SLI) lead-acid (2.108 V/cell full). It converts pack voltage to per-cell voltage, refers that value back to a 25 °C baseline, and interpolates the manufacturer table. It also refuses to print a percentage when you tell it the reading was taken under load or on charge, because a plausible-looking wrong number is worse than no number.

How to Use the Battery Voltage to SOC Calculator

  1. Pick a common battery preset if one matches your battery — for example a 12 V starter battery (6 flooded SLI cells) or a 12 V LiFePO4 pack (4 cells). The preset fills in the chemistry and the series cell count.
  2. Otherwise choose the battery chemistry and type the cells in series yourself. A "3S" or "4S" label on a lithium pack is the series count; a 12 V lead-acid battery has 6 cells.
  3. Enter the measured pack voltage read at the terminals with a multimeter.
  4. Tell the calculator how the reading was taken. Only a properly rested open-circuit reading produces a percentage; the under-load and on-charge options return an explanation instead of a number.
  5. Enter the battery temperature in degrees Celsius if you know it. The calculator refers the reading back to the 25 °C baseline the manufacturer tables use.
  6. Read the estimated SOC, the measured per-cell voltage and the 25 °C reference voltage. If the per-cell value is impossible for the chemistry, the series count is probably wrong — the calculator says so instead of guessing.

The Voltage-to-SOC Formula, Rest Time and Temperature Referencing

1) Terminal voltage is not open-circuit voltage

The reason a rest period matters at all is this relationship, where I is the current leaving the battery and R_int is its internal resistance:

Vterminal = Vocv I Rint

Internal resistance rises steeply in the cold, so the same 20 A load that costs a warm battery 0.15 V can cost a battery at −10 °C twice that. This is the real reason a cold battery "reads low" — it is a loaded-voltage effect, not an open-circuit effect.

2) Convert pack voltage to per-cell voltage

If the pack has N cells in series and you measured pack voltage V_pack:

Vcell = Vpack N

3) Refer the reading back to 25 degrees Celsius

Manufacturer tables are quoted at 25 °C (77 °F). Lead-acid electrolyte is denser when cold, so a cold battery genuinely reads a little higher at the same state of charge. Battery University's gravity table shows a full battery at 1.294 at 0 °C falling to 1.266 at 40 °C, and since cell OCV tracks specific gravity almost one-for-one that is about 0.0007 V per degree Celsius per cell:

V25 = Vcell + k (T25)

For lithium chemistries the equivalent coefficient is roughly 0.0001 V per degree Celsius per cell, small enough to ignore on a lithium-ion curve — but not entirely harmless on the LiFePO4 plateau, where 25 mV per cell can span 30 points of SOC.

4) Interpolate between adjacent table points

Each chemistry carries a list of reference points (V1, SOC1), (V2, SOC2) and so on. The calculator finds the pair that brackets your 25 °C reference voltage and interpolates linearly:

SOC = SOC1 + V25V1 V2V1 × (SOC2SOC1)

Readings above the top table point are reported as 100% and readings below the bottom point as 0%, but only while they stay inside a plausible window for the chemistry. Well outside that window the calculator reports no percentage and tells you to check the series count.

5) The other temperature coefficient: charger setpoints

A different and much larger coefficient shows up in every lead-acid manual, and it is often misapplied to SOC readings. It corrects the charger's bulk, absorption and float setpoints, not an open-circuit measurement:

Vset (T) = Vset (25) β (T25)

Published values of β cluster tightly: Trojan specifies 0.005 V per cell per degree Celsius on its flooded and AGM datasheets, Rolls specifies 4 mV per degree Celsius per cell for AGM and 3 mV for OPzV gel, and Victron recommends 4 mV per cell per degree Celsius for its VRLA range. So the familiar "3 to 5 mV per degree Celsius per cell" figure is real — it just belongs on the charger, roughly seven times larger than the 0.7 mV per cell figure that belongs on an SOC lookup. The calculator prints the compensated charger setpoints for lead-acid chemistries so the two are never confused again.

Reference resting-voltage tables by chemistry

The comparison table below is the scannable version of the curves built into the calculator: typical resting per-cell voltage against approximate SOC at 25 °C. Lead-acid columns come straight from manufacturer datasheets, so the rows are the ones the manufacturer published rather than a smooth 10% grid.

SOC (approx.) Li‑ion (V/cell) LiFePO4 (V/cell) AGM (V/cell) Flooded deep‑cycle (V/cell) Flooded starter/SLI (V/cell)
100%4.203.402.142.1222.108
90%4.103.3252.103
80%4.003.3052.083
75%3.963.3022.092.0732.075
70%3.923.3002.062
50%3.823.2882.042.0172.040
30%3.773.2501.969
25%3.7553.2381.991.9562.010
20%3.743.2251.943
10%3.703.0431.918
0%3.002.501.941.8931.982

Multiply a lead-acid column by six to get 12 V figures: a rested flooded deep-cycle battery is full at 12.73 V and half at 12.10 V, a rested AGM is full at 12.84 V and half at 12.24 V, and a rested starter battery is full at 12.65 V and half at 12.24 V. Multiply the LiFePO4 column by four for a 12 V pack: 13.6 V full, 13.2 V at about 70%, 13.0 V at about 30%.

Read the LiFePO4 column carefully. Between 3.275 and 3.30 V per cell the curve covers roughly 40% to 70% state of charge — a 25 mV window holding 30 points of capacity, which is well inside the error budget of an ordinary hand-held meter. That plateau is exactly why Battery University warns that "Li-phosphate has a very flat discharge profile, making voltage estimations for SoC estimation difficult", and why every LiFePO4 vendor sells a shunt-based monitor alongside the battery. The calculator shows a wide band rather than a crisp number in that region.

The lead-acid columns disagree with each other for a physical reason, not a rounding one: they use different electrolyte concentrations. The BCI starter table is built on a full-charge specific gravity of 1.265, while Trojan's deep-cycle flooded batteries ship at 1.277, and AGM construction pushes the full-charge cell higher still. Reading an AGM battery against a starter table costs you roughly 25 to 30 points of apparent state of charge, which is enough to send a perfectly healthy battery to the recycler.

Voltage reading versus other SOC estimation methods

A rested voltage reading is only one of several ways to estimate SOC. This comparison shows where it fits:

Method Equipment needed Typical accuracy Best for
Rested open-circuit voltage (this page)Multimeter±10% or so; far worse on the LiFePO4 plateauQuick field checks, storage checks, triage
Coulomb counting (current integration)Shunt or hall-effect battery monitor±1–5% if periodically re-synced at fullRV/solar banks, e-bikes, daily cycling
BMS/gauge IC estimateBuilt into the pack±1–10% depending on qualityPhones, laptops, commercial packs
Specific gravity (hydrometer)Hydrometer, access to electrolyte±5% with temperature correctionFlooded lead‑acid only

In practice the methods complement each other. A monitor that counts amp‑hours drifts and has to be re-synchronised against a known full charge, and a resting voltage spot-check is how you catch a monitor that has drifted. On a flooded battery a hydrometer beats both, because specific gravity is the quantity the voltage is standing in for.

Worked Example: a 12 V AGM Bank Read Under Load and After Rest

A 12 V AGM house battery (6 cells in series) is sitting at 10 °C and powering a 25 A inverter load. The meter shows 12.10 V.

  1. Per-cell voltage: 12.10 / 6 = 2.017 V/cell.
  2. Looked up naively on the AGM table, 2.017 V/cell sits between the 25% point (1.99 V) and the 50% point (2.04 V), giving about 38%. That is the number most people would write down — and it is wrong, because the reading was taken under load.
  3. Switch the inverter off and wait. After several hours the same battery reads 12.54 V, or 2.090 V/cell.
  4. Refer that to 25 °C: V25 = 2.090 + 0.0007 × (10 - 25) = 2.0795 V/cell.
  5. Interpolating the AGM table between 2.04 V (50%) and 2.09 V (75%) gives 50 + (2.0795 - 2.04) / 0.05 × 25 = 69.8%.

The loaded reading said 38%; the rested, temperature-referenced reading says about 70%. Try it: select the "12 V AGM / VRLA (6 cells)" preset, enter 12.54 V, leave the condition on "Rested open circuit" and set the temperature to 10 °C. Then change the condition to "Under load" and watch the percentage disappear rather than turn into a confident lie. Note also that skipping step 4 would have produced exactly 75.0% — the temperature reference is worth five points here, and more than ten points on a battery at −10 °C.

Rest & Read: practising the measurement on the bench game

Below the calculator is Rest & Read, a canvas mini-game built around this one idea. Each round hands you a pack — flooded, AGM, LiFePO4 or lithium-ion — at some temperature, usually with a load on it or with a surface charge still sitting on the plates. A live trace shows the terminal voltage while a simulated rest clock ticks. Drop the load and the trace relaxes toward open-circuit voltage on an exponential curve whose time constant depends on the chemistry: lead-acid crawls, lithium settles quickly. Toggle temperature compensation to see the reading move onto the 25 °C table. Then set the dial and call the state of charge. You are scored on accuracy against the pack's hidden true SOC, minus a small penalty for simulated minutes burned, so guessing early and waiting forever are both punished. The LiFePO4 rounds are deliberately unfair in the middle of the plateau, for the same reason the real batteries are.

Limitations and Assumptions Behind Voltage-Based SOC

Practical tips for trustworthy readings

Sources and data checks

Every number in the tables above was checked against a manufacturer datasheet or a battery-industry reference rather than a secondary chart:

What changed after the check. The flooded lead-acid curve now uses Trojan's published per-cell figures instead of a smoothed 0.02 V grid; AGM and flooded starter batteries were split out into their own curves because they genuinely rest 0.1–0.2 V apart on a 12 V battery; the LiFePO4 full-charge point moved from 3.45 to 3.40 V per cell to match a rested 13.6 V pack; and the claim that "cold conditions generally lower voltage at a given SOC" was corrected, because for an open-circuit lead-acid reading the opposite is true. The lithium-ion column was checked and left alone, since its endpoints match the Panasonic cell specification.

Battery voltage and state of charge: frequently asked questions

How do I estimate a battery's state of charge from its voltage?

Take the load and the charger off the battery, let it rest until the voltage stops moving, divide the pack voltage by the number of cells in series, refer that per-cell figure back to 25 C, and look it up on a rested open-circuit-voltage table for the exact chemistry. This page does that for lithium-ion, LiFePO4, AGM and both flooded lead-acid families.

How long does a battery have to rest before the voltage means anything?

Rolls tells owners to stand a lead-acid battery for at least four hours with every load removed, and Battery University notes that manufacturers commonly ask for 24 hours; the BCI table it reproduces was measured after a 24-hour rest. Lithium packs settle much faster, and Battle Born asks for two hours or more of no load and no charging before a resting voltage is read.

Why is the reading wrong under load or right after charging?

Terminal voltage under load is the open-circuit voltage minus the current multiplied by the internal resistance, so a heavy load drags the reading down and makes a healthy pack look flat. Charging does the reverse: it leaves a surface charge that decays over minutes to hours and makes a half-empty pack look full. Neither number is a state of charge.

Does 12.06 V mean a 12 V lead-acid battery is at 50 percent?

No, and this is one of the most repeated errors on the web. On the BCI starter-battery table reproduced by Battery University, 12.06 V is 25 percent state of charge and 50 percent is 12.24 V. On the Trojan T-1275 Plus deep-cycle datasheet, 50 percent is 12.10 V and 12.06 V lands near 38 percent. Always read the row from a table for your own battery type.

Does an AGM battery rest at a different voltage than a flooded one?

Yes. Trojan's 8D-AGM datasheet puts a full AGM cell at 2.14 V, which is 12.84 V for a 12 V battery, while its T-1275 Plus flooded deep-cycle datasheet puts a full cell at 2.122 V, or 12.73 V. Reading an AGM battery against a flooded table therefore understates its state of charge, which is why this calculator keeps the two curves separate.

How does temperature change a voltage-based SOC reading?

Cold electrolyte is denser, so a cold lead-acid battery reads slightly higher at the same state of charge, not lower. Battery University's gravity table moves from 1.294 at 0 C to 1.266 at 40 C on a full battery, which works out to roughly 0.7 mV per degree C per cell. The separate 3 to 5 mV per degree C per cell figure quoted by Trojan, Rolls and Victron is a charger setpoint correction, not an SOC correction.

How accurate is a voltage-based SOC estimate?

With a rested battery, a good meter and a known temperature, expect roughly plus or minus 10 percentage points for lithium-ion and lead-acid. On the LiFePO4 plateau the honest answer is much worse: a 25 mV per cell window can cover 30 points of state of charge, so voltage alone can only place the pack in a broad band. For tighter numbers you need coulomb counting or a battery monitor.

Picking a preset fills in the chemistry and series cell count automatically.

AGM and flooded batteries rest at noticeably different voltages, so pick the right one.

We convert pack voltage to per‑cell voltage by dividing by this value.

Under-load and on-charge readings return an explanation instead of a percentage.

Manufacturer tables are quoted at 25 °C. Leave at 25 if you do not know.

Estimated state of charge: %

Measured per‑cell voltage: V

Referred to 25 °C: V/cell

Calculator notes will appear here after you enter values.

Interactive details will appear here after you run the calculator.

Rest & Read: the battery bench mini-game

Each round puts a real pack on the bench under some load at some temperature and hides its true state of charge. Drop the load, let the trace relax toward open-circuit voltage while the rest clock runs, switch on the 25 °C temperature reference, then set the dial and call it. Accuracy earns points; wasted simulated minutes cost a few back.

Changing the scenario starts a fresh six-round run.

Round

1 / 6

Meter reading

0.00 V

Your call

50%

Run score

0

Best run

0

Focus the bench and press Space or Enter to start the run.

Keyboard: Tab to the bench, then Up and Down to choose an action chip, Left and Right to move the state-of-charge dial (hold Shift for steps of 5), and Space or Enter to perform the chosen action. Press R for a fresh run. Pointer or touch: tap a chip to perform it, and drag anywhere on the dial to set your call. The Call chip needs a second tap so a run is never ended by accident.