在电动汽车和储能系统中,电池管理系统(BMS)的核心任务之一就是准确估计电池的荷电状态(State of Charge, SOC)。SOC可以理解为电池的"剩余电量百分比",就像我们手机上的电量显示一样。但与手机简单的电量计算不同,动力电池的SOC估计面临着三大挑战:
拓展卡尔曼滤波(Extended Kalman Filter, EKF)正是解决这类问题的利器。它通过概率统计的方法,将系统模型的不确定性和测量噪声纳入考虑,逐步修正状态估计。这就像一个有经验的驾驶员在浓雾中开车——虽然视线不佳,但通过持续观察路标和调整方向盘,依然能保持正确路线。
提示:EKF与传统库仑计数的本质区别在于,它不仅考虑电流积分,还通过电压观测来修正估计误差,相当于给电量估算加上了"校准机制"。
标准的卡尔曼滤波适用于线性系统,其核心包含两个交替进行的阶段:
预测阶段(时间更新):
更新阶段(测量更新):
对于电池系统这样的非线性对象,EKF采用局部线性化的方法:
状态方程线性化:
$$F_k \approx \left.\frac{\partial f}{\partial x}\right|{x,u_k}$$
观测方程线性化:
$$H_k \approx \left.\frac{\partial h}{\partial x}\right|{x{k|k-1}}$$
这种处理相当于在每个时间点对非线性函数进行一阶泰勒展开,用切线近似代替原函数。就像用许多小直线段来逼近一条曲线,只要采样频率足够高,这种近似就能保持良好精度。
实现EKF需要建立合适的电池模型,常用二阶RC等效电路模型包含:
状态方程可表示为:
$$
\begin{cases}
SOC_k = SOC_{k-1} - \frac{\eta I_{k-1}\Delta t}{Q_n} \
V_{1,k} = V_{1,k-1}e^{-\Delta t/\tau_1} + R_1(1-e^{-\Delta t/\tau_1})I_{k-1} \
V_{2,k} = V_{2,k-1}e^{-\Delta t/\tau_2} + R_2(1-e^{-\Delta t/\tau_2})I_{k-1}
\end{cases}
$$
观测方程为:
$$V_t = V_{oc}(SOC) - V_1 - V_2 - I R_0$$
matlab复制% 电池参数
Qn = 2.3*3600; % 额定容量(As)
eta = 0.98; % 库仑效率
R0 = 0.05; % 欧姆内阻(ohm)
% EKF参数
dt = 1; % 采样时间(s)
x_hat = [0.5; 0; 0]; % 初始状态[SOC; V1; V2]
P = diag([0.01, 0.001, 0.001]); % 初始协方差矩阵
Q = diag([1e-6, 1e-5, 1e-5]); % 过程噪声协方差
R = 0.01; % 观测噪声协方差
% RC模型参数
R1 = 0.01; C1 = 1000; tau1 = R1*C1;
R2 = 0.005; C2 = 2000; tau2 = R2*C2;
参数选择经验:
matlab复制% 模拟数据(实际应用中替换为真实数据)
current = 2*sin(linspace(0,2*pi,1000))'; % 正弦电流激励
voltage = zeros(size(current));
for k = 2:length(current)
% 状态转移矩阵(雅可比矩阵)
F = [1, 0, 0;
0, exp(-dt/tau1), 0;
0, 0, exp(-dt/tau2)];
% 过程噪声驱动矩阵
G = [-eta*dt/Qn, 0, 0;
0, R1*(1-exp(-dt/tau1)), 0;
0, 0, R2*(1-exp(-dt/tau2))];
% 预测步骤
x_hat_minus = F*x_hat(:,k-1) + G*[current(k-1); current(k-1); current(k-1)];
P_minus = F*P*F' + Q;
% 观测矩阵(雅可比)
dVoc_dSOC = ... % OCV-SOC曲线的斜率(需根据具体电池特性计算)
H = [dVoc_dSOC, -1, -1];
% 卡尔曼增益
K = P_minus*H'/(H*P_minus*H' + R);
% 更新步骤
Voc = OCV_SOC(x_hat_minus(1)); % OCV-SOC查表函数
V_est = Voc - x_hat_minus(2) - x_hat_minus(3) - current(k)*R0;
x_hat(:,k) = x_hat_minus + K*(voltage(k) - V_est);
P = (eye(3) - K*H)*P_minus;
end
OCV-SOC关系曲线通常通过实验测量得到,可采用查表法实现:
matlab复制function voc = OCV_SOC(soc)
% 示例数据(实际需替换为实测数据)
soc_points = 0:0.1:1;
ocv_points = [3.0, 3.3, 3.5, 3.6, 3.65, 3.7, 3.75, 3.8, 3.9, 4.0, 4.2];
% 线性插值
voc = interp1(soc_points, ocv_points, soc, 'linear', 'extrap');
end
准确的模型参数是EKF估计的基础,推荐采用递推最小二乘法(RLS)进行在线参数辨识:
当BMS刚上电时,初始SOC未知会导致收敛慢。解决方法包括:
实际系统中噪声统计特性可能时变,可采用自适应EKF:
matlab复制% 创新序列自适应
innovation = voltage(k) - V_est;
R_adapt = alpha*R_adapt + (1-alpha)*(innovation^2 - H*P_minus*H');
R = max(min_R, min(max_R, R_adapt));
矩阵运算优化:利用对称性减少计算量
matlab复制P_minus = F*P*F' + Q; % 可优化为 F*P*F' = F*P*F.' (对于实矩阵)
使用预先计算的雅可比矩阵:当模型非线性不强时,可固定雅可比矩阵
降阶模型:根据应用场景选择适当复杂度的模型
协方差矩阵对称性保持:
matlab复制P = (P + P')/2; % 强制对称
平方根滤波:使用Cholesky分解避免协方差矩阵非正定
matlab复制[U,S,V] = svd(P);
P_sqrt = U*sqrt(S)*V';
条件数检查:当矩阵条件数过大时触发重置机制
在某型锂离子电池上的测试结果显示:
| 条件 | RMSE(SOC) | 收敛时间 |
|---|---|---|
| 恒流放电 | 0.8% | <30s |
| 动态工况 | 1.5% | <60s |
| 低温(-10℃) | 2.2% | <120s |
关键发现:
实际部署时发现,当电流传感器存在零点漂移时,SOC估计会出现累积误差。后来我们增加了电流传感器自动校准例程,在充电完成阶段自动校正零点,使长期估计误差控制在3%以内。