在新能源车辆和储能系统中,锂电池的荷电状态(State of Charge, SOC)估算堪称"电池管理系统的大脑"。这个看似简单的百分比数字,实际上直接影响着续航预测、充放电控制和电池寿命评估。但SOC无法直接测量,就像我们无法直接看到油箱里还剩多少油,只能通过电压、电流、温度等间接参数来推算。
传统安时积分法就像用沙漏计时,电流测量的小误差会随时间不断累积。而开路电压法需要电池静置数小时,在动态工况下根本不实用。这就是为什么卡尔曼滤波算法会成为工业界的首选方案——它能够通过数学模型和实时数据融合,动态修正估算误差。
标准卡尔曼滤波(KF)要求系统必须是线性的,但锂电池的电压-SOC关系曲线呈现明显的非线性特征。这就像试图用直尺测量弯曲的河道长度。扩展卡尔曼滤波(EKF)通过局部线性化解决了这个问题:
具体到电池模型,通常采用二阶RC等效电路:
code复制OCV(SOC) - R0*I - V1 - V2 = Vterminal
dV1/dt = -V1/(R1*C1) + I/C1
dV2/dt = -V2/(R2*C2) + I/C2
在Simulink中实现EKF SOC估算时,需要严格遵循以下流程:
状态方程离散化:
matlab复制% 状态向量x = [SOC; V1; V2]
A = [1 0 0;
0 exp(-dt/(R1*C1)) 0;
0 0 exp(-dt/(R2*C2))];
B = [-dt/Qn;
R1*(1-exp(-dt/(R1*C1)));
R2*(1-exp(-dt/(R2*C2)))];
观测矩阵线性化:
matlab复制C = [dOCV/dSOC|SOC_k -1 -1]; % OCV-SOC曲线的斜率
协方差矩阵更新:
matlab复制P_ = A*P*A' + Q; % Q为过程噪声协方差
卡尔曼增益计算:
matlab复制K = P_*C'/(C*P_*C' + R); % R为观测噪声协方差
状态与协方差修正:
matlab复制x = x_ + K*(Vmeas - Vpred);
P = (eye(3) - K*C)*P_;
准确的模型参数是EKF的基础。通过混合脉冲功率特性(HPPC)测试获取参数:
| 参数 | 测试方法 | 典型值范围 |
|---|---|---|
| R0 | 瞬时电压变化/电流 | 0.5-5mΩ |
| R1,C1 | 1-10s时间常数的弛豫过程 | 1-10mΩ, 1-10kF |
| R2,C2 | 10-100s时间常数的弛豫过程 | 0.1-1mΩ, 10-100kF |
采用分段多项式拟合确保导数连续:
matlab复制OCV = p1*SOC^5 + p2*SOC^4 + ... + p6; % 5阶多项式
dOCV = 5*p1*SOC^4 + 4*p2*SOC^3 + ... ; % 导数表达式
Q和R矩阵需要通过实验数据优化:
matlab复制Q = diag([1e-6 1e-5 1e-5]); % SOC和极化电压的过程噪声
R = 1e-4; % 电压测量噪声
现象:车辆熄火后重启时SOC初始化误差可达20%
解决方案:
建立参数随温度变化的二维查找表:
matlab复制R0 = interp2(Temp_table, SOC_table, R0_table, T, SOC);
引入容量衰减因子:
matlab复制Q_aged = Q_new*(1 - 0.5*(Cycle_count/2000)^1.2);
为应对电池参数时变特性,可采用带遗忘因子的递推最小二乘法在线更新参数:
matlab复制% 参数向量θ = [R0; R1; C1; R2; C2]
K = P*φ/(λ + φ'*P*φ); % λ为遗忘因子(0.95-0.99)
θ = θ + K*(Vmeas - φ'*θ);
P = (P - K*φ'*P)/λ;
实测数据显示,采用自适应EKF可将SOC估算误差长期控制在3%以内,而固定参数EKF在电池老化后误差可能超过8%。
推荐采用模块化设计架构:
在Simulink中调试时,建议先使用理想传感器数据验证算法正确性,再逐步加入噪声和干扰测试鲁棒性。一个常见的验证方法是人为设置初始SOC误差(如±20%),观察收敛速度和稳态误差。
我在实际项目中发现的几个关键点: