荷电状态(State of Charge, SOC)是描述电池剩余电量的核心参数,定义为当前剩余容量与额定容量的比值。准确估计SOC对电池管理系统(BMS)至关重要,直接影响:
SOC无法直接测量,必须通过电压、电流、温度等间接参数进行估算。传统方法如安时积分法存在累积误差,而基于模型的方法如卡尔曼滤波能显著提高精度。
卡尔曼滤波算法主要分为三类:
UKF相比EKF的优势在于:
我们采用的电池模型结构如下:
code复制[OCV]--[R0]--+--[R1]--[C1]--+
| |
+--[R2]--[C2]--+
模型参数包括:
实际工程中,这些参数需要通过脉冲充放电实验进行辨识,且会随温度、老化程度变化。
UKF需要设置的初始参数及其物理意义:
matlab复制x = 0.8; % 初始SOC估计值(通常取中间值)
P = 0.1; % 状态协方差(反映初始估计的不确定性)
Q = 1e-5; % 过程噪声协方差(模型误差)
R = 1e-4; % 观测噪声协方差(传感器误差)
alpha = 1e-3; % 控制Sigma点分布范围
kappa = 0; % 次级缩放参数(通常设为0)
beta = 2; % 包含高阶信息的参数(高斯分布取2)
参数选择经验:
Sigma点生成是UKF的核心步骤,其数学原理是:
code复制λ = α²(n+κ) - n
X₀ = x
Xᵢ = x + √((n+λ)P)ᵢ i=1,...,n
Xᵢ₊ₙ = x - √((n+λ)P)ᵢ i=1,...,n
Matlab实现:
matlab复制function [X] = generate_sigma_points(x, P, lambda)
n = length(x);
sqrtP = chol((n + lambda)*P)'; % Cholesky分解
X = [x, x*ones(1,n)+sqrtP, x*ones(1,n)-sqrtP];
end
实际工程中需要添加正则化处理防止矩阵非正定:
matlab复制P = P + eye(size(P))*1e-6; % 添加小量对角矩阵
时间更新包含三个关键操作:
matlab复制X_pred = zeros(size(X));
for i = 1:size(X,2)
X_pred(:,i) = X(:,i) - (current*dt)/capacity; % 库仑计数
end
matlab复制w_m = [lambda/(n+lambda), 0.5/(n+lambda)*ones(1,2*n)]; % 均值权重
w_c = w_m;
w_c(1) = w_c(1) + (1 - alpha^2 + beta); % 协方差权重
x_pred = X_pred * w_m';
P_pred = (X_pred - x_pred) * diag(w_c) * (X_pred - x_pred)' + Q;
SOC_change = (current*dt)/(capacity*(1+0.003*(T-25)))SOC = SOC * (1 - self_discharge_rate*dt)effective_capacity = nominal_capacity * (1 - aging_factor)测量更新流程:
matlab复制Z_pred = arrayfun(@(soc) battery_model(soc, current, params), X_pred);
z_pred = Z_pred * w_m';
matlab复制Pzz = (Z_pred - z_pred) * diag(w_c) * (Z_pred - z_pred)' + R;
Pxz = (X_pred - x_pred) * diag(w_c) * (Z_pred - z_pred)';
matlab复制K = Pxz / Pzz; % 卡尔曼增益
x = x_pred + K*(V_meas - z_pred);
P = P_pred - K*Pzz*K';
% SOC取值范围约束
x = max(0, min(1, x));
实测技巧:当电流接近零时,可以暂时切换到开路电压法修正SOC,避免累积误差。
建议将UKF实现为Matlab类:
matlab复制classdef UKF_SOC_Estimator
properties
x; P; Q; R; alpha; kappa; beta; lambda;
capacity; params; dt;
end
methods
function obj = UKF_SOC_Estimator(init_soc, capacity, params)
% 初始化代码...
end
function [soc, voltage] = update(obj, current, voltage_meas)
% 完整UKF流程...
end
end
end
使用示例:
matlab复制params = struct('R0',0.01,'R1',0.005,'C1',2000,'R2',0.01,'C2',50000);
estimator = UKF_SOC_Estimator(0.8, 50, params); % 50Ah电池
while true
[soc, v_est] = estimator.update(current, voltage_meas);
% 记录或显示结果...
end
matlab复制% 替代arrayfun的方案
OCV = 3.7 + 0.6*(1-X_pred);
Z_pred = OCV - current*(params.R0)...
- params.R1*current*exp(-1./(params.R1*params.C1))...
- params.R2*current*exp(-1./(params.R2*params.C2));
matlab复制% 初始化时
soc_table = 0:0.01:1;
ocv_table = 3.7 + 0.6*(1-soc_table);
% 使用时
ocv = interp1(soc_table, ocv_table, soc);
基础UKF的固定噪声协方差可能不适应所有工况,可改进为:
matlab复制% 根据电流变化调整Q
if abs(current) > 0.1*max_current
Q = 1e-4;
else
Q = 1e-6;
end
% 根据电压残差调整R
residual = abs(V_meas - z_pred);
if residual > 0.1
R = 1e-3;
else
R = 1e-4;
end
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| SOC估计值震荡 | Q过大或R过小 | 减小Q或增大R |
| SOC响应迟缓 | Q过小或R过大 | 增大Q或减小R |
| SOC漂移 | 模型不准或电流测量误差 | 校准传感器,改进模型 |
| 数值不稳定 | 协方差矩阵不正定 | 添加正则化项 |
关键可视化图表:
matlab复制figure;
subplot(2,1,1);
plot(time, soc_est, 'b', time, soc_true, 'r--');
legend('Estimated','True');
subplot(2,1,2);
plot(time, voltage_est, 'g', time, voltage_meas, 'k.');
legend('Model','Measured');
调试时重点关注:
matlab复制if current > 0 % 放电
OCV = discharge_ocv_table(soc);
else % 充电
OCV = charge_ocv_table(soc);
end
matlab复制function params = online_parameter_estimation(params, voltage, current, soc)
% 使用递归最小二乘法在线更新R0,R1,C1等参数
% ...
end
matlab复制R0 = R0_25C * (1 + 0.01*(T - 25));
capacity = capacity_25C * (1 - 0.005*(T - 25));
matlab复制x = [soc; T]; % 状态向量扩展为SOC和温度
将健康状态(SOH)纳入状态向量:
matlab复制x = [soc; capacity_fade]; % 容量衰减作为状态
状态方程扩展为:
matlab复制soc(k+1) = soc(k) - (current*dt)/capacity_fade(k);
capacity_fade(k+1) = capacity_fade(k) + process_noise;
实现SOC和SOH的同步跟踪。