State of charge estimation
State of Charge estimation
Aim:
Explaining the BMS implementation of coulomb counting for SOC estimation.
Answer:
Coulomb Counting:
The Coulomb counting method measures the discharging current of a battery and integrates the discharging current over time in order to estimate SOC. Coulomb counting method is done to estimate the SOC(t), which is estimated from the discharging current, I(t), and previously estimated SOC values, SOC(t-1). SOC is calculated by the following equation:
`SOC(t) = SOC(t -1) + frac{I(t)}{Q_n}*Deltat`
But there are several factors that affect the accuracy of the Coulomb counting method including temperature, battery history, discharge current, and cycle life.
To improve the Coulomb counting method, a new technique called the modified Coulomb counting method is proposed. The modified Coulomb counting method uses the corrected current to improve the accuracy of estimation. The corrected current is the function of discharging current. There is a quadratic relationship between the corrected current and the discharging current of the battery. By the practice of experimental data, the corrected current is calculated by the following form:
`I_c(t) = k_2I(t)^2 + k_1I(t) + k_0`
where `k_2`, `k_1` and `k_0` are constant values obtained from the practice experimental data.
In the modified Coulomb counting method, SOC is calculated by the following equation:
`SOC(t) = SOC(t -1) + frac{I_c(t)}{Q_n}*Deltat`
Coulomb Counting for SOC estimation
![]() |
The figure shows that, a simple two-cell battery pack with the lower cell having SOC equal to 100 % and the upper cell having SOC equal to 0 %. We might define “battery-pack SOC” to be 0 % because we cannot discharge without over-discharging the top cell. However, a value of 0 % implies that we can charge the battery pack, and we know that we cannot do so without overcharging the lower cell. Therefore, a definition of 0 % is not meaningful. Or, we might define battery-pack SOC to be 100 % because we cannot charge without overcharging the bottom cell. However, that implies that we can discharge the battery pack, which we cannot do |
At such times, cell balancing is needed. But before that, the SOC estimate is needed to get to that point. One of the methods of estimating SOC is the current based method. In this method, we make use of Coulomb counting.

Fig: Coulomb Counting for Battery SOC
To use current as the primary estimator of state of charge, we recall that;
`z_k = z_0 - frac{Deltat}{Q}sum_(k-1)^(j=0)*n_ji_j`
This equation is, in fact, precise. It measures the amount of charge added to or removed from the cell, normalizes this net amount by total capacity, and updates the state of charge based on this net flow of charge. If we use this relationship as the basis of an estimator, we are said to be coulomb counting. However, we must recognize that what is implemented in practice is really.
`hat z_k = hat z_0 - frac{Deltat}{hat Q}sum_(k-1)^(j=0)*hat n_ji_(means,j)`
where “ˆ' on a variable indicates an estimate of the value of that variable and where;
`i_(means,j) = i_(true,j) + i_(noise,j) + i_(bias,j) + i_(nonli,j) − i_(self-discha,j) − i_(l.eak,j)`
Coulomb counting is a risky method to use to estimate SOC. It can be acceptable for short periods of operation when initial conditions are well known. Alternatively, if the application has frequent excursions into voltage regions where the SOC can be estimated reasonably well from measured voltage, the coulomb count can be reset at these points, which tends to make it more reliable. Coulomb counting, with some kind of reset mechanism, is sometimes the only viable option for estimating SOC.
Example
Let's take a 12 V battery with a capacity of 500Ah, with a load of 0.6 `Omega`. Initially, the battery is completely full. Let's calculate SOC after 3 hours using the Coulomb counting method.
`V_(oc) = 12 V`, `Q_n = 500 Ah`, `Deltat = 3 Hrs`
`I_c(t) = frac{V_(oc)}{Load Res.} = frac{12}{0.6} = 20 A`
`SOC(t) = SOC(t -1) + frac{I_c(t)}{Q_n}*Deltat = 100 + (frac{-20}{500}*3)*100`
Current is negative due to discharge
`therefore SOC(t) = 100 - frac{6000}{500} = 88 %`
