BEST - Battery SOC estimator
Description
The BEST (Battery ESTimator) module implements a battery state estimation algorithm. It estimates the SOC (State Of Charge) and SOH (State Of Health) of a configured battery pack based on current and voltage readings.
The estimation combines two approaches:
- Coulomb counting — integrating the current flowing through the controller
- Voltage estimation — estimating SOC from the battery voltage using an OCV (Open Circuit Voltage) model
These two methods work together to compute the SOC.
There are two variants of the OCV model, depending on the product:
- 4-point OCV — used in ESC controllers. The cell OCV curve is approximated by 4 voltage breakpoints at 0%, 10%, 85%, and 100% SOC, with a single scalar cell resistance.
- OCV table — used in BMS. The cell OCV curve is defined by a multi-point lookup table with temperature-dependent interpolation and per-temperature cell resistance values.
- For controllers, the BEST parameters are located at
/best. - For BMS, the BEST parameters are located at
/driver/best.
Voltage estimation
By increasing soc_gain or reset_gain, the BEST module will rely more on voltage estimation for SOC correction.
Coulomb counting
There is no explicit setting for coulomb counting strength. It can be disabled by setting P to 0.
If the siliXcon controller is not the only power device connected to the battery, coulomb counting should be disabled since the controller cannot measure the total battery current.
Parameters
Common parameters
These parameters are present in both OCV model variants.
| Parameter | Unit | Description |
|---|---|---|
S | - | Number of cells in series |
P | - | Number of cells in parallel. Set to 0 to disable coulomb counting |
soc_gain | SOC voltage correction weight. Set to 0 to disable voltage correction during run (voltage correction will still work during BEST reset) | |
reset_time | ms | SOC reset time at device startup. Negative value for manual-only reset via breset command or from the app. Set to 0 to disable the reset feature |
reset_gain | SOC reset correction weight. Same role as soc_gain, but applied during the BEST reset period | |
Rs | Ohm | Pack wiring resistance (not present in single-cell mode) |
Cc | mAh | Cell nominal capacity |
OCV model parameters
- 4-Point OCV (Controllers)
- OCV Table (BMS)
The 4-point model approximates the cell OCV curve using four voltage breakpoints. A single scalar resistance value is used for the cell.
| Parameter | Unit | Description |
|---|---|---|
Rc | Ohm | Cell nominal resistance |
U100 | V | OCV for cell when SOC = 100% |
U85 | V | OCV for cell when SOC = 85% |
U10 | V | OCV for cell when SOC = 10% |
U0 | V | OCV for cell when SOC = 0% |
OCV = Open Circuit Voltage — the voltage on a single battery cell without load.
The OCV table model uses multi-point lookup tables with bilinear interpolation across SOC and temperature. Up to 6 temperature breakpoints are supported, each with its own OCV table and cell resistance value.
| Parameter | Unit | Description |
|---|---|---|
T | C | Temperature breakpoints array (up to 6 values) |
Rc | Ohm | Cell resistance per temperature (array, one value per temperature breakpoint) |
ocv_T1 | V | OCV table for temperature T[0] (index 0 = 0% SOC, last index = 100% SOC) |
ocv_T2 | V | OCV table for temperature T[1] |
ocv_T3 | V | OCV table for temperature T[2] |
ocv_T4 | V | OCV table for temperature T[3] |
ocv_T5 | V | OCV table for temperature T[4] |
ocv_T6 | V | OCV table for temperature T[5] |
The number of OCV tables and resistance values depends on the number of configured temperature breakpoints. Not all ocv_T* tables may be present.
States
| State | Unit | Description |
|---|---|---|
SOC | 0-1 | Battery state of charge |
OCV | V | Extrapolated cell open circuit voltage |
Permanents
Located at folder /permanents.
| Permanent | Unit | Description |
|---|---|---|
Cmax | mAh | Maximum battery capacity (at 100% charge) |
Cact | mAh | Actual battery capacity |
Shell commands
| Command | Description |
|---|---|
breset | Reset BEST module SOC and SOH. During reset_time, SOC is corrected using reset_gain |