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搭建步骤:

  1. 用Simscape Electrical的电阻、电容元件搭建等效电路
  2. 用受控电压源表示开路电压Uocv(查表实现)
  3. 用电流传感器测量电流,反馈给RC网络
  4. 用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模型 双时间常数(极化+扩散) 短时动态精度优秀 容量电容模拟开路电压漂移 长时稳态精度优秀 Simulink实现 物理建模(Simscape验证) 数学方程(代码生成)

好了,关于二阶RC和PNGV模型就聊到这儿。这两个模型各有千秋,选哪个取决于你的具体需求。我个人更倾向于在项目初期两个都建,对比精度后再做决定——毕竟模型选错了,后面改起来成本太高。


公众号:蓝海资料掘金营,微信deep3321