1. 项目背景与核心价值
去年参与某新能源车企的BMS系统开发时,我们团队在电池SOC(State of Charge)估算精度上栽了大跟头。传统安时积分法在复杂工况下误差最高达到15%,导致车辆续航显示出现"跳崖式"下降。这段经历让我深刻认识到:精确的SOC估计不仅是BMS的"大脑",更是消除用户里程焦虑的关键技术。
EKF(扩展卡尔曼滤波)和UKF(无迹卡尔曼滤波)作为两种主流的非线性滤波算法,在动力电池状态估计领域展现出独特优势。与实验室常用的开路电压法相比,它们能实时融合多源传感器数据,在车辆急加速、低温冷启动等动态工况下仍保持3%以内的估算误差。更难得的是,这些算法可以直接嵌入Simulink环境,通过自动代码生成技术部署到量产车型的MCU中。
2. 系统建模与算法选型
2.1 电池等效电路模型构建
在Simulink中搭建的二阶RC等效电路模型,其核心参数通过HPPC(混合脉冲功率特性)测试获取。以宁德时代NCM811电池为例,模型包含:
- 开路电压OCV-SOC关系曲线(通过1/20C倍率充放电测试获得)
- 欧姆内阻R0(通过10s脉冲放电前后的电压突变计算)
- 极化电阻R1/R2和极化电容C1/C2(通过脉冲结束后的弛豫曲线拟合)
关键技巧:OCV-SOC曲线必须进行温度补偿,我们在-10℃~45℃范围内每5℃间隔测试一组数据,最终建立三维查找表。
2.2 EKF算法实现细节
状态方程和观测方程构建是EKF的核心。对于SOC估计:
code复制状态向量 X = [SOC, Up1, Up2]^T
观测方程 Y = U_terminal = OCV(SOC) - I*R0 - Up1 - Up2
其中Up1/Up2代表两个RC回路的极化电压。雅可比矩阵计算采用中心差分法避免解析求导的复杂性,具体实现时:
matlab复制function [A, C] = jacobian(x, u)
delta = 1e-6;
A = zeros(3,3);
for i=1:3
x_plus = x; x_plus(i) = x_plus(i) + delta;
x_minus = x; x_minus(i) = x_minus(i) - delta;
A(:,i) = (state_eq(x_plus,u) - state_eq(x_minus,u))/(2*delta);
end
C = (observe_eq(x+delta,u) - observe_eq(x-delta,u))/(2*delta);
end
2.3 UKF算法优势解析
UKF通过sigma点采样避免了EKF的线性化误差,特别适合OCV-SOC曲线存在平台区的磷酸铁锂电池。我们对比发现:
- 在SOC 30%~70%区间,EKF最大误差4.2%,UKF仅2.1%
- 计算耗时方面,UKF比EKF增加约15%(在STM32H743上实测)
- 内存占用:EKF需存储3x3协方差矩阵,UKF需要3x7的sigma点矩阵
3. Simulink仿真架构设计
3.1 多速率系统实现
考虑到BMS实际运行需求,模型采用分层采样策略:
- 电流电压采样:100ms周期(对应BMS硬件ADC的采样能力)
- SOC估算:1s周期(满足ISO 26262 ASIL-C等级的计算时间裕度)
- 充电控制:10s周期(适应充电桩通信延迟)
在Simulink中使用Rate Transition模块处理跨速率数据传递,关键配置参数:
matlab复制set_param('BMS_Model/UKF_Estimator', 'SystemSampleTime', '1');
set_param('BMS_Model/Current_Sensor', 'SampleTime', '0.1');
3.2 闭环验证场景设计
为验证算法鲁棒性,我们构建了包含以下工况的测试场景:
- 城市道路工况:UDDS循环+随机停车(验证怠速时的SOC回滞效应)
- 高速工况:连续120km/h巡航+紧急制动(测试大电流冲击下的稳定性)
- 低温场景:-20℃环境温度+大功率快充(考验温度补偿效果)
避坑指南:仿真时必须考虑传感器噪声,我们在电压测量通道添加了±10mV的白噪声,电流通道添加了±0.5A的偏置误差。
4. 充电控制策略优化
4.1 多阶段充电曲线生成
基于SOC估计结果动态调整CC-CV充电参数:
- 恒流阶段:0%~80% SOC区间,充电电流按I_max = min(1C, (T_max-T_cell)/R_th)动态限制
- 恒压阶段:当SOC>80%时,电压控制在4.2V±50mV,电流按I(t)=I_0*exp(-kt)衰减
- 均衡触发条件:单体电压差>30mV且SOC差>5%时启动主动均衡
4.2 故障安全机制
在Stateflow中实现的故障树包含:
matlab复制state Charging_Safety:
on SOC > 95% and V_cell > 4.25V:
enter Overcharge_Protection
on T_cell > 45degC and dT/dt > 1degC/min:
enter Thermal_Runaway_Prevention
on abs(I_charge - I_cmd) > 5A for 3s:
enter Current_Sensor_Fault
5. 硬件在环验证
通过dSPACE SCALEXIO系统进行HIL测试时,发现了几个关键问题:
- 离散化导致的数值震荡:将欧拉积分步长从1ms调整为0.1ms后消除
- CAN通信延迟:在CCP标定协议中增加时间戳补偿
- 量化误差:将ADC分辨率从12bit提升到16bit后,SOC跳变现象消失
实测数据对比:
| 测试场景 | EKF误差(%) | UKF误差(%) | 安时积分法误差(%) |
|---|---|---|---|
| NEDC循环 | 2.1 | 1.7 | 8.3 |
| 快充30%-80% | 3.8 | 2.4 | 12.5 |
| -10℃冷启动 | 4.5 | 3.1 | 18.2 |
6. 工程化落地经验
在量产项目中,我们总结出几条黄金准则:
- 参数辨识必须用实车数据:实验室测得的RC参数在真实振动环境下会漂移约15%
- 内存优化技巧:将UKF的sigma点计算从双精度改为单精度,节省40% RAM占用
- 实时性保障:在STM32上采用CMSIS-DSP库加速矩阵运算,使UKF迭代时间控制在8ms以内
有个特别值得分享的案例:某车型在颠簸路面出现SOC突变,最终发现是电流传感器安装位置共振导致采样异常。解决方案是在算法中增加加速度计数据作为观测变量,构建了带振动补偿的扩展状态方程。
