资讯详情

资讯详情

MATLAB 实现 EKF 电池 SOC 估计:从建模到仿真完整流程

最近刚全流程跟进了一个新能源甲醇增程船舶项目整船全部正向开发在联调的时候遇到了电池的问题所以就顺道介绍下相关知识欢迎大家共同探讨。SOCState of Charge荷电状态就是电池还剩多少电定义成当前可用容量和额定容量的比值数值落在 之间。BMS 里它几乎是一等公民续航显示、功率限制、过充过放保护全靠它。可麻烦在于电池内部没有直接传感器能读出 SOC你手上只有端子电压 、电流 和温度。SOC 只能从这几个量反推出来是个典型的状态估计问题。最朴素的反推是库仑积分把流进流出的电量累加。问题是电流传感器有零偏、有噪声积分误差会随时间越滚越大跑几千秒就能偏掉好几个百分点。要抑制这个漂移就得把电压模型拉进来做校正——这正好是扩展卡尔曼滤波EKF的活它一边用电流做库仑预测一边用电压残差把预测值往真实值拽。这篇文章不堆公式也不靠 Simscape Battery 点几下鼠标出结果而是用一个自写的二阶 RC 等效电路模型ECM造出带噪声的电压/电流真值再手搓一个 EKF 把 SOC 估回来。代码跑在 MATLAB 语法下全部可复现拷到任何一台机器上结果都一样。一、二阶 RC 等效电路模型与参数把电芯等效成一个开路电压源 一串阻容网络。一阶 RC 只够描述一种极化二阶 RC 能分开快、慢两路极化对脉冲、动态工况的拟合明显更好。本文用的电路是符号约定表示放电。所以放电时极化压降和欧姆压降都从开路电压里减掉电压随 SOC 下降而往下走。式中 是欧姆内阻上的瞬时压降 是两个极化电压分别对应快、慢两类电化学过程—— 来自电荷转移电极/电解液界面的双电层响应快、时间常数小 来自固相扩散锂离子在材料内部迁移响应慢、时间常数大。把两路分开脉冲放电后的电压回弹和长时弛豫就能同时被刻画。两个 RC 支路各自是一个一阶低通。以支路 1 为例连续域是 其中 。用零阶保持ZOH离散化到采样周期 后变成本文参数额定容量 5 Ah所以 1C 5 A参数真值地面真值用EKF 用的故意错一点含义5.0 Ah5.0 Ah容量0.020 Ω0.020 Ω欧姆内阻0.010 Ω / 1500 F0.010 Ω / 2200 F快极化真值 s滤波端 s0.006 Ω / 150 F0.006 Ω / 110 F慢极化真值 s滤波端 s1.0 s1.0 s采样周期0.05 A—电流传感器噪声5 mV—电压传感器噪声注意一个细节EKF 用的电阻和真值一致但两个时间常数都偏了一个 47%一个 −27%。这模拟的是现实里最常见的情形——HPPC 脉冲辨识得到的参数本来就有误差或者电芯已经轻度老化。电阻对了、时间常数错了这种偏差在恒流下几乎看不出来一到动态工况就露馅正好用来拷问算法的鲁棒性。开路电压 用一张单调查表表示NMC 风格SOC 越低电压越低。查表时Z必须升序否则interp1会给出错误结果function v ocv(z)Z [0 0.05 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.85 0.9 0.95 1];V [3.00 3.26 3.44 3.62 3.71 3.77 3.82 3.87 3.93 3.99 4.02 4.06 4.12 4.20];v interp1(Z, V, z, linear, extrap); % Z 必须升序end造真值的 plant 就是按上面的差分方程一步步滚function [vt, z, V1, V2] simECM(i, z0)N numel(i); z zeros(N,1); V1 z; V2 z; vt z;zk z0; x1 0; x2 0;for k 1:Nzk zk - i(k)*1.0/(3600*5.0); % 库仑计数x1 A1*x1 B1*i(k); % 快极化x2 A2*x2 B2*i(k); % 慢极化z(k)zk; V1(k)x1; V2(k)x2;vt(k) ocv(zk) - 0.020*i(k) - x1 - x2;endend二、造地面真值两种工况真值不能等于干净曲线否则看不出滤波器抗噪能力。真值电流要加 A 噪声真值电压要加 mV 噪声——这就是传感器看到的样子。5 mV 看着小但 OCV 曲线在 SOC 中段斜率只有约 0.6 V/单位 SOC换算成 SOC 误差就是每 5 mV 对应约 0.8%所以噪声直接决定了估计的下限。工况 A恒流 脉冲CC-pulse。一条 1C5 A恒流放电段接一段静置让极化自然衰减再叠 22 组8 秒 2C 脉冲 12 秒休息最后再来一段长恒流。总长 1100 秒。它的意义是专门把快/慢极化激活出来看 EKF 能不能把 跟住脉冲一来极化猛涨、电压下掉脉冲一停极化慢慢泄掉、电压回弹。工况 B动态工况DST / UDDS 风格。用一段 36 步、每步 10 秒的电流模板反复平铺 12 遍峰值 12 A≈2.4C还有 −5 A 的回馈制动充电。总长 4320 秒电流一直在变向、变率。这才是整车实际跑出来的负载长相——市区走走停停、高速急加速、刹车回收。构造思路MATLAB 伪代码% 工况A恒流脉冲cc [repmat(5,150,1); repmat(0,70,1)];for n 1:22, cc [cc; repmat(10,8,1); repmat(0,12,1)]; endcc [cc; repmat(0,60,1); repmat(5,300,1); repmat(0,80,1)];% 工况BDST风格模板平铺DST [0 0.8 0 -0.4 1.6 0 2.4 0 0.8 ... ]; % 单位 C正负代表放/充dyn repmat(DST*5, 12, 1); % *5A 转成电流平铺12圈三、EKF 怎么估 SOC状态向量取三个量是我们要的 是两个极化电压被一起估出来。预测步就是前面那套差分方程更新步靠端电压残差把预测拉回测量值。测量方程是它对状态是非线性的OCV 是查表所以 EKF 在每一步用数值差分把斜率 线性化这个 是整套算法的命门它告诉滤波器电压偏差有多少是 SOC 引起的、有多少是极化引起的。中段 SOC 斜率大电压对 SOC 敏感估计就准两端 SOC 接近满/空时 OCV 变平、斜率趋零 第一项塌掉SOC 就几乎不可观测——这也是为什么满电和空电附近 SOC 最难估。一个 EKF 步完整写成 MATLAB 函数function [x, P] ekfStep(x, P, i, y, Q, R)% 预测xp [ x(1) - i*1.0/(3600*5.0);A1f*x(2) B1f*i;A2f*x(3) B2f*i ];F diag([1, A1f, A2f]);Pp F*P*F Q;% 线性化 OCV 斜率s (ocv(xp(1)1e-4) - ocv(xp(1)-1e-4)) / 2e-4;h ocv(xp(1)) - R0f*i - xp(2) - xp(3);H [s, -1, -1];% 更新S H*Pp*H R;K Pp*H/S;e y - h;x xp K*e;x(1) min(max(x(1),0),1); % SOC 限幅到 [0,1]P (eye(3) - K*H)*Pp;end注意预测步里的 是用滤波端参数算的和真值不一致——这正是我们要测试的模型不准场景。卡尔曼增益 自动权衡信模型还是信测量模型协方差大、测量协方差小增益就高滤波器更听电压的话。四、初始化与 Q/R 整定EKF 启动最怕两件事初值给错、噪声协方差给错。本文故意把初始 SOC 设成 而真值是 先白送它 0.3 的偏差看滤波器多久能爬回来。这个设置很贴近真实上车冷启动那一刻你根本不知道电池到底剩多少电。协方差初值 要反映我对初值有多不确定。SOC 给 ±0.2、极化电压给 ±0.05/±0.04过程噪声 描述模型本身的不确定性。SOC 的库仑积分很准所以 给极小极化支路模型有误差给大一点测量噪声 直接由电压传感器定 mV所以整定经验先让 等于真实传感器方差再调 。 太小滤波器过于自信、跟不上极化变化动态工况下误差尖峰更高 太大则把噪声当真、SOC 抖得厉害、稳态方差下不来。上面这组在两种工况下都能既快收敛又稳。五、仿真结果恒流很美动态才见真章先把工况 A 跑出来。初始 0.3 的 SOC 偏差滤波器在大约91 秒内把估计值拉进 ±2% 带进入稳态后平均误差 0.21%95 分位 0.43%最大稳态误差不到 0.5%。把初值偏差吸收掉的那一下瞬时峰值到过 4.4%。曲线整体很乖误差带几乎贴着零线。再看工况 B。同一套滤波器、同一个错初值、同一组噪声稳态平均误差 0.10%看起来比恒流还干净。但在吸收初始偏差的那段动态过程里瞬时峰值冲到了8.1%——是恒流工况4.4%的将近两倍。而且在动态工况下电流频繁变向变率极化支路被反复拉扯滤波器得一直和模型误差搏斗误差分布明显更毛图上能看出一段段随电流跳变而甩出的尖刺。读这两张图有个窍门上半部分是 SOC 真值虚线和 EKF 估计实线几乎贴在一起光看上半幅你甚至会觉得两种工况都估得不错真正的故事在下半幅的误差曲线里。CC-pulse 的误差很快压进 ±2% 且基本不反弹动态工况的误差虽然均值也小但会随每一次电流跳变甩出尖刺这些尖刺才是算法在动态负载下吃力的证据。图里那条浅色带是滤波器自己给出的 置信区间由协方差 开方得到——它代表滤波器对自己有多不确定区间越宽说明当前越难估。为了把话说死又补了一条纯 5 A 恒流的极端对照它收敛后稳态误差只有 0.10%曲线平得像尺子画的。这就是为什么很多人 Demo 里只用恒流——它永远漂亮截图发出来谁看了都说好。核心结论恒流工况下 EKF 表现很好但参考价值有限动态工况才暴露算法的鲁棒性。具体数字摆在这纯恒流 5 A稳态 ≤0.15%曲线极其平稳CC-pulse收敛 ~91 s稳态均值 0.21%峰值 4.4%动态 DST 风格收敛 ~84 s稳态均值 0.10%但峰值8.1%2× 恒流。平均误差大家都小可真实的 BMS 关心的是最坏情况过放保护要是信了那 8% 的瞬时偏差续航就会跳变、功率限制会误触发。恒流验证只给你一条好看的线让你误以为算法成了。只有把动态工况甩上去才能看见误差尖峰、看见滤波器在急加速和回馈制动间的手忙脚乱——那才是算法真实的鲁棒性。六、为什么不用 Simscape BatterySimscape Battery 当然能搭模型、出结果但本文刻意不用原因有三个。第一可复现Simscape 模型依赖工具箱版本和求解器设置换台机器、换个版本结果就飘自写 ECM EKF 是纯数学MATLAB 语法逐行对应 numpy 实现任何人跑出来都是同一组数。第二透明每一个系数、每一步线性化你都看得见调参时知道改的是哪根弦。第三轻一个.m文件、几百行不占 license、不卡机器适合嵌进 CI 做回归测试。教学和理解手搓永远比拖模块来得实在。七、温度与老化参数会漂移上面的滤波端时间常数偏了还不是最狠的。温度一降电解液电导率掉、 全涨OCV 曲线也整体挪动循环老化后容量 缩水、内阻翻倍。这些漂移会让真值模型和滤波模型越离越远动态工况下的误差尖峰会进一步抬高。实战里要定期用满充放空或脉冲辨识把参数刷新一遍或者把温度、SOH 也并进状态向量一起估——那是下一篇的话题
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →