By Jae-Won Kim, CTO & Co-Founder, Sasung Power
Every conventional BMS firmware stack assumes that an OCV-SoC calibration after 2 to 4 hours at zero current reflects the cell's true electrochemical state. The measured open-circuit voltage resets the Coulomb counter to a lookup-table SoC value, limiting long-term estimation drift. That scenario breaks down when a vehicle is parked on a slope or a loaded cargo bay keeps structural cells under mechanical load. The measured voltage then carries a strain-induced offset of 1.5 to 3 mV per percent in-plane strain. Each incorrect OCV reset writes that error into the Coulomb counter, where it persists until the next calibration event.
Strain-Corrected OCV Calibration
In carbon fiber composite LFP cells, the strain voltage offset is not the equilibrium electrochemical voltage. It comes from piezo-electric-like coupling in the carbon fiber network and pressure effects on electrolyte activity within the separator. The effect is reversible: after mechanical load is removed, the offset fades over the cell's electrochemical relaxation time, typically 10 to 60 minutes for LFP.
A vehicle at rest does not necessarily have zero strain in its structural floor cells. A loaded delivery robot left on an incline can hold 0.15 to 0.3% sustained bending strain in its floor panel because of payload mass. A passenger vehicle on a crowned road with an asymmetric load can behave similarly. Firmware therefore cannot treat "current = 0" as proof that "strain = 0."
Gate OCV resets on strain, not current alone. Accept a calibration event only when the strain proxy, or direct strain sensor output, is below the level associated with less than 0.5 mV of expected voltage offset. At that point, the strain contribution sits below the voltage measurement noise floor and can be ignored safely. If sustained strain is higher, reject the event and keep the Coulomb counter running from its current state.
This requires one conditional branch in the OCV reset routine and strain data available to the main BMS controller during reset evaluation. In our firmware architecture, strain proxy channels update at 10 Hz. Their current value reaches the BMS calibration routine through a CAN message at each calibration evaluation window.
Coulomb Drift Through Mechanical Load Cycles
Between OCV events, Coulomb counting remains the primary SoC estimator. Its accuracy depends on current measurement precision, the true usable-capacity model, and how often OCV resets remove accumulated drift. In a conventional pack, each charge event can provide a clean reset because the vehicle remains plugged in at zero current long enough for relaxation. An extended parking period can provide another opportunity.
A high-utilization structural pack may rarely see extended zero-current periods. For a logistics robot running two shifts per day, the charging window may be the only dependable OCV reset opportunity. If the robot is parked on a loading dock with residual floor deflection, however, strain offset contaminates that calibration window as well.
Drift follows both current-sensor accuracy and capacity-model accuracy. A 0.1% current measurement error over 1,000 Ah of daily throughput creates 1 Ah of Coulomb counter error per day, or about 0.5% SoC error per day on a 200 Ah pack. Without a corrective OCV reset, the error compounds. After a week without clean calibration, SoC error can reach 3 to 5%, the point at which discharge reserve margins must widen to prevent unexpected cutoff.
A firmware countermeasure is a dual-mode SoC estimator. Coulomb counting remains the primary path, while a secondary extended Kalman filter, or EKF, continuously compares it with a voltage-based SoC estimate from the local cell relaxation model. The EKF does not need a full OCV rest. It can draw useful SoC information from the transient voltage recovery curve after a discharge pulse ends, on a shorter timescale than full OCV equilibration. The tradeoff is computation: an EKF with 3 to 5 state variables for each of 96 cell groups requires approximately 1.2 MFLOPS per second on the main BMS controller. That is modest for a 32-bit automotive MCU, but it is not free.
Load-Dependent Cutoff Voltage Control
For LFP, the lower discharge cutoff is typically 2.5 V per cell, below which copper dissolution at the anode and irreversible capacity loss become risks. The upper charge cutoff is typically 3.65 V. Both limits describe the cell's electrochemical voltage and exclude external bias.
Under 0.3% compressive strain, a structural cell may report 2 to 4 mV above its true electrochemical voltage. Near end of discharge, that positive offset makes the measured value look safer than the cell actually is. Firmware may see 2.53 V while the electrochemical voltage is 2.49 V, so it does not invoke the 2.5 V cutoff. The cell can then discharge below its safe limit.
Use a strain-aware guard band for discharge cutoff. When sustained compressive strain exceeds the level associated with a 2 mV offset, raise the cutoff to 2.52 V. This keeps actual cell voltage from falling below 2.5 V regardless of strain state. The guard band costs 2 to 3% of usable capacity in worst-case load conditions. That is the appropriate tradeoff: predictable, correctable over-discharge is not a corner case the firmware should permit.
Strain Correction in the Interrupt Pipeline
Strain correction must arrive quickly enough to prevent transient measurement errors from causing false protection actions. A vehicle crossing a pothole at speed can produce in-plane strain spikes of 0.5 to 1.0% during a 50 ms event window. With a 200 ms filter lag, the uncorrected voltage transient from that impulse may appear as a 5 to 8 mV cell-voltage spike, potentially causing a false over-voltage event on a nearly fully charged cell.
The correction path needs an update rate of at least 100 Hz and no more than 20 ms from ADC conversion to applied voltage correction. That puts the function in the main measurement interrupt rather than the slower background calibration loop. Our architecture samples strain proxy channels at 200 Hz through the same ADC used for cell voltage, applies a 10-sample moving average to limit noise without excessive lag, then sends corrected voltage to protective threshold comparisons before logging the raw measurement to telemetry.
Conventional BMS Firmware Boundaries
Conventional BMS firmware can support structural packs after changes to calibration, estimation, and threshold layers. These elements cannot be transferred unchanged:
OCV reset logic needs strain conditioning. SoC convergence assumptions must change because they depend on periodic clean OCV resets for drift correction. Fixed cutoff tables need strain-aware guard bands. A single thermal model across all cells fails when temperature varies by 6 to 10°C across a structural panel. Pack-level current as the sole Coulomb-counting input also needs per-cell temperature correction to account for capacity across that gradient.
The rest of the architecture remains compatible: interrupt-driven measurement, balancing logic, CAN communication framing, fault logging, and the basic safety shutdown state machine do not need to be rebuilt from scratch. Structural support is a correction and conditioning layer between raw measurements and existing estimation and protection logic. The point is not to port conventional firmware unchanged, but to validate that layer against the specific vehicle platform's load cases. That is a more tractable scope than rewriting a full BMS stack, provided each correction is tested under the loads the platform will actually experience.