3.2 Capacity and SoC
This page explains how the BMS keeps the state of charge (SoC) of the pack, how to choose the capacity, and how to set the conditions that correct the SoC to 100 % and to 0 %. With the right values, the SoC starts from a known point at every full charge and stays close to the real charge between them.
Applies to
Boards: BMS1820, BMS3610, BCU2002, BMS1601, BMS1810.
3.2.1 How It Works
The BMS counts the charge that goes in and out of the pack through the current sensor. It divides the stored charge by Usable Pack Capacity to get the SoC, and it corrects the result at the two ends of the pack: full and empty.
- Counting. Charge current counts up and discharge current counts down. Self Discharge Power is counted too, also at rest. Currents between −0.5 A and +0.5 A read as no current and are not counted (3.6 Current Measurement), so a small error builds up between corrections.
- FULL. When the conditions of 3.2.3 hold for 60 s, the SoC is set to 100 %.
- EMPTY. When the condition of 3.2.4 holds for 60 s, the SoC is set to 0 %.
- Limits. The count stops at 100 % and at 0 %; it never goes beyond them.
- What the SoC acts on. It drives the Low SOC Limit-1 (≤15) and Low SOC Limit-2 (≤5) output functions (3.10 Inputs and Outputs), the Low SoC warning events and the current request to a CAN charger. It never switches a path OFF; the cell voltage limits do that (3.3 Cell Voltage Limits).
Fig.3.2.1: State of Charge Over a Charge, Rest and Discharge
Table.3.2.1: Where the State of Charge Is Shown
| Where | Value | Meaning |
|---|---|---|
| Live View | SOC | SoC in whole percent. |
| Live View | Energy | Stored charge in Ah. Energy ÷ Usable Pack Capacity = SoC. |
| Live View | Battery Cycle | Cycle count: one cycle is one Usable Pack Capacity charged plus one discharged. |
| CAN 0x02 | SoC, Cycle | As in Live View. |
| CAN 0x04 | Charge Completed | 1 after FULL, until the SoC falls below 100 %. |
| CAN 0x05 | Energy | As in Live View. |
| Modbus 40107 | SOC | SoC in percent. |
| JSON SOC | SOC | SoC in percent. |
Despite its name, Energy is a charge in Ah. The BMS does not report the stored energy in Wh.
3.2.2 Capacity and Initial SoC
Usable Pack Capacity is the charge in mAh that the pack really delivers between your FULL and your EMPTY point. It is not the nameplate value: the real value depends on the voltages you choose, on the load and on the age of the cells. The BMS does not learn the capacity by itself, so measure it again when the pack ages. A new value keeps the SoC in percent.
To measure it:
- Set the FULL and EMPTY values (3.2.3, 3.2.4) and the cell voltage limits (3.3 Cell Voltage Limits) first. With the defaults neither FULL nor EMPTY happens.
- Set a value somewhat above the expected capacity, and charge until FULL sets the SoC to 100 %.
- Discharge at your usual current until the EMPTY point. Note the last Energy value before the SoC drops to 0 %.
- New Usable Pack Capacity = the value you set − the Energy value you noted. Energy is in Ah and the capacity in mAh, so multiply Energy by 1000.
Initial SoC sets the SoC by hand, in whole percent. It acts once, when you save a value different from the stored one (2.1 Managing Settings).
- When to use it: at commissioning, when the BMS cannot know the real charge of the pack. Set Usable Pack Capacity first. The most exact start is not a typed value but a full charge, because FULL sets the SoC for you.
- What the field shows: the last value that was entered, not the present SoC.
- At the next start the BMS goes ON with its own SoC; Initial SoC is not applied again.
- To set the value that is already stored, save another value first, then the one you want.
3.2.3 Full Detection
FULL is the correction that matters most, because it happens at every complete charge. There are two ways to detect it, and Enable FULL SoC only for FCV chooses between them. Both need the conditions to hold for 60 s while the pack is not discharging. The time starts again when a condition fails.
Pack and cell conditions (Enable FULL SoC only for FCV off). All of these must hold at the same time:
- The pack voltage is at or above FULL SoC Pack Voltage.
- The lowest cell is at or above FULL SoC Min. Cell Voltage.
- The difference between the highest and the lowest cell is at or below FULL SoC Cell Delta Threshold.
- The current is at or below FULL SoC Charge Cutoff Curr., and a pack at rest also meets this condition.
FCV only (Enable FULL SoC only for FCV on). The highest cell at or above FULL SoC Max Cell Volt. (FCV) is enough. The current, the lowest cell and the cell difference are not checked, and LiMon™ greys out their fields. Use it only on a pack whose cells stay balanced, because one high cell alone then sets 100 %.
Hold %99 until FULL SoC works with the pack and cell conditions. While the pack charges, the count stops at 99 % until FULL, so 100 % always means that the conditions were met. Without it, the count goes on to 100 % and stops there, even if the pack is not full yet. A CAN charger is told to stop when the SoC reaches 100 %, so the hold also keeps the charger running until the pack is really full.
While the FULL conditions keep holding, the SoC stays at 100 %. It starts to fall once a condition fails, for example when the cell voltages settle after the charger stops.
Choosing the values. Take the voltages from the cell datasheet and from the end voltage of your charger.
- Below the charger's end voltage. A charger that stops below your FULL voltage never gives a FULL. Stay below O.V. Protection too (3.3 Cell Voltage Limits).
- Above the resting voltage of a pack that is not full. The current condition is also true at rest, so a pack that rests above your FULL voltages is set to 100 %.
- Flat voltage curve (for example LFP). The voltage says little about the charge until the cell is almost full, and it falls back soon after the charger stops. The current condition does most of the work; keep the voltages just below the end of the charge.
- Sloped voltage curve (for example NMC). The voltage follows the charge closely, so the voltage conditions alone already say a lot.
- FULL SoC Min. Cell Voltage comes first: take it from the cell datasheet and from the end voltage of your charger per cell. FULL SoC Pack Voltage is then about the cell count × that value.
- FULL SoC Cell Delta Threshold must be above the difference that your pack really reaches at the end of a charge, and below Imbalanced Max. Cell Delta, which stops the pack after about 30 s, before the 60 s of FULL (3.3 Cell Voltage Limits). Balancing brings the difference down (3.4 Cell Balancing).
- FULL SoC Charge Cutoff Curr. is the current at which your charger's constant-voltage phase is nearly over.
3.2.4 Empty Detection
When the lowest cell stays at or below EMPTY SoC Min. Cell Voltage for 60 s, the SoC is set to 0 %. The direction of the current does not matter. The check is skipped while a Cell Connection error is active, because a broken sense wire can read as a low cell.
- Above U.V. Protection. The cell has to stay at the EMPTY voltage for 60 s. If the discharge path switches OFF first, the cell voltage recovers and the correction does not happen.
- With your load in mind. Under load the cell voltage is lower than at rest. A heavy load that holds a cell below the EMPTY voltage for 60 s sets the SoC to 0 %, also if charge is left.
- After EMPTY. The SoC stays at 0 % while the cell stays below the voltage, and counts up from 0 % after that.
3.2.5 Settings
Table.3.2.2: Capacity and SoC Settings (LiMon™ Battery tab)
| Setting | What it does | How to choose | Unit | Range | Default |
|---|---|---|---|---|---|
| Usable Pack Capacity | The capacity that the SoC is based on. | Measured value (3.2.2), not the nameplate. | mAh | 0…5000000 | 38000 |
| Initial SoC | Sets the SoC when a different value is saved. | The real charge of the pack, at commissioning. | % | 0…100 | 50 |
| FULL SoC Pack Voltage | Lowest pack voltage for FULL. | About cell count × FULL SoC Min. Cell Voltage, below the charger's end voltage. | mV | 0…900000 | 300000 |
| FULL SoC Min. Cell Voltage | Lowest cell voltage for FULL. | From the cell datasheet and the charger's end voltage per cell; choose it first. | mV | 0…5000 | 4000 |
| FULL SoC Cell Delta Threshold | Largest difference between cells for FULL. | Above what the pack reaches at the end of a charge, below Imbalanced Max. Cell Delta. | mV | 0…65535 | 50 |
| FULL SoC Charge Cutoff Curr. | Highest current for FULL. | Near the end of the constant-voltage phase, at least 500 mA. | mA | 0…1000000 | 50000 |
| Hold %99 until FULL SoC | Stops the count at 99 % until FULL. | On, so that 100 % always means full. No effect with FCV only. | — | on, off | on; BMS1810 off |
| Enable FULL SoC only for FCV | Uses the FCV voltage alone for FULL. | Off, unless the cells stay balanced. | — | on, off | off |
| FULL SoC Max Cell Volt. (FCV) | Highest cell voltage for FULL, with FCV only. | Below O.V. Protection, so that charging lasts the 60 s. | mV | 0…5000 | 4100 |
| EMPTY SoC Min. Cell Voltage | Lowest cell voltage for EMPTY. | Above U.V. Protection (3.2.4). | mV | 0…5000 | 2500 |
The LiMon™ reference describes every field of the screen: 7.1 Battery Settings.
3.2.6 Example
Calculation example: 16S LFP pack, 100 Ah nameplate
These are chosen values to show the calculation; take yours from your cell datasheet and your own measurement.
- Usable Pack Capacity: 96000 mAh, measured as in 3.2.2 on this example pack. The nameplate says 100 Ah.
- FULL SoC Min. Cell Voltage: 3360 mV.
- FULL SoC Pack Voltage: 16 × 3360 mV = 53760 mV.
- FULL SoC Cell Delta Threshold: 50 mV, below the Imbalanced Max. Cell Delta of 100 mV.
- FULL SoC Charge Cutoff Curr.: 20000 mA, which is 0.2 C of the 100 Ah pack.
- Hold %99 until FULL SoC: on. Enable FULL SoC only for FCV: off.
- EMPTY SoC Min. Cell Voltage: 2950 mV, with U.V. Protection set below it.
- Charger: a constant-voltage phase above 53.76 V, so that the voltage conditions are met while the current falls.
During the constant-voltage phase the SoC stays at 99 %, with Energy at about 95.0 Ah. When the current has been at or below 20 A for 60 s, and the voltages and the cell difference are also in place, the SoC goes to 100 % and Energy to 96.0 Ah.
3.2.7 Checking the Result
- After saving Initial SoC: Live View shows the new SOC, and Energy = SoC × Usable Pack Capacity. With 50 % and 96000 mAh that is 48.0 Ah.
- After a full charge: SOC 100 %, Energy equal to Usable Pack Capacity, and the CAN 0x04 Charge Completed flag at 1.
- During a rest: Live View shows 0.0 A, or a small negative current with a large Self Discharge Power, and the SoC falls only slowly, as that setting predicts.
- At the end of a discharge: the SoC goes to 0 % from a small value. A large jump means Usable Pack Capacity is too high.
3.2.8 Common Mistakes
- Nameplate capacity entered. The pack delivers less than the value says, so the SoC is still well above 0 % when EMPTY comes and it jumps down. On a charge from empty it counts too slowly and jumps up at FULL. Measure the capacity (3.2.2).
- Capacity set too low. The SoC reaches 0 % while the pack still delivers, and it reaches 99 % long before the charge ends. Measure the capacity.
- SoC stays at 99 %. A FULL condition is never met. The usual cause is a charger that stops below the FULL voltage, or a cell difference above FULL SoC Cell Delta Threshold. Compare the Live View values with each FULL setting at the end of a charge.
- FULL settings left at the defaults. FULL SoC Pack Voltage 300000 mV is far above a low-voltage pack, so FULL never comes. Set all the FULL values for your pack.
- FULL voltages set too low. The conditions are true at rest, so a pack that is not full goes to 100 % after 60 s. Raise the voltages above the resting voltage of a pack that is not full.
- FULL SoC Charge Cutoff Curr. below 500 mA. A current below 0.5 A reads as no current (3.6 Current Measurement), so the value acts like 500 mA and FULL does not wait for the smaller current.
- Initial SoC saved again by mistake. A value different from the stored one sets the SoC at once, also after an import (2.1 Managing Settings). Enter the real charge, or charge the pack to FULL to correct it.
- FCV only on a pack that is never balanced. One high cell sets 100 % while the other cells are lower, at every charge. Turn FCV only off or balance the pack (3.4 Cell Balancing).
- EMPTY SoC Min. Cell Voltage at or below U.V. Protection. The discharge path switches OFF first, so the SoC never gets its correction to 0 %. With the default values this is the case: 2500 mV against 3050 mV.
- EMPTY voltage too high for the load. A heavy load sets the SoC to 0 % with charge left. Lower the voltage, or check it against the voltage under your usual load.
- SoC runs the wrong way or drifts fast. The current reading is the cause: a wrong sign, or current at start-up (3.6 Current Measurement).