上文介绍了二阶ECM的Siumlink搭建,本文记录二阶RC电路参数辨识的学习,本文介绍二阶指数拟合的方式来进行参数辨识,这是一种离线参数辨识方法。学习视频的链接:https://www.bilibili.com/video/BV1fW4y1m77X/?spm_id_from=333.880.my_history.page.click&vd_source=300e57f32aeadcae353cca3937cd943f
实验数据
实验数据采用马里兰大学的公开数据集:https://calce.umd.edu/battery-data
选择其中的Incremental Current OCV中的sample1中的Data for 25℃。选择这个12_2_2015_Incremental OCV test_SP20-1 中的表1和2导入matlab中,选择测试时间、电流、电压,人为补充温度为25℃,选择全部的HPPC放电部分。matlab代码如下:
Time = cat(1,IncrementalOCVtestSP201S1(:,1), IncrementalOCVtestSP201S2(1:8004,1));
Current = cat(1,IncrementalOCVtestSP201S1(:,2), IncrementalOCVtestSP201S2(1:8004,2));
Voltage = cat(1,IncrementalOCVtestSP201S1(:,3), IncrementalOCVtestSP201S2(1:8004,3));
temperature = ones(length(Voltage),1).*25;
Incremental_OCV_test_SP201 = struct('Time',Time,'Current',Current,'Voltage',Voltage,'Temperature',temperature);
电压结果如图:
参数辨识
1.SOC-OCV曲线辨识
我以为这个是测出来就算真实值了,不知道这个过程算不算辨识。
这样就辨识出SOC-OCV曲线上的10个点,可以采用多项式进行拟合二者的关系。
2.R0
辨识数据与结果如下:
V_A_100 = 4.17577;
V_B_100 = 3.95634;
V_C_100 = 3.80806;
V_D_100 = 4.02749;
V_A_90 = 4.05017;
V_B_90 = 3.8301;
V_C_90 = 3.69105;
V_D_90 = 3.91096;
V_A_80 = 3.93997;
V_B_80 = 3.71957;
V_C_80 = 3.58052;
V_D_80 = 3.80044;
V_A_70 = 3.83998;
V_B_70 = 3.61877;
V_C_70 = 3.48231;
V_D_70 = 3.70174;
V_A_60 = 3.7536;
V_B_60 = 3.53207;
V_C_60 = 3.41992;
V_D_60 = 3.63935;
V_A_50 = 3.66479;
V_B_50 = 3.44423;
V_C_50 = 3.37908;
V_D_50 = 3.59965;
V_A_40 = 3.62606;
V_B_40 = 3.40534;
V_C_40 = 3.34359;
V_D_40 = 3.56464;
V_A_30 = 3.59948;
V_B_30 = 3.37795;
V_C_30 = 3.29675;
V_D_30 = 3.51975;
V_A_20 = 3.55557;
V_B_20 = 3.33192;
V_C_20 = 3.20762;
V_D_20 = 3.43677;
V_A_10 = 3.46773;
V_B_10 = 3.23793;
I = 1; %1A
3. R1、R2、C1、C2
数据提取程序:
U_DE_100 = Incremental_OCV_test_SP201.Voltage(1486:8611);
T_DE_100 = Incremental_OCV_test_SP201.Time(1486:8611);
T_DE_100 = T_DE_100 - (T_DE_100(1));
U_DE_90 = Incremental_OCV_test_SP201.Voltage(9325:16450);
T_DE_90 = Incremental_OCV_test_SP201.Time(9325:16450);
T_DE_90 = T_DE_90 - (T_DE_90(1));
U_DE_80 = Incremental_OCV_test_SP201.Voltage(17164:24289);
T_DE_80 = Incremental_OCV_test_SP201.Time(17164:24289);
T_DE_80 = T_DE_80 - (T_DE_80(1));
U_DE_70 = Incremental_OCV_test_SP201.Voltage(25003:32129);
T_DE_70 = Incremental_OCV_test_SP201.Time(25003:32129);
T_DE_70 = T_DE_70 - (T_DE_70(1));
U_DE_60 = Incremental_OCV_test_SP201.Voltage(32843:39969);
T_DE_60 = Incremental_OCV_test_SP201.Voltage(32843:39969);
T_DE_60 = T_DE_60 - (T_DE_60(1));
U_DE_50 = Incremental_OCV_test_SP201.Voltage(40683:47808);
T_DE_50 = Incremental_OCV_test_SP201.Voltage(40683:47808);
T_DE_50 = T_DE_50 - (T_DE_50(1));
U_DE_40 = Incremental_OCV_test_SP201.Voltage(48522:55647);
T_DE_40 = Incremental_OCV_test_SP201.Voltage(48522:55647);
T_DE_40 = T_DE_40 - (T_DE_40(1));
U_DE_30 = Incremental_OCV_test_SP201.Voltage(56361:63485);
T_DE_30 = Incremental_OCV_test_SP201.Voltage(56361:63485);
T_DE_30 = T_DE_30 - (T_DE_30(1));
U_DE_20 = Incremental_OCV_test_SP201.Voltage(64201:71326);
T_DE_20 = Incremental_OCV_test_SP201.Voltage(64201:71326);
T_DE_20 = T_DE_20 - (T_DE_20(1));
注意时间是要从0开始的。
然后根据图片上的参数与RC的关系进行辨识,matlab程序如下:
function [R1, C1, R2, C2] = RC(Time,U_DE)
%RC 辨识R1、C1、R2、C2
% Time: 对应的时间
% U_DE: DE段电压曲线
time = Time;
vol = U_DE;
c0 = [-0.01, 0.02, 20, -0.01, 300];
ci = lsqcurvefit(@myfun, c0, time, vol);
R1 = -ci(1,2);
R2 = -ci(1,4);
C1 = ci(1,3)./R1;
C2 = ci(1,5)./R2;
end
myfun如下:
function F = myfun(c,tdata)
%MYFUN 拟合二阶RC电路的时间、电压变化曲线
%为什么是log(10)?
F = c(1) + c(2)*(log(10)^-c(3)*tdata) + c(4)*(log(10)^-c(5)*tdata);
end
但是辨识结果出现了负值,虽然视频上展示了最终结果都是正的,但是评论区也说是负值。lsqcurvefit是利用递推最小二乘来计算的,而cftool的曲线拟合工具箱可以设置值的范围来解决这个问题。
利用这种方法辨识的结果和视频中展示的结果差不多,就是R2C2这一项也就是e的范围有些问题,视频中为2左右,但是我辨识出来的结果为1266这就导致R2比视频中小,C2比视频中大,想解决这个问题只要限制一下e的范围,比如从0~5之类的,这个如何去限制可能要结合电池材料之类的了,这目前我的能力还解决不了这个问题。
此外,我发现在拟合工具箱使用时,初始值以及值的范围对结果有很大的影响,我的范围在[0 Inf]时反而不如[30 Inf]。
最后参数辨识结果如下:
本文介绍了如何基于HPPC曲线数据获取电池二阶RC模型参数的方法。
如果有什么问题交流可以留言或QQ:2267897749一起讨论,如果有您希望直接购买到可以直接使用的代码和数据,可以在闲鱼中搜索用户 BMS小旭 进行购买,价格十分便宜。