电池循环老化建模
本例演示了如何通过仿真来模拟电池的容量循环老化过程。电池老化是影响储能系统性能和寿命的关键因素。随着电池经历充放电循环,其组件会逐渐劣化,导致容量和效率持续下降。固态电解质界面 (SEI)、锂析出及其他副反应是导致锂离子电池性能衰减的主要原因。
Battery Equivalent Circuit模块支持对循环老化过程进行经验建模。此示例重点展示了该模块在容量老化方面的不同建模选项、参数化设置方法以及仿真结果评估方式。
恒温仿真容量老化
您可以通过周期寿命测试获得所需数据。在这些测试中,您需在受控温度下按照特定规程对电池进行充放电操作。在此示例中,不同组别的电池在 15°C、25°C 和 35°C 环境下进行循环测试,每 100 次放电循环后测量其容量百分比变化。
% Breakpoints dischargeCycleBreakpoints = [0 100 200 300 400]; temperatureBreakpoints = [288.15,298.15,308.15]; % Measured Capacities percentChange15Deg = [0;-1;-3;-6;-9]; percentChange25Deg = [0;-3;-6;-11;-17]; percentChange35Deg = [0;-6;-13;-20;-28]; percentChange = [percentChange15Deg,percentChange25Deg,percentChange35Deg]; % Visualize capacity percent change surf(temperatureBreakpoints,dischargeCycleBreakpoints,percentChange); xlabel("Cycling Temperature [K]"); ylabel("Number of Discharge Cycles [1]"); zlabel("Change in Cell Capacity [%]"); view(124,16);
![Figure contains an axes object. The axes object with xlabel Cycling Temperature [K], ylabel Number of Discharge Cycles [1] contains an object of type surface.](../../examples/simscapebattery/win64/ModelingBatteryCyclingAgingExample_01.png)
Battery Equivalent Circuit 模块支持恒温老化建模。当您在恒定温度下以模型方式建模老化过程时,可以直接应用测得的数据。该建模选项比在不同温度下模型老化过程的选项更为高效。
% Open model modelName = "batteryCyclingAging"; open_system(modelName); % Set aging modeling option and initial capacity blockPath = modelName.append("/Battery Equivalent Circuit"); set_param(blockPath,"CyclingAgingMethod","simscape.battery.enum.cells.CyclingAgingMethod.tableNandT"); % Set aging parameters set_param(blockPath,"CapacityChangeThermal","percentChange"); set_param(blockPath,"AgingTemperatureBreakpoints","temperatureBreakpoints"); set_param(blockPath,"NumDisCyclesBreakpoints","dischargeCycleBreakpoints");
在恒定温度下仿真电池的循环行为。
simout = sim(modelName);
为分析结果,将建模的电芯容量与预期容量进行比较。您通过根据电池恒温状态下的放电循环次数对数据进行插值计算,得出预期容量百分比变化值。观察预期数据如何与建模老化过程相吻合。
% Get the expected capacity batteryLoggingNode = simout.simlog.Battery_Equivalent_Circuit; time = batteryLoggingNode.numCycles.series.time; numberOfDischargeCycles = batteryLoggingNode.numCycles.series.values; expectedCapacityPercentChange = interp1(dischargeCycleBreakpoints,percentChange(:,2),numberOfDischargeCycles); % Get the modeled capacity modeledCapacityPercentChange = batteryLoggingNode.capacityCyclingChange.series.values; % Plot the results plot(time,expectedCapacityPercentChange,time(1:1000:end),modeledCapacityPercentChange(1:1000:end),"*"); xlabel("Time [s]"); ylabel("Capacity Percent Change [%]"); legend(["Expected","Modeled"]);
![Figure contains an axes object. The axes object with xlabel Time [s], ylabel Capacity Percent Change [%] contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Expected, Modeled.](../../examples/simscapebattery/win64/ModelingBatteryCyclingAgingExample_02.png)
仿真温度变化下的容量老化
在正常运行状态下,电池温度会因外部和内部因素的影响而波动。要建模此 Battery Equivalent Circuit 模块中的这些变化,请将循环老化模型参数设置为 Lookup Tables (temperature-dependent)。
set_param(blockPath,"CyclingAgingMethod","simscape.battery.enum.cells.CyclingAgingMethod.tableNandVariableT");
在本次实验中,环境温度在一天中持续变化。您可以将这种变化近似为正弦波模式。要建模这种变化,请将 temperatureVariation 变量设置为 true。
temperatureVariation = true;
仿真该模型,并生成电池温度和容量的图。
simout = sim(modelName,"StopTime","3e5"); batteryLoggingNode = simout.simlog.Battery_Equivalent_Circuit; % Get the modeled capacity percent change under variable temperatures capacityPercentChangeVariableTemperature = batteryLoggingNode.capacityCyclingChange.series.values; timeVariableTemperature = batteryLoggingNode.batteryTemperature.series.time; batteryTemperature = batteryLoggingNode.batteryTemperature.series.values("K"); % Visualize the results variableTemperatureFigure = figure; tiledlayout(variableTemperatureFigure,2,1); nexttile; plot(timeVariableTemperature,capacityPercentChangeVariableTemperature); xlabel("Time [s]"); ylabel("Capacity percent change [%]"); title("Capacity Percent Change"); nexttile; plot(timeVariableTemperature,batteryTemperature); xlabel("Time [s]"); ylabel("Temperature [K]"); title("Temperature");
![Figure contains 2 axes objects. Axes object 1 with title Capacity Percent Change, xlabel Time [s], ylabel Capacity percent change [%] contains an object of type line. Axes object 2 with title Temperature, xlabel Time [s], ylabel Temperature [K] contains an object of type line.](../../examples/simscapebattery/win64/ModelingBatteryCyclingAgingExample_03.png)
与低温地区相比,高温地区的容量衰减速度更快。
考虑 C 速率依赖性仿真容量老化
除了温度相关性性外,循环过程中施加在电池上的充放电速率也会影响容量老化的速率。为建立容量衰减对 C 率的依赖性建模,除先前测得的 1.5C 率值外,还测量了 0.5C 率下的容量衰减值。要使用 Battery Equivalent Circuit 模块中的数据,必须将其组织成三维数组。第一维度必须对应放电循环次数,第二维度必须对应温度,第三维度必须对应放电电流。
capacity = 27;
currentBreakpoints = capacity * [-0.5,-1.5];
% Measured capacity percent change
percentChangeLowCurrent = [0 0 0;-0.5 -1.5 -3;-1.5 -3 -6.5;-3 -5.5 -10;-4.5 -8.5 -14];
percentChangeCurrent = cat(3,percentChangeLowCurrent,percentChange);为建模电流依赖性老化,将循环老化模型参数设置为 Lookup Tables (temperature and current dependent)。将循环老化数据的电流断点,I 和电芯容量百分比变化,CapacityChange(N,T,I) 参数设置为计算得出的值。
set_param(blockPath,"CyclingAgingMethod","simscape.battery.enum.cells.CyclingAgingMethod.tableNandVariableTandI"); set_param(blockPath,"CapacityChangeThermalI","percentChangeCurrent"); set_param(blockPath,"AgingCurrentBreakpoints","currentBreakpoints");
要启用循环过程中具有可变电流的模型场景,请将 currentVariation 变量设置为 true。然后,对模型进行仿真,并可视化电池容量百分比和电流的变化。
currentVariation = true; simout = sim(modelName,"StopTime","1e6"); % Get the modeled capacity percent change under variable current batteryLoggingNode = simout.simlog.Battery_Equivalent_Circuit; timeVariableCurrent = batteryLoggingNode.capacityCyclingChange.series.time; capacityPercentChangeVariableCurrent = batteryLoggingNode.capacityCyclingChange.series.values; batteryCurrent = batteryLoggingNode.batteryCurrent.series.values("A"); % Visualize the results variableCurrentFigure = figure; tiledlayout(variableCurrentFigure,2,1); nexttile; plot(timeVariableCurrent,capacityPercentChangeVariableCurrent); xlabel("Time [s]"); ylabel("Capacity Percent Change [%]"); title("Capacity Percent Change"); nexttile; plot(timeVariableCurrent,batteryCurrent); xlabel("Time [s]"); ylabel("Current [A]"); title("Current");
![Figure contains 2 axes objects. Axes object 1 with title Capacity Percent Change, xlabel Time [s], ylabel Capacity Percent Change [%] contains an object of type line. Axes object 2 with title Current, xlabel Time [s], ylabel Current [A] contains an object of type line.](../../examples/simscapebattery/win64/ModelingBatteryCyclingAgingExample_04.png)
与循环电流较低的区域相比,循环电流较高的区域表现出加速的容量衰减。