An EV's range estimate is only as good as its battery-management system (BMS). State of charge (SOC) cannot be measured
directly — it has to be estimated from noisy current and voltage sensors, with a model of the cell.
1 · Cell model
Each of the 96 series cell groups (2 × 50 Ah NMC cells in parallel) is a first-order Thevenin equivalent circuit:
SOC' = −I / (3600·Q)
v₁' = −v₁/τ + I/C₁ (τ = R₁C₁ ≈ 20 s)
V = OCV(SOC) − v₁ − R₀(SOC, T)·I
OCV(SOC) is a monotone cubic (PCHIP) fit to a typical NMC curve; R₀ rises at low SOC and in the cold (Arrhenius). A lumped thermal
model heats each cell with I²R₀ + v₁²/R₁ and cools it to ambient. Cells differ by a manufacturing spread in capacity and resistance.
2 · Vehicle
P = (m·a + ½ρC_dA·v² + C_rr·m·g)·v / η (+ auxiliaries), regen: P·η_regen
Procedural city, highway and sporty drive cycles produce the battery current.
3 · Estimators
- Coulomb counting integrates measured current — exact in theory, but it never corrects a wrong starting value and
integrates every sensor offset and capacity error forever.
- Voltage lookup inverts the OCV curve — self-correcting, but noisy under load and blind in flat parts of the curve.
- Extended Kalman filter fuses both: predicts with coulomb counting and the RC model, corrects with the voltage
measurement through the linearised OCV slope, and tracks its own uncertainty (±3σ band).
- EKF + bias state additionally estimates the current-sensor offset as a third state.
4 · Charging & balancing
Charging is constant-current until the highest cell reaches 4.2 V, then constant-voltage. In a series string the pack is empty when
the weakest cell is empty and full when the strongest is full — energy left in the other cells is stranded. Passive
balancing bleeds high cells through resistors so the string ends up aligned.
Things to try
- Start the BMS at 60 % while the pack is at 85 %: coulomb counting stays 25 % off; the EKF converges within minutes.
- Raise the current-sensor offset and drive for an hour: the plain EKF drifts slightly, the bias-state EKF learns the offset.
- Drop the ambient temperature to −10 °C and drive the sporty cycle.
- Switch to Charge with balancing off, then on, and watch the cell spread at the top.