4. 电池单体模型建立(二阶RC与PNGV模型)
做BMS开发这些年,我越来越觉得电池模型是整套算法的基石。模型不准,后面SOC估算、SOH评估全是空中楼阁。今天咱们就聊聊二阶RC模型和PNGV模型——这两个在工程中非常实用的模型。
4.1 二阶RC模型改进点
先说说一阶RC模型。说白了就是一个电阻串联一个RC并联环节。我刚开始做项目时也用过,但很快发现一个问题——它模拟电池动态特性不够细。电池在充放电切换时,电压响应其实有两个时间常数:一个快,一个慢。
二阶RC模型就是在原来基础上再加一个RC环节。你想想看,这样就能分别模拟电池的极化效应和扩散效应了。
二阶RC模型的改进点:
- 精度提升:电压预测误差从一阶的30-50mV降到10-20mV
- 动态响应更真实:能捕捉到电池在脉冲充放电时的双时间常数特性
- 参数辨识更灵活:两个RC环节可以分别对应不同频率下的阻抗特性
我在项目中遇到过一件事。有一次做某款三元锂电池的建模,一阶模型在低温下误差飙到80mV。换成二阶后,误差直接砍半。嗯,这里要注意——不是所有场景都需要二阶。如果只是做简单的SOC估算,一阶其实够用。
二阶RC模型的数学表达式是这样的:
Uocv = U + I*R0 + U1 + U2
其中:
dU1/dt = I/C1 - U1/(R1*C1)
dU2/dt = I/C2 - U2/(R2*C2)
Uocv:开路电压
U:端电压
I:电流(放电为正)
R0:欧姆内阻
R1、C1:极化效应参数
R2、C2:扩散效应参数
4.2 PNGV模型原理
PNGV模型,全称是"Partnership for a New Generation of Vehicles"。这名字听着挺唬人,其实原理并不复杂。
它和二阶RC模型最大的区别是什么?PNGV模型在RC网络的基础上,增加了一个电容来模拟电池容量的变化。说白了,就是考虑了电池在充放电过程中开路电压的缓慢漂移。
我个人习惯:在做长时仿真(比如整个驾驶循环)时,PNGV模型比二阶RC更稳定。因为二阶RC模型在长时间尺度下,开路电压假设是恒定的,这其实不太符合实际。
PNGV模型的等效电路包含:
- 一个电压源Uocv(开路电压)
- 一个电容Cb(模拟容量变化)
- 一个欧姆内阻R0
- 一个RC并联环节(模拟极化效应)
它的状态方程是:
Uocv(t) = Uocv(0) + (1/Cb) * ∫I dt
端电压方程:
U = Uocv - I*R0 - U1
其中U1满足:
dU1/dt = I/C1 - U1/(R1*C1)
为什么会多一个Cb?你想想看,电池用久了,开路电压会慢慢下降。二阶RC模型把这个变化忽略了,PNGV模型用Cb来积分电流,模拟这种长期漂移。
4.3 模型精度对比分析
我做过一组对比测试,用同一组电池数据分别跑二阶RC和PNGV模型。结果很有意思:
| 对比项 | 二阶RC模型 | PNGV模型 |
|---|---|---|
| 短时动态精度(<10s) | 优秀(误差<15mV) | 良好(误差<20mV) |
| 长时稳态精度(>100s) | 一般(误差30-50mV) | 优秀(误差<15mV) |
| 参数辨识复杂度 | 中等(需辨识5个参数) | 较高(需辨识6个参数) |
| 计算资源消耗 | 低 | 中等 |
| 适用场景 | 短时脉冲、快速充放电 | 长时循环、容量估算 |
我曾经踩过一个坑:在某个项目中,我直接用二阶RC模型做长时仿真,结果SOC估算误差越来越大。后来换成PNGV模型,问题就解决了。所以选模型一定要看你的应用场景——是做短时动态控制,还是做长时状态估算。
4.4 Simulink实现
在Simulink里建这两个模型,我一般用物理建模的方式。下面是我常用的实现思路:
二阶RC模型的Simulink搭建步骤:
- 用Simscape Electrical的电阻、电容元件搭建等效电路
- 用受控电压源表示开路电压Uocv(查表实现)
- 用电流传感器测量电流,反馈给RC网络
- 用PS-Simulink转换器连接物理域和信号域
代码生成时要注意一点——Simscape模型不能直接生成嵌入式代码。我一般会把它转换成纯数学方程的形式:
% 二阶RC模型的离散化实现(用于代码生成)
function [U, U1, U2] = fcn(I, U1_prev, U2_prev, Ts)
% 参数定义
R0 = 0.005; % 欧姆内阻
R1 = 0.002; C1 = 3000; % 极化参数
R2 = 0.003; C2 = 8000; % 扩散参数
% 查表得到Uocv(基于SOC)
Uocv = lookupUocv(SOC);
% 状态更新(前向欧拉法)
U1 = U1_prev + Ts * (I/C1 - U1_prev/(R1*C1));
U2 = U2_prev + Ts * (I/C2 - U2_prev/(R2*C2));
% 端电压计算
U = Uocv - I*R0 - U1 - U2;
end
PNGV模型的实现类似,只是多了一个积分项:
% PNGV模型的离散化实现
function [U, Uocv, U1] = fcn(I, Uocv_prev, U1_prev, Ts)
Cb = 50000; % 容量电容
R0 = 0.005;
R1 = 0.002; C1 = 3000;
% 开路电压更新(考虑容量变化)
Uocv = Uocv_prev + Ts * I / Cb;
% RC网络更新
U1 = U1_prev + Ts * (I/C1 - U1_prev/(R1*C1));
% 端电压
U = Uocv - I*R0 - U1;
end
我建议:在Simulink里先建物理模型做验证,确认精度达标后,再转成数学方程形式用于代码生成。这样既能利用Simscape的直观性,又能保证生成代码的效率。
最后说一句,模型参数辨识是另一门学问。我一般用混合脉冲功率特性测试的数据来做参数拟合。如果你用的是现成的电池数据,记得先做数据预处理——滤波、去噪、剔除异常点,不然模型精度会大打折扣。
好了,关于二阶RC和PNGV模型就聊到这儿。这两个模型各有千秋,选哪个取决于你的具体需求。我个人更倾向于在项目初期两个都建,对比精度后再做决定——毕竟模型选错了,后面改起来成本太高。
公众号:蓝海资料掘金营,微信deep3321