Battery Voltage to State of Charge (SOC) Calculator
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
- 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.
- 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.
- Enter the measured pack voltage read at the terminals with a multimeter.
- 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.
- 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.
- 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:
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:
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:
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:
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:
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.20 | 3.40 | 2.14 | 2.122 | 2.108 |
| 90% | 4.10 | 3.325 | — | 2.103 | — |
| 80% | 4.00 | 3.305 | — | 2.083 | — |
| 75% | 3.96 | 3.302 | 2.09 | 2.073 | 2.075 |
| 70% | 3.92 | 3.300 | — | 2.062 | — |
| 50% | 3.82 | 3.288 | 2.04 | 2.017 | 2.040 |
| 30% | 3.77 | 3.250 | — | 1.969 | — |
| 25% | 3.755 | 3.238 | 1.99 | 1.956 | 2.010 |
| 20% | 3.74 | 3.225 | — | 1.943 | — |
| 10% | 3.70 | 3.043 | — | 1.918 | — |
| 0% | 3.00 | 2.50 | 1.94 | 1.893 | 1.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 plateau | Quick field checks, storage checks, triage |
| Coulomb counting (current integration) | Shunt or hall-effect battery monitor | ±1–5% if periodically re-synced at full | RV/solar banks, e-bikes, daily cycling |
| BMS/gauge IC estimate | Built into the pack | ±1–10% depending on quality | Phones, laptops, commercial packs |
| Specific gravity (hydrometer) | Hydrometer, access to electrolyte | ±5% with temperature correction | Flooded 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.
- Per-cell voltage:
12.10 / 6 = 2.017 V/cell. - 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.
- Switch the inverter off and wait. After several hours the same battery reads 12.54 V, or 2.090 V/cell.
- Refer that to 25 °C:
V25 = 2.090 + 0.0007 × (10 - 25) = 2.0795 V/cell. - 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
- Open-circuit only: the whole method assumes near-zero current. Under load or on charge the calculator declines to produce a percentage rather than produce a wrong one.
- Rest time is chemistry-dependent: Rolls asks for at least four hours on lead-acid and Battery University notes manufacturers often ask for 24; Battle Born asks for two hours or more on LiFePO4. Shorter rests bias the result high after charging and low after discharging.
- Temperature moves two different things: the open-circuit reading shifts by only about 0.7 mV per cell per degree Celsius, but usable capacity falls sharply in the cold and internal resistance climbs. A cold pack at a genuine 80% SOC may still be unable to deliver its rated current.
- Aging and internal resistance: as cells age the relationship between OCV and remaining usable capacity drifts, and rising resistance makes any under-load reading worse.
- Cell imbalance: a pack can look fine on total voltage while one cell is flat. Pack voltage is not a substitute for cell-level monitoring, especially on lithium.
- The LiFePO4 plateau: mid-range SOC simply is not recoverable from voltage at multimeter precision. Treat any mid-range LiFePO4 figure as a band.
- Generalised curves: these are published curves for representative products, not for your serial number. High-voltage NMC, LTO and lithium-titanate variants use entirely different curves, and a battery's own datasheet always wins.
- Assumptions in the arithmetic: the interpolation is piecewise linear between published points, cells are assumed identical and in series, and the 0% row for the flooded deep-cycle column is extrapolated one step below Trojan's published 10% row.
Practical tips for trustworthy readings
- Measure at the terminals themselves. Long thin leads and corroded clamps add their own drop, which is the same error as measuring under load.
- If you need real accuracy, combine methods: rested voltage, plus current integration, plus an occasional capacity test.
- On multi-cell lithium packs, read individual cell voltages or the BMS output to catch imbalance.
- For storage, aim mid-range on lithium — about 3.7–3.8 V/cell for lithium-ion and 3.2–3.3 V/cell for LiFePO4 — while lead-acid should be stored full and topped up, since sitting partly discharged is what sulfates plates.
- Write the temperature down with the voltage. A reading without a temperature is only half a measurement.
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:
- Flooded deep-cycle lead-acid curve and charger compensation: Trojan T-1275 Plus data sheet — "State of charge measure of open-circuit voltage" table (2.122 V/cell at 100% through 1.918 V/cell at 10%, specific gravity 1.277 full) and "add or subtract 0.005 volt per cell for every 1 °C" charging compensation. The sheet states it is designed in compliance with applicable BCI standards.
- AGM/VRLA curve: Trojan 8D-AGM data sheet — 2.14 / 2.09 / 2.04 / 1.99 / 1.94 V per cell at 100 / 75 / 50 / 25 / 0%.
- Flooded starter (SLI) curve and the 24-hour rest: Battery University BU-903, which reproduces the BCI starter-battery table (12.65 / 12.45 / 12.24 / 12.06 / 11.89 V at 100 / 75 / 50 / 25 / 0%, specific gravity 1.265 full, measured at 26 °C after a 24-hour rest) and the gravity-versus-temperature table used for the 0.0007 V per cell per degree Celsius reference coefficient.
- Rest time and lead-acid gravity bands: Rolls Battery, "Voltage readings and state of charge" and the Rolls Battery user manual (v7.4), which sets charger compensation at 4 mV/°C/cell for AGM and 3 mV/°C/cell for OPzV gel and asks for a four-hour open-circuit stand.
- LiFePO4 pack basics and the flat plateau: Victron 12.8 V and 25.6 V LiFePO4 Smart battery datasheet (3.2 V nominal per cell, 12.8 V = 4 cells in series) together with Battle Born on state of charge and voltage in LiFePO4 batteries (13.6 V rested full on a 12 V pack, two hours or more of rest, flat plateau between roughly 20% and 80%).
- Lithium-ion cell limits: Panasonic NCR18650B specification sheet — 3.6 V nominal, 4.20 V charge voltage, 2.50 V discharge cut-off, which anchor the top and bottom of the lithium-ion column.
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.
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 / 6Meter reading
0.00 VYour call
50%Run score
0Best run
0Focus 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.
