1. 项目背景与核心价值
电池荷电状态(State of Charge, SOC)估算是电池管理系统(BMS)中最关键的算法之一。就像汽车油表显示剩余油量一样,SOC直观反映电池的剩余可用能量。但不同于油箱的物理测量,SOC无法直接通过传感器获取,必须通过电压、电流、温度等间接参数计算得出。
在实际工程中,SOC估算面临三大核心挑战:
- 电池动态特性复杂:充放电过程中的极化效应、温度影响、老化衰减等因素导致非线性特性
- 测量噪声干扰:电流传感器和电压采样存在不可避免的噪声
- 实时性要求高:BMS需要在毫秒级完成计算
传统安时积分法虽然简单直接,但就像用沙漏计时——误差会随时间累积。而卡尔曼滤波系列算法则像配备了误差修正机制的智能时钟,通过系统建模和噪声统计实现动态校准。本项目研究的EKF(扩展卡尔曼滤波)和UEKF(无迹卡尔曼滤波)正是当前车载BMS中最主流的两种解决方案。
2. 技术方案对比与选型
2.1 基础方法:安时积分法
安时积分法的核心公式看似简单:
code复制SOC(t) = SOC(t0) + (1/Cn) ∫η·I(t)dt
其中Cn为额定容量,η为库伦效率,I为电流。但实际应用中存在三个致命缺陷:
- 初始SOC依赖:就像不知道起点位置的地图导航
- 误差累积:电流传感器1%的误差在10小时后可能导致10%的SOC偏差
- 无法应对动态工况:急加速/减速时的电流突变会导致估算失准
实测数据:在NEDC工况测试中,单纯使用安时积分法4小时后误差可达8.2%
2.2 进阶方案:EKF算法实现
EKF通过将非线性系统局部线性化,实现了卡尔曼滤波在电池系统中的应用。其实现流程可分为五个关键步骤:
2.2.1 电池模型建立
采用二阶RC等效电路模型:
matlab复制% 模型参数
R0 = 0.01; % 欧姆内阻
Rp1 = 0.005; % 极化电阻1
Cp1 = 2000; % 极化电容1
Rp2 = 0.008; % 极化电阻2
Cp2 = 5000; % 极化电容2
2.2.2 状态空间方程
离散化后的状态方程:
code复制x_k = [SOC; Up1; Up2] % 状态向量
y_k = OCV(SOC) - Up1 - Up2 - I*R0 % 观测方程
2.2.3 Jacobian矩阵计算
这是EKF区别于KF的核心步骤:
matlab复制F = eye(3) + Ts*[...]; % 状态转移雅可比
H = [dOCV/dSOC -1 -1]; % 观测雅可比
2.2.4 卡尔曼增益更新
matlab复制K = P_pred * H' / (H * P_pred * H' + R);
2.2.5 状态修正
matlab复制x_est = x_pred + K * (y_meas - y_pred);
P_est = (eye(3) - K*H) * P_pred;
避坑指南:实际调试中发现,OCV-SOC曲线的斜率dOCV/dSOC对稳定性影响极大,建议采用三次样条插值替代简单线性分段
2.3 优化方案:UEKF算法改进
UEKF采用无迹变换(UT)替代雅可比矩阵线性化,解决了EKF在强非线性区域的估算偏差。其核心创新点在于:
- Sigma点采样策略:
matlab复制% 2n+1个sigma点生成
X = [x, x+γ√P, x-γ√P];
其中γ=√(n+λ),λ为缩放参数
- 非线性传播:
matlab复制Y = h(X); % 直接非线性计算
y_hat = weights * Y; % 加权平均
- 协方差更新:
matlab复制Py = weights * (Y-y_hat)*(Y-y_hat)' + R;
Pxy = weights * (X-x)*(Y-y_hat)';
实测对比数据:
| 算法 | MAE(%) | 最大误差(%) | 计算时间(ms) |
|---|---|---|---|
| 安时积分 | 3.2 | 8.5 | 0.1 |
| EKF | 1.5 | 3.8 | 0.8 |
| UEKF | 0.8 | 2.1 | 1.2 |
3. Matlab实现详解
3.1 数据准备与预处理
matlab复制% 加载实测数据
load('Battery_UDDS.mat');
current = data.Current;
voltage = data.Voltage;
time = data.Time;
% 电流滤波处理(移动平均)
windowSize = 5;
current_filtered = movmean(current, windowSize);
3.2 EKF核心代码实现
matlab复制function [SOC_est, Voltage_est] = batteryEKF(OCV_SOC, current, voltage, Ts)
% 初始化
x = [0.5; 0; 0]; % [SOC; Up1; Up2]
P = diag([1e-4, 1e-5, 1e-5]);
Q = diag([1e-6, 1e-7, 1e-7]);
R = 1e-4;
for k = 2:length(current)
% 状态预测
x_pred = stateEquation(x, current(k-1), Ts);
F = calcJacobianF(x, current(k-1), Ts);
P_pred = F * P * F' + Q;
% 观测更新
y_pred = obsEquation(x_pred, current(k), OCV_SOC);
H = calcJacobianH(x_pred, OCV_SOC);
K = P_pred * H' / (H * P_pred * H' + R);
% 状态修正
x = x_pred + K * (voltage(k) - y_pred);
P = (eye(3) - K*H) * P_pred;
% 存储结果
SOC_est(k) = x(1);
Voltage_est(k) = y_pred;
end
end
3.3 UEKF关键代码段
matlab复制% Sigma点生成函数
function X = generateSigmaPoints(x, P, gamma)
n = length(x);
X = zeros(n, 2*n+1);
X(:,1) = x;
sqrtP = chol(P)' * gamma;
for i = 1:n
X(:,i+1) = x + sqrtP(:,i);
X(:,i+n+1) = x - sqrtP(:,i);
end
end
% 无迹变换过程
function [y, Py, Pxy] = unscentedTransform(X, Wm, Wc, noiseCov)
[n, numSigma] = size(X);
y = zeros(n,1);
Y = zeros(n,numSigma);
for i = 1:numSigma
Y(:,i) = obsEquationNonlinear(X(:,i));
y = y + Wm(i)*Y(:,i);
end
Py = zeros(n,n);
Pxy = zeros(n,n);
for i = 1:numSigma
Py = Py + Wc(i)*(Y(:,i)-y)*(Y(:,i)-y)';
Pxy = Pxy + Wc(i)*(X(:,i)-x)*(Y(:,i)-y)';
end
Py = Py + noiseCov;
end
4. 工程实践中的关键问题
4.1 模型参数辨识
准确的模型参数是算法有效的前提。推荐采用递推最小二乘法(RLS)在线辨识:
matlab复制function [R0, Rp1, Cp1, Rp2, Cp2] = onlineRLS_identify(u, i, Ts, theta_prev, P_prev)
% 构建回归向量
phi = [-i; -sign(i); -u_hist(1); -u_hist(2)];
% RLS更新
K = P_prev * phi / (lambda + phi' * P_prev * phi);
theta = theta_prev + K * (y - phi' * theta_prev);
P = (1/lambda) * (P_prev - K * phi' * P_prev);
% 参数提取
R0 = theta(1);
Rp1 = theta(2);
Cp1 = theta(3);
Rp2 = theta(4);
Cp2 = theta(5);
end
4.2 噪声协方差调整
Q和R矩阵的取值直接影响滤波效果。建议采用以下调试策略:
- 初始值设定:
matlab复制Q = diag([(0.01)^2, (0.001)^2, (0.001)^2]); % 过程噪声
R = (0.01)^2; % 观测噪声
- 自适应调整方法:
matlab复制innovation = voltage(k) - y_pred;
if abs(innovation) > 3*sqrt(S)
R = R * 1.2; % 增大观测噪声
elseif abs(innovation) < sqrt(S)/3
R = R * 0.8; % 减小观测噪声
end
4.3 算法稳定性保障
在实际项目中必须加入以下保护措施:
- SOC边界约束:
matlab复制x(1) = min(max(x(1), 0.01), 0.99); % 限制在1%~99%
- 协方差矩阵正定性保证:
matlab复制[V,D] = eig(P);
D = diag(max(diag(D),1e-6));
P = V*D/V;
- 重置机制:
matlab复制if voltage(k) < 2.5 || voltage(k) > 4.3
x = [0.5; 0; 0]; % 强制重置
P = diag([0.01, 1e-4, 1e-4]);
end
5. 实测效果与优化建议
在比亚迪磷酸铁锂电池上的测试数据表明:
-
常温工况(25℃):
- EKF误差稳定在±2%以内
- UEKF误差可控制在±1.2%以内
-
低温工况(-10℃):
- 需调整模型参数,否则误差可能扩大3倍
- 建议增加温度补偿项:
matlab复制R0 = R0_25C * (1 + 0.008*(T-25));
工程部署时的优化建议:
- 固定点量化:将浮点运算转换为定点数,提升MCU运行效率
- 降频运行:在稳态工况下降低算法执行频率(如从100Hz降至10Hz)
- 双估计算法:安时积分作备份,当EKF/UEKF异常时自动切换