run("CellModelParameters.mlx") % Load cell ECM parameters (e.g., capacity, energy)
要定义电池电芯对象,我们必须实例化 Simscape Battery 中 Battery Builder 包中的 Cell 类:
import simscape.battery.builder.* % Import battery builder package
battCell = Cell(Geometry = CylindricalGeometry(...
'Height',simscape.Value(cellData.cellHeight,'m'),...
'Radius',simscape.Value(cellData.cellRadius,'m')), ...
Capacity = simscape.Value(cellData.cellCapacity,"A*hr"), ...
Energy = simscape.Value(cellData.cellNominalEnergy,"W*hr")); % Cell object
我们可以通过修改 CellModelOptions 属性将我们的电芯对象链接至 About:Engery 的自定义模块:
battCell.CellModelOptions.CellModelBlockPath = "AE_Mathworks_lib/AE_mathworks_ECM";
disp(battCell.CellModelOptions)
CellModelBlock with properties:
CellModelBlockPath: "AE_Mathworks_lib/AE)_mathworks_ECM"
BlockParameters: [1x1 struct]
在这个例子中,我们创建了一个由 16 个电池模块组成的 400 伏汽车式牵引电池。每个电池模块由 36 个圆柱形电池组成,这些电池以并联方式电连接,然后其中 6 个并联组件以串联方式电连接 (36p6s)。将电芯组件放大为并联组件,然后放大为模块的代码如下所示:
battPSet = ParallelAssembly(Cell = battCell, NumParallelCells = 36,...
Rows = 9, ModelResolution="Detailed",...
NonCellResistance = "on",...
AmbientThermalPath="CellBasedThermalResistance", ...
CoolantThermalPath="CellBasedThermalResistance",...
CoolingPlate="Bottom"); % Parallel assembly object
battModule = Module(ParallelAssembly = battPSet, NumSeriesAssemblies = 6,...
NonCellResistance = "on",...
ModelResolution="Grouped",...
SeriesGrouping = [1,4,1],...
ParallelGrouping = [36,1,36],...
AmbientThermalPath="CellBasedThermalResistance", ...
CoolantThermalPath="CellBasedThermalResistance",...
CoolingPlate="Bottom"); % Module object
或者,我们也可以使用 Battery Builder 应用程序定义相同的电池设计和对象(图 3)。
电池可视化代码 |
电池模型创建代码 |
f = uifigure(Color="w"); BatteryChart(Battery=battPSet);
|
buildBattery(battPSet, Library= "detailedPSet",... MaskParameters = "VariableNamesByType"); |
f = uifigure(Color="w"); BatteryChart(Battery=battModule);
|
buildBattery(battModule, Library= "groupedModule",... MaskParameters = "VariableNamesByType"); |
多变的 |
描述和代码 |
阳极电位 |
我们将使用负极相对于 Li/Li+ 参比电极的静电势作为锂沉积风险增加和加速降解的指标。在充电过程中,由于电池内部发生的质量传输和化学反应过程,该电位会下降。为了降低锂镀层的风险,该电位不得低于 0 V 太多。在此示例中,该电位阈值将任意设置为 50 mV。 AnodePotentialThreshold = 0.05; % Unit:V |
电池温度 |
电池温度必须保持在其运行极限以下,以限制性能下降并降低热失控风险。 TemperatureThreshold = 55 + 273.15; % Unit:K |
初始电池温度 |
温度越高,电流就越大。如果达到最高工作温度,这将导致控制系统降低电流并延长充电时间。较低的初始温度可提供更多的温度增量来抑制高热量的产生,但较低的温度也会限制最大电流。因此,存在一个最佳初始温度,可以通过模拟或物理测试找到它。 InitialCellTemperature = 35 + 273.15; % Unit:K |
热管理边界条件 |
在此示例中,我们考虑将“底部冷却”电池电芯封装到冷却板上,如下图所示。我们假设从电池底面到冷却通道中的大量冷却剂的热阻恒定为 5 K/W。 CellThermalPathResistance = 5; % Unit:K/W |
电池端电压 |
在充电过程中,电池电压会增加。为防止出现过压或过充情况,电池电压不能超过电池供应商规定的最大值。 MaximumBatteryVoltage = 4.2; % Unit:V |
电池充满电 |
在充电阶段结束时,端电压上升至最大值。为了确保最佳快速充电并避免过度充电情况,必须以恒定电压步骤 (CV) 降低电流。在本文中,一旦电流值降至额定电池容量的 1/10 以下,即达到完全充电 (100% SOC)状态。 FullyChargedCurrentThreshold = cellData.cellCapacity/10; % Unit:A |
最大充电电流 |
该值应由电池制造商针对一组特定条件(SOC、SOH、温度)指定。一般来说,电池可以在短时间内接受较大的充电电流,在较长时间内接受较小的充电电流。 MaximumChargeCurrent = 30; % @ 0% SOC, instantaneous limit, Unit:A |
cellSimulation = sim("CellLevelFastCharge.slx","StartTime","0","StopTime","3600");
run("PlotCellSimulation.mlx");
InitialCellTemperatureVector = [5,15,25,35,45,50] + 273.15; % Unit: K
InitialSOCVector = [0,0.05,0.1,0.2,0.5,0.6,0.8,0.95]; % Unit: -
for initTempIdx = 1:numel(InitialCellTemperatureVector)
for initSOCIdx = 1:numel(InitialSOCVector)
InitialCellTemperature = InitialCellTemperatureVector(initTempIdx);
InitialSOC = InitialSOCVector(initSOCIdx);
cellSimulations(initTempIdx).SOCPoint(initSOCIdx).Data = sim("CellLevelFastChargeLimitsStateFlow.slx","StartTime","0","StopTime","60");
cellCurrentLimit(initTempIdx,initSOCIdx) = cellSimulations(initTempIdx).SOCPoint(initSOCIdx).Data.simout.Data(end);
save cellCurrentLimit
end
end
newCellCurrentLimit = [cellCurrentLimit, zeros(1,numel(cellCurrentLimit(:,1)))'];
figure("Color","w")
[xq,yq]= meshgrid([550]+273.15, 01);
vq = griddata(InitialCellTemperatureVector,[InitialSOCVector,1],newCellCurrentLimit',xq,yq);
mesh(xq,yq,vq)
xlabel('Temperature (°C)')
ylabel('State of Charge (-)')
zlabel('Current Limit (A)')
view([-5 3.5 5])
run("parallelAssemblyProfile.m")
ParallelAssembly1.CoolantResistance = 14 + (30-14)*rand(36,1)'; % Cell level coolant thermal path resistance, K/W
其他需要考虑的重要方面可以使用 Simscape 进行建模,但本文未明确涉及,包括:
run("detailedPSet_param.m");
set_param("ParallelAssemblyLevelFastCharge","SimscapeLogType",'all')
pSetSimulation = sim("ParallelAssemblyLevelFastCharge.slx","StartTime","0","StopTime","5200");
run("PlotParallelAssemblySimulation.mlx"); % Plot results
pSetSimLog = BatterySimulationLog( battPSet, pSetSimulation.simlog.ParallelAssembly1);
pSetSimLog.SelectedVariableUnit = "degC";
f = uifigure("Color","w");
g = uigridlayout(f, [1,1]);
parallelAssemblyChart = BatterySimulationChart(Parent = g, ...
BatterySimulationLog = pSetSimLog);
parallelAssemblyChartColorBar = colorbar(parallelAssemblyChart);
ylabel( parallelAssemblyChartColorBar, strcat("Cell temperature", " (", pSetSimLog.SelectedVariableUnit,")") ,'FontSize',14 );
parallelAssemblyChartColorBar = colormap(parallelAssemblyChart);
模型 |
结果/动态电池图表 |
0-80%:25 分钟 0-100%:44 分钟 |
|
0-80%:27 分钟 0-100%:46 分钟 |
batteries = ["Cell","Parallel Assembly","Module", "Pack"];
batteries0To80ChargeTimes = [ChargeTime0To80 pSetChargeTime0To80 moduleChargeTime0To80 packChargeTime0To80];
batteries0To100ChargeTimes = [ChargeTime0To100 pSetChargeTime0To100 moduleChargeTime0To100 packChargeTime0To100];
figure("Color","w")
subplot(1,2,1)
bar(batteries,batteries0To80ChargeTimes)
ylabel("0 to 80% SOC Charge Time (min)")
grid on
subplot(1,2,2)
bar(batteries,batteries0To100ChargeTimes)
ylabel("0 to 100% SOC Charge Time (min)")
grid on
全部0条评论
快来发表一下你的评论吧 !