开路电压法(OCV)
原理
开路电压法是基于电池的开路电压与电池的荷电状态(SOC)之间存在单调的函数关系。对于大多数电池,如锂离子电池,当电池处于开路状态(即没有电流流入或流出)时,其开路电压与电池内部的化学状态相关,而化学状态又和SOC有直接联系。一般来说,随着SOC的增加,开路电压也会升高,但这种关系不是线性的,不同的电池材料和结构会有不同的OCV - SOC曲线。 C语言示例代码及分析(假设已经有测量开路电压的函数measure_OCV()
,并且有存储OCV - SOC关系曲线的数据表)
float OCV[ ] = { 3.0 , 3.2 , 3.3 , 3.4 , 3.5 , 3.6 , 3.7 , 3.8 , 3.9 , 4.0 } ;
float SOC[ ] = { 0.0 , 0.1 , 0.2 , 0.3 , 0.4 , 0.5 , 0.6 , 0.7 , 0.8 , 0.9 } ;
float measure_OCV ( ) {
return 3.5 ;
}
float calculate_SOC_OCV ( ) {
float measured_OCV = measure_OCV ( ) ;
for ( int i = 0 ; i < sizeof ( OCV) / sizeof ( OCV[ 0 ] ) - 1 ; i++ ) {
if ( measured_OCV >= OCV[ i] && measured_OCV < OCV[ i + 1 ] ) {
float slope = ( SOC[ i + 1 ] - SOC[ i] ) / ( OCV[ i + 1 ] - OCV[ i] ) ;
return SOC[ i] + slope* ( measured_OCV - OCV[ i] ) ;
}
}
return - 1 ;
}
在上述代码中,首先定义了OCV
和SOC
数组来存储开路电压和对应的SOC值的关系。measure_OCV()
函数用于模拟测量电池的开路电压。calculate_SOC_OCV()
函数通过查找测量的开路电压在OCV
数组中的位置,并利用线性插值的方法来计算SOC。如果测量的开路电压在OCV
数组中的两个值之间,就根据这两个值对应的SOC进行线性插值计算,从而得到较为准确的SOC估计值。
安时积分法(Coulomb - Counting)
原理
安时积分法是基于电池电量的变化与电流的积分关系来计算SOC。根据公式
S
O
C
=
S
O
C
0
−
1
C
n
∫
t
0
t
I
(
τ
)
d
τ
,
SOC=SOC_0-\frac{1}{C_n}\int_{t_0}^tI(\tau)d\tau,
SOC = SO C 0 − C n 1 ∫ t 0 t I ( τ ) d τ , ,其中(SOC_0)是初始SOC,(C_n)是电池的额定容量(单位为安时,Ah),(I(\tau))是随时间变化的电流。简单来说,就是记录电池在充电或放电过程中的电流和时间,通过积分(在离散情况下可以用求和近似)来计算电池已经放出或充入的电量,再结合初始SOC来得到当前SOC。这种方法的精度取决于电流测量的精度和初始SOC的准确性。 C语言示例代码及分析(假设已经有测量电流的函数measure_current()
和记录时间间隔的变量dt
,以及已知初始SOC和电池额定容量)
float SOC_initial = 0.8 ;
float C_n = 2.0 ;
float measure_current ( ) {
return - 0.5 ;
}
float dt = 0.1 ;
float calculate_SOC_Ah ( ) {
static float SOC = SOC_initial;
float current = measure_current ( ) ;
SOC -= ( current * dt) / C_n;
return SOC;
}
在代码中,首先定义了初始SOC(SOC_initial
)和电池额定容量(C_n
)。measure_current()
函数用于模拟测量电池的电流。dt
表示时间间隔。calculate_SOC_Ah()
函数通过不断更新SOC的值来计算。每次调用该函数,它会获取当前电流,根据安时积分公式计算SOC的变化量(因为电流为负表示放电,所以SOC会减少),然后更新并返回SOC的值。这种方法需要注意的是,随着时间的推移,电流测量误差会累积,可能导致SOC估计误差逐渐增大。同时,初始SOC的准确性也很重要,如果初始SOC有较大误差,后续的计算也会受到影响。