生成数据表电池块参数数据
本示例展示如何导入锂离子电池表数据并生成数据表电池块的参数。
在步骤1中,导入数据表数据。步骤2-5介绍了如何使用曲线拟合技术从数据表数据中获取开路电压和电池电阻。在步骤6-8中,通过将曲线拟合电压和电池值与Arrhenius行为和数据表数据进行比较,验证它们。最后,在步骤9中,您指定这些数据表电池块参数:
额定温度下的额定容量
开路电压表数据
开路电压断点1
内阻表数据
电池温度断点
2 .电池容量断点
初始电池电量
步骤1:导入电池数据表
将电池放电和温度数据表导入MATLAB。确保数据表中的每个数据集都包含启动电池单元输出电压。通常,在不同温度下收集的数据具有相同的参考电流。在不同电流下采集的数据具有相同的参考温度。
在本例中,从包含12个数据集的文件中加载锂离子电池的电池数据表放电和温度数据。每个数据集对应于特定电流和温度的电池数据。每个数据集有两列。第一列包含放电容量,以百分比表示。第二列包含相应的电池电压。
exp_data =负载(“ex_datasheetbattery_liion_100Ah.mat”);
本例没有使用对应于25ºC下500a电流的数据集。
绘制出流量和温度曲线。图1显示了锂离子电池在恒温(5级电流,以c速率表示)和恒流(6种温度)下的放电特性。图1为参考温度为25ºC,参考电流为50 A时的曲线。
ex_datasheetbattery_plot_data
步骤2:标准化SOC数据
为了表示恒定温度下的1- soc容量,将相对放电容量归一化,取值范围为0到1。设1代表一个完全放电的电池。
集ref_exp
对应于参考温度25°C和参考电流50 A的数据集。一般情况下,参考温度为室温。
Ref_exp = 2;
如果您有多个数据集,请使用其中几个进行验证。不要将它们作为评估数据集的一部分。
对于本例,使用val_exp
建立验证和估计数据集。设1表示验证数据集,0表示估计数据集。
Val_exp = logical([1 0 0 0 1 0 0 0 0 0 0 0]);
定义参考电流和温度。在本例中,参考温度为25°C,参考电流为50 A。
Ref_curr = current == current(ref_exp);Ref_temp =温度==温度(ref_exp);[sort_current, sort_index_current] = sort(current(ref_temp));[sort_temp, sort_index_temp] = sort(温度(ref_curr));N =长度(电流);%实验次数
为每个数据集准备规范化的x轴,并找出实际容量。X是一个结构,它的字段和数据集一样多,值在0到1之间。
为i = 1: N x。([“咕咕叫”current_label{我}“_temp”temperature_label{我}))=...exp_data。([标签“_”current_label{我}“_”temperature_label{我}])(:1)/...exp_data。([标签“_”current_label{我}“_”temperature_label{我}])(,1);计算每个数据表的实际容量correct_cap。([“咕咕叫”current_label{我}“_temp”temperature_label{我}))=...exp_data。([标签“_”current_label{我}“_”temperature_label{我}])(,1);结束
绘制标准化SOC数据。
ex_datasheetbattery_plot_soc
第三步:拟合曲线
创建fitObj
不同放电速率下的恒温曲线和不同温度下的恒放电速率曲线。使用fitObj
曲线,以创建在不同SOC水平下电池/模块电压与放电电流的矩阵。
fitObj
是适合对象的结构,包含与数据集一样多的字段。该结构使放电电压与正规化电压相适应([0, 1])
提取的啊。这使得放电曲线可以进行代数组合,以计算每个SOC级别的电阻。
定义电荷矢量和断点的状态。
Soc_lut = (0:.01:1)';SOCbkpts = 0:.2:1;
拟合不同电流下的放电曲线为参考温度。
为我找= (ref_temp) fitObj。([“健康”current_label{我}))=...符合(x。([“咕咕叫”current_label{我}“_temp”temperature_label{我}]),...exp_data。([标签“_”current_label{我}“_”temperature_label {ref_exp}]) (:, 2),“smoothingspline”);结束
拟合不同温度下的放电曲线作为参考电流。
为我找= (ref_curr) fitObj。([“健康”temperature_label{我}))=...符合(x。([“咕咕叫”current_label{我}“_temp”temperature_label{我}]),...exp_data。([标签“_”current_label {ref_exp}“_”temperature_label{我}])(:,2),“smoothingspline”);结束
构造不同SOC电平的电压与放电电流。Em_MAT
是一个矩阵,其中SOC为行,电流为列。
Em_MAT = [];为i=find(ref_temp) Em_MAT = [Em_MAT fitObj.]([“健康”current_label{我}])(SOC_LUT)];结束
图3显示了不同soc下的电压与电流关系。
ex_datasheetbattery_plot_curves
步骤4:推断开路电压
为了得到开路电压,新兴市场
,拟合电压与电流曲线的一条线,并外推到我= 0
.
R0_refTemp = [];为i = 1:长度(SOC_LUT)拟合V=f(I)fitSOC。([“SOC”num2str(i)]) = fit(sort_current',Em_MAT(i,sort_index_current)',“poly1”);结束
为了估计开路电压,新兴市场
,在所有SOC级别,外推电压值为我= 0
.
Em = [];为i = 1:长度(SOC_LUT)% Em = f(0)Em = [Em fitSOC.]([“SOC”num2str (i)]) (0)];结束Em = Em';
步骤5:确定电池在不同温度下的电压和电阻
使用放电和温度数据来确定在不同温度下电池电阻作为电流和SOC的函数。验证数据不包括在内。图4为不同温度下的电池电压。
ex_datasheetbattery_plot_voltage
使用参考电流数据集计算不同温度下的电阻。
R0_lut = [];为I =find(ref_curr & ~val_exp)为V vs. SOC创建合适的对象voltVsSOC。([“临时”temperature_label{i}]) = fitObj。([“健康”temperature_label{我}])(SOC_LUT);计算R0(SOC,T)假设线性行为R0 = DeltaV / IR0。([“临时”温控标签{i}]) = (Em - voltVsSOC。([“临时”temperature_label{我}]))。/电流(ref_exp);%构造LUTR0_lut = [R0_lut r0 .]([“临时”temperature_label{我}])];结束
避免R的突变接近SOC = 0
,将R(0.9)一直延伸到R(1)。这是需要的,因为R的计算方式。使算法健壮,在情况下0.9不是一个实际的断点
如果~ isempty(找到(SOC_LUT = = 0.9, 1)) R0_LUT (SOC_LUT > 0.9:) = repmat (R0_LUT (SOC_LUT = = 0.9:),长度(R0_LUT (SOC_LUT > 0.9:)), 1);其他的[closestTo0p9, locClosestTo0p9] = min(abs(SOC_LUT-0.9));R0_LUT(SOC_LUT>closestTo0p9,:) = repmat(R0_LUT(locClosestTo0p9,:)),...长度(R0_LUT (SOC_LUT > closestTo0p9,:)), 1);结束
确定电池在不同温度下的电阻。
R0_LUT = max(R0_LUT,0);T_LUT = 273.15 +温度(ref_curr & ~val_exp);[T_LUT1,idx] = sort(T_LUT);xtmp = R0_LUT ';R0_LUT1(1:length(T_LUT),:) = xtmp(idx,:);
图5为不同温度下的电池电阻。
ex_datasheetbattery_plot_resistance
第六步:与阿伦尼乌斯行为进行比较
由于锂离子电池的温度依赖性反应速率遵循阿累尼乌斯行为,您可以使用比较来验证曲线拟合。
为了确定Arrhenius行为的曲线拟合预测,检查活化能,Ea
.由内阻斜率得到活化能,罗依
,相对于不同soc的1000/T曲线。斜率等于活化能,Ea
,除以通用气体常数,Rg
.
对于锂离子电池,典型的值为Ea
是20 kJ/mol[2]。图6为活化能,Ea
,与20 kJ/mol的斜率比较接近。
ex_datasheetbattery_plot_arrhenius
锂离子电池中电解质输送的活化能Ea = 17.9958 20.669 18.9557 22.8107 21.5289 24.0987 kJ/mol
第七步:安装电池电阻
将电池电阻与验证的温度数据拟合为SOC和温度的函数。
R0_LUT_bkpts = [];计数器= 1;[SOC_LUT_index, ~] = find(abs(SOC_LUT-SOCbkpts)<0.001);为i=find(ref_curr & ~val_exp) R0_LUT_bkpts = [R0_LUT_bkpts R0_LUT(SOC_LUT_index,counter)];计数器=计数器+1;结束[xx,yy,zz] = prepareSurfaceData(1000./T_LUT,SOCbkpts,log(R0_LUT_bkpts));[R0_vs_T_SOC_fit, gof] = fit([xx,yy],zz,“linearinterp”);% (R0_vs_T_SOC_fit, gof) =适合(xx, yy, zz, poly12);[xx1,yy1,zz1] = prepareSurfaceData(T_LUT,SOCbkpts,R0_LUT_bkpts);[R0_vs_T_SOC_fit1, gof] = fit([xx1,yy1],zz1,“linearinterp”);
图7和8显示了电池电阻随SOC和温度变化的表面图。
ex_datasheetbattery_plot_surface
步骤8:验证电池模型适合
图9显示了计算数据和实验数据集数据。
ex_datasheetbattery_plot_validation
步骤9:设置数据表电池块参数
设置额定温度下的额定容量参数为数据表提供的容量。
BattChargeMax = 100;% Ah数据表中的容量
设置开路电压表数据参数新兴市场
.
Em = flipud (Em);
设置开路电压断点1参数表示电荷矢量的状态。
CapLUTBp = SOC_LUT;
设置内阻表数据参数,以拟合的电池电阻数据作为SOC和温度的函数。
无线电侦察= R0_LUT_bkpts ';
设置电池温度断点参数的温度向量。
BattTempBp = T_LUT1;
设置2 .电池容量断点参数为SOC向量。
CapSOCBp = SOCbkpts;
设置初始电池电量参数设置为数据表提供的值。
BattCapInit = 100;
清理。
清晰的xxx民yyyy1zzzz1;清晰的batt_id上校正确的帽数计数器当前的;清晰的correct_capcurrent_label数据exp_datafitObjfitSOCgof;清晰的我我idxindicotjk标签腿line_colors;清晰的靛蓝N橙色p1p2紫色的ref_currref_expref_temp行colorVf9p10票数;清晰的sort_currentsort_index_currentsort_index_tempsort_temp;清晰的温度temperature_lableVval_expvalIdxvoltVsSOCxtmptemperature_label;清晰的EaEm_MATmarkerType1R0R0_LUTR0_LUT1R0_LUT_bkptsR0_refTempR0_vs_T_fit;清晰的TRgydF4y2BaR0_vs_T_SOC_fitR0_vs_T_SOC_fit1SOC_LUTSOCbkptsT_LUTT_LUT1SOC_LUT_index;
参考文献
Jackey, Robyn, Tarun Huria, Massimo Ceraolo和Javier Gazzarri。“用于表征和模拟高功率锂电池电池的热依赖性高保真电模型。”IEEE国际电动汽车会议.2012年3月,第1-8页。
[2]季燕,张彦成,王朝阳。电化学学会杂志.第160卷,第4期(2013),A636-A649。