FIELD GUIDE · v2

Reading Battery State-of-Health

How I judge a hybrid pack without trusting the dashboard. Module voltage spread, internal-resistance rise, capacity fade — and the equipment that does the judging.

← Adam Pollard · Shop

The dashboard tells you "battery health is good" and gives you a bar chart nobody reads. That's a marketing screen, not a diagnosis. To judge a pack you need three numbers from a live BMS scan or a bench test: module voltage spread, internal-resistance rise, and capacity fade against rated. This guide is the way I actually run that read, and the thresholds where I start writing "replace module" instead of "drive another year."

Why SOH, and Why Not the Dashboard

State-of-health (SOH) is the catch-all term for how much usable life a pack has left versus its rated new condition. It's not one thing. Aging shows up as: lithium inventory lost to solid-electrolyte interphase growth (capacity fade), impedance climbing as conductive paths degrade (IR rise), and cells drifting apart from each other (imbalance). All three march together, but they don't mark time equally. A pack can lose 12% capacity and still read "good health" on the dash because it's balanced enough to deliver its now-shorter range. The dash graphs range, not degradation.

HV safety — read before you sweep a pack

The Three Numbers That Matter

MetricWhat it catchesHealthyI get suspiciousI write it up
Module voltage spreadCell imbalance / weak cells< 10 mV between modules at rest25–50 mV spread> 50 mV sustained
Internal resistance riseImpedance / degradation< +10% over rated+20–40%> +40% on any module
Capacity fadeUsable energy loss> 90% of rated80–90%< 80% (or per fleet policy)

Those are my working bands for a typical NiMH/Li-ion hybrid traction pack. Fleet policy and the vehicle's Warranty SOH threshold override them; a taxi that's down to 82% gets pulled a lot sooner than a weekend car at 78%. The shape of the fault matters as much as the number.

IR rise (module): ΔR% = (R_test − R_rated) / R_rated × 100
Capacity fade: C_fade% = C_measured / C_rated × 100
Voltage spread: V_max − V_min across all modules at 20% SOC rest.

The Procedure, In Order

  1. Park at known SOC. I bring the pack to ~20% SOC and let it rest minimum one hour — voltages settle; a fresh-off-charge read lies.
  2. Full module voltage sweep. Via the BMS scan tool or service port. Log every module, not just the pack average. I want the spread, not the mean.
  3. IR test. Megohmmeter for isolation on the pack side. For per-module impedance I use the BMS's own cell-balancing current pulses — every module reports voltage under a known load, and I take the delta.
  4. Capacity check. Controlled discharge at the nominal C-rate, logging amp-hours out. This is the slow one — it's a full discharge cycle, not a 10-minute tap.
  5. Read the pattern, not the bar. One module 40 mV high with matching IR rise = single weak cell, replace that module. Uniform IR creep across all = whole pack age, plan for pack, not module.

Patterns I read in the scan

Pack Simulator — You Drive the Read

Drag the three sliders and watch what I'd say about the hypothetical pack. This is the same arithmetic the BMS uses under the hood, rendered as a verdict instead of a bar.

Grounding: pack reads and thresholds above are from my field work on hybrid traction packs; chemistry baseline on the working anode/cathode assumptions cites lithium-ion battery (Wikidata). Slider verdicts follow the threshold bands in the table; a real diagnosis needs the full procedure, not the simulator.