这个例子展示了如何导入锂离子电池表数据,并为数据表电池块生成参数。
在步骤1中,导入数据表数据。步骤2-5展示了如何使用曲线拟合技术从数据表中获得开路电压和电池电阻。在步骤6-8中,通过将其与Arrhenius行为和数据表数据进行比较,验证曲线拟合电压和电池值。最后,在步骤9中,指定这些数据表电池块参数:
额定温度下的额定容量
开路电压表数据
开路电压断点
内阻表数据
电池温度断点1
电池容量断点
最初的电池充电
将电池放电和温度数据导入MATLAB。确保数据表中的每个数据集都包含启动电池电池输出电压。通常,在不同温度下采集的数据具有相同的参考电流。不同电流采集的数据具有相同的参考温度。
对于此示例,从包含12个数据集的文件中加载锂离子电池的电池数据表排放和温度数据。每个数据集对应于特定电流和温度的电池数据。数据集每个都有两列。第一列包含百分比的放电容量。第二列包含相应的电池电池电压。
exp_data = load(“ex_datasheetbattery_liion_100Ah.mat”);
本例不使用500a的25ºC电流对应的数据集。
绘制放电和温度曲线。图1给出了锂离子电池在恒温(5个电流等级,如图C-rate)和恒流(6个温度)下的放电特性。参考温度为25℃时,参考电流为50a时的曲线如图1所示。
ex_datasheetbattery_plot_data
为了表示恒定温度下的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 1 0]); / /输出
定义参考电流和温度。对于该示例,参考温度为25°C,参考电流为50 A.
Ref_curr = current == current(ref_exp);Ref_temp = temperature == temperature(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'温度_Label {i}])=...exp_data。([标签“_”current_label{我}“_”temperature_label{我}])(:1)/...exp_data。([标签“_”current_label{我}“_”temperature_label{我}])(,1);计算每个数据表的实际容量correct_cap。([“咕咕叫”current_label{我}'_temp'温度_Label {i}])=...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。([“健康”温度_Label {i}])=...适合(x。([“咕咕叫”current_label{我}'_temp'temperature_label{我}]),...exp_data。([标签“_”current_label {ref_exp}“_”temperature_label{我}])(:,2),“smoothingspline”);结束
构造不同SOC水平的电压与放电电流。Em_MAT
是一个行为SOC列为电流的矩阵。
Em_MAT = [];为i =查找(ref_temp)em_mat = [em_mat fitobj。([“健康”current_label{我}])(SOC_LUT)];结束
图3显示了不同soc的电压与电流。
ex_datasheetbattery_plot_curves
为了获得开路电压,新兴市场
,拟合一条线到电压与电流的曲线,并外推到我= 0
.
R0_refTemp = [];为i = 1:长度(SOC_LUT)%适合v = f(i)的线Fitsoc。([“SOC”num2str (i))) =适合(sort_current’,Em_MAT(我sort_index_current) ',“poly1”);结束
为了估计开路电压,新兴市场
在所有SOC层面,将电压值推断到我= 0
.
Em = [];为i = 1:长度(SOC_LUT)% Em = f(0)Em = [Em fitSOC。([“SOC”num2str (i)]) (0)];结束Em = Em”;
使用放电和温度数据来确定电池电阻作为电流和SOC在不同温度下的函数。不包括验证数据。图4显示了电池在不同温度下的电压。
ex_datasheetbattery_plot_voltage
使用参考电流数据集计算不同温度下的电阻。
R0_LUT = [];为我找= (ref_curr & ~ val_exp)%创建适合V和SOC的对象voltVsSOC。([“临时”temperature_label{我}))= fitObj。([“健康”temperature_label{我}])(SOC_LUT);假设R0 = DeltaV / I为线性行为,计算R0(SOC,T)R0。([“临时”{i}]) = (Em - voltVsSOC。([“临时”temperature_label{我}]))。/电流(ref_exp);%构造附近地区R0_lut = [R0_lut]([“临时”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_lu -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] = (T_LUT)进行排序;xtmp = R0_LUT ';R0_LUT1(1:长度(T_LUT):) = xtmp (idx:);
图5显示了不同温度下的电池电阻。
ex_datasheetbattery_plot_resistance.
由于锂离子电池的温度依赖反应速率遵循阿伦尼乌斯行为,您可以使用比较来验证曲线拟合。
为了确定阿伦尼乌斯行为的曲线拟合预测,检查活化能,Ea
.通过内阻的斜率得到活化能,罗依
,而不同soc的1000/T曲线。斜率等于活化能,Ea
,除以普遍气体常数,Rg
.
对于锂离子电池,其典型值为Ea
是20 kJ / mol [2]。图6表示激活能量,Ea
,通过斜率获得的,与20kJ / mol紧密相比。
ex_datasheetbattery_plot_arrhenius
锂离子电池导电活化能Ea = 17.9958 20.669 18.9557 22.8107 21.5289 24.0987 kJ/mol
将电池电阻与验证的温度数据相匹配,作为SOC和温度的函数。
R0_LUT_bkpts = [];counter = 1;[SOC_LUT_index, ~] = find(abs(soc_lu - socbkpts)<0.001);为i=find(ref_curr & ~val_exp) R0_LUT_bkpts = [R0_LUT_bkpts R0_LUT(SOC_LUT_index,counter)];counter = counter + 1;结束[xx, yy, zz] = prepareSurfaceData (1000. / T_LUT SOCbkpts,日志(R0_LUT_bkpts));[R0_vs_T_SOC_fit, gof] = fit([xx,yy],zz,“linearinterp”);%[r0_vs_t_soc_fit,gof] = fit([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
图9显示了计算的数据和实验数据集数据。
ex_datasheetbattery_plot_validation
设置额定温度下的额定容量参数设置为数据表提供的容量。
BattChargeMax = 100;% Ah数据表的容量
设置开路电压表数据参数新兴市场
.
Em = flipud (Em);
设置开路电压断点指控状态的参数。
CapLUTBp = SOC_LUT;
设置内阻表数据参数与所拟合的电池电阻数据作为SOC和温度的函数。
无线电侦察= R0_LUT_bkpts ';
设置电池温度断点1参数到温度矢量。
batttempbp = t_lut1;
设置电池容量断点参数到SOC矢量。
CapSOCBp = SOCbkpts;
设置最初的电池充电参数到数据表提供的值。
Battcapinit = 100;
清理。
清除xxx民yyyy1Z Zzz1;清除batt_id上校正确的帽数计数器当前的;清除correct_capcurrent_label数据exp_datafitobj.Fitsoc.gof;清除我我idxindicotjk标签腿line_colors;清除靛青N橙色p1p2紫色的ref_currref_expref_temp行colorVf9p10票数;清除sort_currentsort_index_currentsort_index_tempsort_temp;清除温度温度Vval_expvalIdxvoltVsSOCxtmptemperature_label;清除EaEm_MATmarkerType1R0R0_LUTR0_LUT1R0_LUT_bkptsR0_refTempR0_vs_T_fit;清除TRgydF4y2Bar0_vs_t_soc_fit.r0_vs_t_soc_fit1.SOC_LUTSOCbkptsT_LUTT_LUT1soc_lut_index.;
[1] Jackey,Robyn,Tarun Huria,Massimo Ceraolo和Javier Gazzarri。“具有热依赖性的高保真电模型,具有高功率锂电池电池的表征和仿真。”IEEE国际电动汽车会议.2012年3月,第1-8页。
纪燕,张盐城,王朝阳。电化学学会学报.第160卷,第4期(2013),A636-A649。