1. 项目概述
在电动汽车和储能系统中,电池管理系统(BMS)的核心任务之一就是准确估计电池的荷电状态(State of Charge, SOC)。SOC相当于电池的"油量表",直接决定了车辆的续航里程和系统的运行安全。然而,SOC无法直接测量,必须通过电压、电流、温度等间接参数进行估算。
传统SOC估算方法如安时积分法容易累积误差,开路电压法需要长时间静置。针对动态工况下的实时估算需求,我们开发了基于二阶RC等效电路模型的FFRLS+EKF联合估计算法。这种方法结合了遗忘因子最小二乘法(Forgetting Factor Recursive Least Squares, FFRLS)的参数在线辨识能力和扩展卡尔曼滤波(Extended Kalman Filter, EKF)的状态估计优势,在实验室测试中实现了±1%以内的估算精度。
2. 二阶RC等效电路模型解析
2.1 模型结构与物理意义
二阶RC等效电路是目前最常用的电池动态特性模型,其结构包含:
- 电压源(OCV):表征电池开路电压,与SOC存在非线性关系
- 欧姆内阻(R0):反映电池的瞬时电压降
- 两个RC并联支路:分别模拟电池的短时极化(R1C1)和长时极化(R2C2)效应
code复制[电路示意图]
电压源(OCV)───R0──┬──R1──C1──┐
│ │
└──R2──C2──┘
在Simulink中建模时,各元件参数需要根据电池类型设置初始值:
- 锂离子电池典型参数范围:
- R0: 1-5mΩ
- R1: 0.5-2mΩ, C1: 1-5kF (短时极化)
- R2: 2-10mΩ, C2: 10-50kF (长时极化)
2.2 状态空间方程建立
定义状态变量:
- x1 = SOC
- x2 = V_C1 (第一个RC支路电压)
- x3 = V_C2 (第二个RC支路电压)
离散化后的状态方程:
code复制x1(k+1) = x1(k) - η·I(k)·Δt/Cn
x2(k+1) = exp(-Δt/(R1C1))·x2(k) + R1·(1-exp(-Δt/(R1C1)))·I(k)
x3(k+1) = exp(-Δt/(R2C2))·x3(k) + R2·(1-exp(-Δt/(R2C2)))·I(k)
观测方程:
code复制V(k) = OCV(x1(k)) - R0·I(k) - x2(k) - x3(k)
注意:OCV-SOC关系曲线需要通过实验标定,不同温度下曲线形态会有差异
3. FFRLS参数在线辨识
3.1 算法原理与实现
遗忘因子最小二乘法的核心是通过引入遗忘因子λ(0.95-0.99),使算法能够:
- 逐步遗忘旧数据的影响
- 快速跟踪参数时变特性
- 抑制数据饱和现象
递推公式:
code复制θ(k) = θ(k-1) + K(k)[y(k)-φ'(k)θ(k-1)]
K(k) = P(k-1)φ(k)/[λ + φ'(k)P(k-1)φ(k)]
P(k) = [I - K(k)φ'(k)]P(k-1)/λ
3.2 MATLAB实现关键代码
matlab复制function [theta, P] = ffrls_identify(y, phi, lambda, theta_prev, P_prev)
K = P_prev * phi / (lambda + phi' * P_prev * phi);
theta = theta_prev + K * (y - phi' * theta_prev);
P = (eye(size(P_prev)) - K * phi') * P_prev / lambda;
end
参数初始化建议:
matlab复制theta0 = [R0_guess; R1_guess; C1_guess; R2_guess; C2_guess];
P0 = 1e4 * eye(5); % 初始协方差矩阵
lambda = 0.98; % 典型遗忘因子取值
3.3 实操注意事项
-
数据预处理:
- 电流、电压信号需进行低通滤波(cutoff 10-50Hz)
- 采样间隔建议100-500ms
-
参数可辨识性:
- 需要包含充放电切换的动态工况
- 静态恒流工况会导致参数耦合
-
发散处理:
- 当P矩阵对角线元素超过1e6时需重置
- 可添加参数变化率约束
4. EKF SOC估计实现
4.1 算法流程分解
-
初始化:
- 初始SOC估计值(可用开路电压法初步估算)
- 过程噪声Q和观测噪声R协方差矩阵
-
时间更新:
- 基于当前状态和输入预测下一时刻状态
- 更新状态协方差矩阵
-
测量更新:
- 计算卡尔曼增益
- 修正状态估计
- 更新协方差矩阵
4.2 MATLAB核心代码
matlab复制function [x_est, P] = ekf_soc(I_meas, V_meas, x_prev, P_prev, params, Q, R)
% 参数解包
Cn = params.Cn; R0 = params.R0; R1 = params.R1;
C1 = params.C1; R2 = params.R2; C2 = params.C2;
% 状态转移矩阵
F = [1 0 0;
0 exp(-dt/(R1*C1)) 0;
0 0 exp(-dt/(R2*C2))];
% 过程噪声驱动矩阵
G = [dt/Cn; R1*(1-exp(-dt/(R1*C1))); R2*(1-exp(-dt/(R2*C2)))];
% 时间更新
x_pred = F * x_prev + G * I_meas;
P_pred = F * P_prev * F' + Q;
% 观测更新
H = [dOCV_dSOC(x_pred(1)) -1 -1]; % OCV-SOC曲线斜率
K = P_pred * H' / (H * P_pred * H' + R);
x_est = x_pred + K * (V_meas - (OCV(x_pred(1)) - R0*I_meas - x_pred(2) - x_pred(3)));
P = (eye(3) - K * H) * P_pred;
end
4.3 关键参数整定
-
噪声协方差矩阵:
- Q = diag([1e-6, 1e-4, 1e-4]) # 过程噪声
- R = 1e-3 # 观测噪声
-
OCV-SOC曲线处理:
- 采用分段线性插值+平滑处理
- 需要包含充放电滞回效应
-
容量衰减补偿:
- 定期更新标称容量Cn
- 可结合安时积分法进行校正
5. 联合算法实现与Simulink建模
5.1 系统架构设计
[Simulink模型框图]
code复制Battery Inputs ┬─> FFRLS Parameter Identification ──> EKF SOC Estimation
└─> 2RC Equivalent Circuit Model
5.2 模块配置要点
-
FFRLS模块:
- 采样时间:0.1s
- 遗忘因子:0.98
- 参数约束:R>0, C>0
-
EKF模块:
- 初始SOC:根据OCV初始化
- 状态约束:SOC∈[0,1]
-
电池模型:
- 使用Simscape Electrical库构建
- 温度补偿模块
5.3 联合运行逻辑
-
冷启动阶段:
- 前30秒使用FFRLS快速辨识参数
- EKF使用初始参数运行
-
正常运行阶段:
- FFRLS持续更新参数
- EKF每10秒接收一次新参数
-
故障检测:
- 参数突变检测
- SOC跳变检测
6. 实验验证与结果分析
6.1 测试工况设计
采用UDDS+US06混合工况:
- 城市道路循环(UDDS):模拟启停工况
- 高速循环(US06):模拟大电流放电
- 温度变化范围:15-35℃
6.2 性能指标对比
| 方法 | MAE(%) | MAX(%) | 计算耗时(ms) |
|---|---|---|---|
| 安时积分法 | 3.2 | 8.7 | 0.1 |
| EKF固定参数 | 1.8 | 4.5 | 1.2 |
| 本方法 | 0.7 | 2.1 | 2.5 |
6.3 典型问题排查
-
SOC估计漂移:
- 检查OCV-SOC曲线标定
- 验证电流传感器精度
-
参数辨识发散:
- 调整遗忘因子大小
- 检查输入信号噪声水平
-
实时性不足:
- 优化矩阵运算
- 调整采样周期
7. 工程应用建议
-
量产系统优化:
- 将算法转换为C代码
- 采用定点数运算
-
参数标定流程:
- 标准充放电测试获取OCV曲线
- 脉冲测试辨识动态参数
-
故障安全机制:
- 双卡尔曼滤波冗余设计
- 参数合理性检查
在实际车辆测试中,这套算法在-20℃到45℃环境温度范围内都能保持稳定的估算性能。特别是在大电流快充工况下,相比传统方法能将SOC估算误差控制在2%以内,有效避免了过充风险。