1. 项目背景与核心挑战
动力电池的荷电状态(State of Charge, SOC)估算是电池管理系统的核心技术难点之一。就像燃油车的油量表一样,SOC直接决定了电动汽车的续航里程显示准确性。但不同于机械式油量计,锂电池的SOC无法通过物理传感器直接测量,必须通过电压、电流、温度等间接参数进行估算。
在实际工程中,SOC估算面临三大核心挑战:
- 非线性特性:锂电池的充放电曲线存在明显的电压平台区,传统线性模型难以准确描述
- 噪声干扰:车载环境下的电流采样存在高频噪声,电压测量受极化效应影响
- 时变参数:电池内阻、容量等参数会随老化程度发生变化
我们团队在新能源汽车电池管理系统开发中,对比测试了安时积分法、扩展卡尔曼滤波(EKF)和无迹卡尔曼滤波(UKF)三种典型算法。实测数据显示,在-20℃低温工况下,单纯使用安时积分法会导致累计误差超过15%,而融合算法能将误差控制在3%以内。
2. 算法原理深度解析
2.1 安时积分法的数学本质
安时积分法的核心公式看似简单:
code复制SOC(t) = SOC(t0) + (1/Cn) ∫ηI(t)dt
其中Cn为额定容量,η为库伦效率。但在实际应用中需要处理三个关键问题:
- 初始SOC校准:我们通过在静置2小时后读取开路电压OCV,结合电池厂提供的OCV-SOC查表数据实现初始化
- 容量衰减补偿:每50次完整循环后,通过满充容量测试更新Cn值
- 电流积分误差:采用TI的BQ76940芯片实现16位ADC采样,配合50Hz的IIR数字滤波器
实测发现,当电流传感器存在0.5%的偏移误差时,经过8小时运行会导致SOC估算产生4.2%的偏差。这凸显了纯积分法的局限性。
2.2 EKF算法的实现细节
扩展卡尔曼滤波通过状态空间模型处理非线性问题。我们建立的二阶RC等效电路模型包含:
- 状态变量:SOC、V1(浓差极化电压)、V2(电化学极化电压)
- 观测方程:Vt = OCV(SOC) + IR0 + V1 + V2 + noise
雅可比矩阵的计算采用中心差分法:
matlab复制function [A, C] = jacobian(x, u)
h = 1e-6; % 微分量
A = zeros(3,3);
for i = 1:3
dx = zeros(3,1);
dx(i) = h;
A(:,i) = (state_eq(x+dx,u) - state_eq(x-dx,u))/(2*h);
end
C = (output_eq(x+h,u) - output_eq(x-h,u))/(2*h);
end
2.3 UKF算法的改进之处
无迹变换(UT)通过sigma点采样避免雅可比矩阵计算。我们采用比例修正对称采样策略,关键参数设置如下:
- α=0.01(控制采样点分布)
- β=2(最优高斯分布假设)
- κ=0(默认参数)
UKF的预测步骤包含:
matlab复制% Sigma点生成
[sigma, Wm, Wc] = ut_sigma_points(x, P, alpha, beta, kappa);
% 状态预测
X_pred = zeros(n, 2*n+1);
for k = 1:2*n+1
X_pred(:,k) = state_eq(sigma(:,k), u);
end
x_pred = X_pred * Wm';
% 协方差预测
P_pred = zeros(n,n);
for k = 1:2*n+1
P_pred = P_pred + Wc(k)*(X_pred(:,k)-x_pred)*(X_pred(:,k)-x_pred)';
end
P_pred = P_pred + Q;
3. Matlab实现关键代码
3.1 数据预处理模块
matlab复制function [volt, curr, temp, time] = data_preprocess(rawData)
% 野值剔除
volt = medfilt1(rawData.Voltage, 5);
curr = movmean(rawData.Current, [2 2]);
temp = filloutliers(rawData.Temperature, 'linear');
% 时间对齐
time = rawData.Time;
[volt, curr, temp] = align_time(volt, curr, temp, time);
% 温度补偿
R0 = 0.05*(1 + 0.008*(temp-25)); % 内阻温度系数
end
3.2 安时积分法实现
matlab复制function soc = ah_integrator(curr, time, Cn, eta, soc_init)
dt = diff(time);
soc = zeros(size(curr));
soc(1) = soc_init;
for k = 2:length(curr)
soc(k) = soc(k-1) + eta(k)*curr(k)*dt(k-1)/Cn/3600;
soc(k) = min(max(soc(k), 0), 1); % 边界约束
end
end
3.3 EKF核心算法
matlab复制function [x_est, P_est] = ekf_step(x_prev, P_prev, u, y, Q, R)
% 预测步骤
[x_pred, A] = state_eq_jacobian(x_prev, u);
P_pred = A * P_prev * A' + Q;
% 更新步骤
[y_pred, C] = output_eq_jacobian(x_pred, u);
K = P_pred * C' / (C * P_pred * C' + R);
x_est = x_pred + K * (y - y_pred);
P_est = (eye(size(P_pred)) - K*C) * P_pred;
end
4. 实测效果对比分析
我们在恒温25℃条件下,使用LG 18650电池进行测试,对比三种算法在UDDS工况下的表现:
| 算法类型 | 最大误差 | RMSE | 计算耗时(ms) |
|---|---|---|---|
| 安时积分 | 8.7% | 4.2% | 0.12 |
| EKF | 3.1% | 1.8% | 1.45 |
| UKF | 2.4% | 1.2% | 2.87 |
在低温-10℃测试中,UKF展现出更好的鲁棒性:
- 安时积分误差增大到15.2%
- EKF误差波动范围±5%
- UKF仍能保持±3%的精度
5. 工程实践中的经验总结
-
采样频率选择:
- 电流采样建议≥100Hz
- 电压采样≥10Hz即可
- SOC输出频率1Hz足够
-
参数辨识技巧:
matlab复制% 脉冲放电法辨识RC参数 pulse_idx = find(diff(curr) > 0.5*max(curr)); V_decay = volt(pulse_idx(1):pulse_idx(1)+100); tau = lsqcurvefit(@(x,t) x(1)*exp(-t/x(2)), [1 50], 1:100, V_decay); R1 = tau(1)/abs(curr(pulse_idx(1))); C1 = tau(2)/R1; -
内存优化方案:
- UKF的sigma点数量随状态维度平方增长
- 对于嵌入式系统,可采用降维处理:
- 将SOC与极化电压解耦
- 对RC网络使用等效单时间常数模型
-
故障诊断集成:
matlab复制function flag = sanity_check(soc, volt, curr) flag = true; if soc > 1 && volt < 3.0 % 过放警告 flag = false; elseif soc < 0 && curr > 0 % 充电状态SOC为负 flag = false; end end
在实际车载项目中,我们最终采用EKF作为主算法,UKF用于周期性校准。这种混合架构在STM32F407上仅消耗15%的CPU资源,满足ASIL-C功能安全要求。