主要内容

本页采用了机器翻译。点击此处可查看英文原文。

从 HPPC 数据估计电池模型参数

自 R2025a 起

本示例演示如何使用 Simscape™ Battery™ 软件,从混合脉冲功率特性 (HPPC) 数据中估计电池等效电路模型 (ECM) 的参数。HPPC 是电池行业中一项重要的技术,也是在电池电芯级或系统级最常进行的电池测试之一。该技术涉及向电池施加一系列恒定电流脉冲,并在不同工况下测量其端电压和温度响应。存在多个关键运行工况,包括初始电池浸泡温度、初始荷电状态 (SOC)、电流或负载、电流方向性(如充电或放电)、健康状态 (SOH) 或剩余容量,以及负载频率。每次电流脉冲测得的电压响应包含有关电池内部电阻或阻抗的宝贵信息。

在此示例中,您首先定义一个hppcTest对象,该对象可用于可视化、制表和操作 HPPC 数据中的不同恒定电流脉冲。HPPCTest 对象包含单个 HPPC 测试程序中执行过的所有当前脉冲的汇总信息。该对象会自动识别每个恒定电流脉冲,并将其制成表格以便检查,同时作为数据预处理中的一个选项,为参数估计过程做好准备。此 HPPC 测试数据必须采用 MAT 文件格式,且必须包含时间、电流和电压信号。按选项,您可以指定温度、电量和 SOC。

随后,您需估计电池 ECM 的参数,使其与电池的端电压响应曲线最匹配。参数估计过程的关键输出是 1-D、2-D 或 3-D 参数查找表。您可以将这些表格用于控制,作为电池管理系统 (BMS) 算法的一部分,或用于仿真,作为Battery Equivalent Circuit模块的参数。

最后,此示例演示了如何自动参数化 Battery Equivalent Circuit 模块以运行电池仿真。

创建并可视化 HPPCTest 对象

一个 HPPCTest 对象会自动识别 HPPC 测试文件中所有独立的恒定电流脉冲。要创建一个 HPPCTest 对象,首先将 HPPC 数据加载到 MATLAB® 工作区中。

load("testDataBAKcells/hppcDataBAKcell25degC.mat","hppcData")

要创建一个 HPPCTest 对象,请使用 hppcTest 函数。默认情况下,HPPCTest 对象假定时间、电压和电流列分别命名为 "Time""Voltage""Current"。如果这些变量具有不同的列名标识符,则可通过选项的名称-值参量来指定它们。

hppcExp25degC = hppcTest(hppcData,...
    TimeVariable="time (s)", ...
    VoltageVariable="voltage (V)", ...
    CurrentVariable="current (A)", ...
    Capacity=2.84, ...
    InitialSOC=0.055);

HPPCTest 对象根据输入的电流测量值,在整个实验过程中自动计算每个时间步的电池 SOC 值。该对象使用这些计算出的 SOC 值来定义每个恒流脉冲的 SOC 断点。TestSummary 属性包含这些 SOC 断点的摘要,以及从数据中识别出的所有其他温度和电流断点。根据选项,为提高 SOC 计算精度,hppcTest 函数允许您指定电池容量、测试初始 SOC 以及以下列向量:

  • Charge - 若指定此列变量且 StateOfCharge 变量为空,则 HPPCTest 对象将使用本列中的值来计算土壤电导率 (SOC) 的断点。

  • StateOfCharge - 若指定此列变量,HPPCTest 对象将使用该列中的值来计算 SOC 断点。

要可视化测试摘要以及已识别的充放电脉冲,请使用plot函数。

plot(hppcExp25degC)

该函数根据以下属性自动识别数据中的充放电恒流脉冲:

  • ValidPulseDurationRange - 有效脉冲持续时间范围,用于指示脉冲是否有效,且必须存储在 TestSummary 属性表中。将上限值降低至 60 秒以下的值,可确保诸如容量检测等极长放电过程不会被纳入最终的脉冲估计列表中。将该属性的下限值提高至超过一两秒的值,可确保函数在最终脉冲列表中排除潜在噪声、异常电流或异常短脉冲,从而实现更精准的估计。

  • ValidVoltageRange - 有效电池电压范围,用于指示脉冲是否有效,且必须存储在 TestSummary 属性表中。

  • CurrentOnThreshold - 阈值电流值,用于指示当前处于充电还是放电状态。该值对于静止电流或基线电流不为零的实验至关重要。

  • NumSamplesRequirement - 连续点数,以标量形式指定,表示电流必须大于 CurrentOnThreshold 值的点数,以表明存在充电或放电脉冲。

您可以根据个人选项自定义这些属性,从而过滤出或仅选择用于参数估计的脉冲。在创建对象后,您也可以使用removePulse函数以手动从 TestSummary 表中移除脉冲,这一选项是可选的。

要查看所有已识别脉冲的摘要,请使用 TestSummary 属性。

disp(hppcExp25degC.TestSummary)
    PulseID    Directionality      SOC           HPPCData         PulseDuration    PseudoOCV_V    MaximumVoltage    MinimumVoltage    Current_A    C_rate    PulseStartIndex    PulseEndIndex    Temperature_degC
    _______    ______________    ________    _________________    _____________    ___________    ______________    ______________    _________    ______    _______________    _____________    ________________

       1        "Discharge"        0.9866    {701×6 timetable}         30            4.1745           4.1745            3.7846         -6.1869     2.1785           354              1055               25       
       2        "Discharge"       0.87612    {701×6 timetable}         30            4.0837           4.0837            3.7479          -6.187     2.1785          2702              3403               25       
       3        "Discharge"       0.76566    {702×6 timetable}         30            4.0132           4.0132            3.6652         -6.1867     2.1784          5049              5751               25       
       4        "Discharge"       0.65521    {701×6 timetable}         30            3.9226           3.9226            3.5775         -6.1868     2.1784          7398              8099               25       
       5        "Discharge"       0.54476    {701×6 timetable}         30             3.846            3.846            3.4942         -6.1868     2.1784          9746             10447               25       
       6        "Discharge"       0.43431    {701×6 timetable}         30            3.7353           3.7353            3.4001         -6.1871     2.1785         12094             12795               25       
       7        "Discharge"       0.32386    {701×6 timetable}         30              3.65             3.65            3.3236         -6.1867     2.1784         14442             15143               25       
       8        "Discharge"        0.2134    {701×6 timetable}         30            3.6015           3.6015            3.2652         -6.1869     2.1785         16790             17491               25       
       9        "Discharge"       0.10295    {701×6 timetable}         30            3.5507           3.5507            3.1931         -6.1869     2.1785         19138             19839               25       
      10        "Charge"           0.9684    {502×6 timetable}         10            4.1158           4.3889            4.1158          4.6393     1.6336          1055              1557               25       
      11        "Charge"          0.85795    {502×6 timetable}         10             4.057           4.3001             4.057          4.6406      1.634          3403              3905               25       
      12        "Charge"          0.74749    {502×6 timetable}         10            3.9674           4.2113            3.9674          4.6394     1.6336          5751              6253               25       
      13        "Charge"          0.63704    {502×6 timetable}         10            3.8751           4.1175            3.8751          4.6396     1.6337          8099              8601               25       
      14        "Charge"          0.52659    {502×6 timetable}         10            3.7905           4.0355            3.7905          4.6396     1.6337         10447             10949               25       
      15        "Charge"          0.41614    {502×6 timetable}         10            3.6936           3.9339            3.6936          4.6405      1.634         12795             13297               25       
      16        "Charge"          0.30569    {502×6 timetable}         10            3.6224           3.8602            3.6224          4.6396     1.6337         15143             15645               25       
      17        "Charge"          0.19523    {502×6 timetable}         10            3.5695           3.8109            3.5695          4.6397     1.6337         17491             17993               25       
      18        "Charge"         0.084783    {502×6 timetable}         10            3.5098           3.7597            3.5098          4.6397     1.6337         19839             20341               25       

您可以通过使用plotPulse函数,可视化 TestSummary 表格中特定脉冲的电压响应。plotPulse 函数可选项地接受第二个参量,该参量用于指定需可视化并检查异常的脉冲索引。此索引指向 TestSummary 属性表中的 PulseID 列。您可以将此索引指定为标量或向量。

使用 plotPulse 函数绘制 HPPCTest 对象中的第一个脉冲。

 plotPulse(hppcExp25degC)

该图展示了给定恒定电流脉冲的不同负载和松弛阶段。通常,电池 ECM 参数会因参数估计过程中所采用的分段不同而有所差异。

通过将向量定义为 plotPulse 函数的第二个参量,您可以在网格布局中可视化不同的脉冲。

 plotPulse(hppcExp25degC,1:4)

您还可以移除行为异常或不符合要求的单个脉冲,包括非线性电压响应、缺失点、电压异常值或异常离散现象。在此 HPPC 数据集中,第三个脉冲可能缺少脉冲开始时的初始静态电压。使用 removePulse 函数将其从参数估计过程中移除。

 removePulse(hppcExp25degC,3)

检查更新后的 TestSummary 属性。请注意,表格中现在只有 17 个脉冲。

disp(hppcExp25degC.TestSummary) 
    PulseID    Directionality      SOC           HPPCData         PulseDuration    PseudoOCV_V    MaximumVoltage    MinimumVoltage    Current_A    C_rate    PulseStartIndex    PulseEndIndex    Temperature_degC
    _______    ______________    ________    _________________    _____________    ___________    ______________    ______________    _________    ______    _______________    _____________    ________________

       1        "Discharge"        0.9866    {701×6 timetable}         30            4.1745           4.1745            3.7846         -6.1869     2.1785           354              1055               25       
       2        "Discharge"       0.87612    {701×6 timetable}         30            4.0837           4.0837            3.7479          -6.187     2.1785          2702              3403               25       
       3        "Discharge"       0.65521    {701×6 timetable}         30            3.9226           3.9226            3.5775         -6.1868     2.1784          7398              8099               25       
       4        "Discharge"       0.54476    {701×6 timetable}         30             3.846            3.846            3.4942         -6.1868     2.1784          9746             10447               25       
       5        "Discharge"       0.43431    {701×6 timetable}         30            3.7353           3.7353            3.4001         -6.1871     2.1785         12094             12795               25       
       6        "Discharge"       0.32386    {701×6 timetable}         30              3.65             3.65            3.3236         -6.1867     2.1784         14442             15143               25       
       7        "Discharge"        0.2134    {701×6 timetable}         30            3.6015           3.6015            3.2652         -6.1869     2.1785         16790             17491               25       
       8        "Discharge"       0.10295    {701×6 timetable}         30            3.5507           3.5507            3.1931         -6.1869     2.1785         19138             19839               25       
       9        "Charge"           0.9684    {502×6 timetable}         10            4.1158           4.3889            4.1158          4.6393     1.6336          1055              1557               25       
      10        "Charge"          0.85795    {502×6 timetable}         10             4.057           4.3001             4.057          4.6406      1.634          3403              3905               25       
      11        "Charge"          0.74749    {502×6 timetable}         10            3.9674           4.2113            3.9674          4.6394     1.6336          5751              6253               25       
      12        "Charge"          0.63704    {502×6 timetable}         10            3.8751           4.1175            3.8751          4.6396     1.6337          8099              8601               25       
      13        "Charge"          0.52659    {502×6 timetable}         10            3.7905           4.0355            3.7905          4.6396     1.6337         10447             10949               25       
      14        "Charge"          0.41614    {502×6 timetable}         10            3.6936           3.9339            3.6936          4.6405      1.634         12795             13297               25       
      15        "Charge"          0.30569    {502×6 timetable}         10            3.6224           3.8602            3.6224          4.6396     1.6337         15143             15645               25       
      16        "Charge"          0.19523    {502×6 timetable}         10            3.5695           3.8109            3.5695          4.6397     1.6337         17491             17993               25       
      17        "Charge"         0.084783    {502×6 timetable}         10            3.5098           3.7597            3.5098          4.6397     1.6337         19839             20341               25       

修改 SOC 断点

若您不具备电池容量、SOC 状态或电量等信息,可通过setChargeSOCssetDischargeSOCs函数在 TestSummary 属性表中,使用自定义修改 SOC 状态值的选项。

 setChargeSOCs(hppcExp25degC,[1,0.9,0.8,0.6,0.5,0.4,0.3,0.2,0.1]);
 setDischargeSOCs(hppcExp25degC,[1,0.9,0.7,0.5,0.4,0.3,0.2,0.1]);

检查更新后的 TestSummary 属性表。请注意,这些函数修改了 SOC 断点。

disp(hppcExp25degC.TestSummary)
    PulseID    Directionality    SOC        HPPCData         PulseDuration    PseudoOCV_V    MaximumVoltage    MinimumVoltage    Current_A    C_rate    PulseStartIndex    PulseEndIndex    Temperature_degC
    _______    ______________    ___    _________________    _____________    ___________    ______________    ______________    _________    ______    _______________    _____________    ________________

       1        "Discharge"        1    {701×6 timetable}         30            4.1745           4.1745            3.7846         -6.1869     2.1785           354              1055               25       
       2        "Discharge"      0.9    {701×6 timetable}         30            4.0837           4.0837            3.7479          -6.187     2.1785          2702              3403               25       
       3        "Discharge"      0.7    {701×6 timetable}         30            3.9226           3.9226            3.5775         -6.1868     2.1784          7398              8099               25       
       4        "Discharge"      0.5    {701×6 timetable}         30             3.846            3.846            3.4942         -6.1868     2.1784          9746             10447               25       
       5        "Discharge"      0.4    {701×6 timetable}         30            3.7353           3.7353            3.4001         -6.1871     2.1785         12094             12795               25       
       6        "Discharge"      0.3    {701×6 timetable}         30              3.65             3.65            3.3236         -6.1867     2.1784         14442             15143               25       
       7        "Discharge"      0.2    {701×6 timetable}         30            3.6015           3.6015            3.2652         -6.1869     2.1785         16790             17491               25       
       8        "Discharge"      0.1    {701×6 timetable}         30            3.5507           3.5507            3.1931         -6.1869     2.1785         19138             19839               25       
       9        "Charge"           1    {502×6 timetable}         10            4.1158           4.3889            4.1158          4.6393     1.6336          1055              1557               25       
      10        "Charge"         0.9    {502×6 timetable}         10             4.057           4.3001             4.057          4.6406      1.634          3403              3905               25       
      11        "Charge"         0.8    {502×6 timetable}         10            3.9674           4.2113            3.9674          4.6394     1.6336          5751              6253               25       
      12        "Charge"         0.6    {502×6 timetable}         10            3.8751           4.1175            3.8751          4.6396     1.6337          8099              8601               25       
      13        "Charge"         0.5    {502×6 timetable}         10            3.7905           4.0355            3.7905          4.6396     1.6337         10447             10949               25       
      14        "Charge"         0.4    {502×6 timetable}         10            3.6936           3.9339            3.6936          4.6405      1.634         12795             13297               25       
      15        "Charge"         0.3    {502×6 timetable}         10            3.6224           3.8602            3.6224          4.6396     1.6337         15143             15645               25       
      16        "Charge"         0.2    {502×6 timetable}         10            3.5695           3.8109            3.5695          4.6397     1.6337         17491             17993               25       
      17        "Charge"         0.1    {502×6 timetable}         10            3.5098           3.7597            3.5098          4.6397     1.6337         19839             20341               25       

估计电池模型参数

参数估计过程涉及最小化 ECM 预测电压输出与 HPPC 测试中测得的电池电压响应之间的误差。本表列出了用于表示电池阻抗的最典型电化学模型:

为最小化误差,需反复调整模型参数(如 R0R1C1),直至测量电压与仿真电压之间的误差达到满意水平。在 MATLAB 中存在若干技术,可在 Model-Based Calibration Toolbox™、System Identification Toolbox™ 和 Curve Fitting Toolbox™ 内部实现此函数。在此示例中,您通过使用 Simscape™ Battery™ 中实现的基于优化的拟合方法来估计电池模型的参数。该拟合方法采用对 fminsearch 函数的自定义实现。

针对特定工作点的电池 ECM 参数可能存在差异,这取决于参数估计过程中所采用的电流脉冲段或区段。负载分段参数适用于大多数应用场景。然而,最佳估计区间取决于电池 ECM 的具体终端应用场景。某些方法更适合估计特定区段的参数,例如 System Identification Toolbox tfest 函数最适用于拟合纯负载动力学。本表根据所选工具箱或方法,汇总了fitecm函数中 FittingMethodSegmentToFit 参量支持的选项。

单电流脉冲的估计参数

hppcExp25degC 对象内部总共包含 17 个恒定电流脉冲。要估计测试数据中特定恒定电流脉冲配置文件的 ECM 参数,首先需定义您要获取 ECM 参数的脉冲索引。此索引关联于 TestSummary 属性表中的特定行。

pulseIndex = 5;

要查找 ECM 参数,请使用 fitECM 函数。此函数需要 HPPC 测试数据作为输入。FittingMethod 参量的默认值是 "fminsearch",该值对应于 Simscape Battery 中实现的优化方法。SegmentToFit 参量的默认值值侧重于恒定电流脉冲的放松段。fitECM 函数的 FittingMethod 参量提供多种选项,可用于对脉冲的不同段执行参数估计过程。

batteryEcm = fitECM(hppcExp25degC.TestSummary.HPPCData{pulseIndex}(:,1:2), SegmentToFit="loadAndRelaxation"); 

fitECM 函数返回一个 ecm 对象。查看 ECM 拓扑及其他 ECM 对象属性。

disp(batteryEcm)

您可以为 fitECM 函数定义选项的名称-值参量。例如,ECM 名称-值参量指定了您希望用于拟合数据的 ECM 电路拓扑。若未指定此参量,fitECM 函数将采用以下双 RC 分支 ECM 拓扑:

使用plot函数可可视化测量和仿真的电池 ECM 电压响应。该绘图函数通过假设恒定的开路电压值,计算出仿真电池 ECM 电压响应曲线。在大多数情况下,在仿真过程中加入动态开路电压曲线可提高验证图的准确性。

 plot(batteryEcm)

脉冲序列的估计参数

要估计特定 HPPCTest 对象内所有脉冲的 ECM 参数,请使用 fitECM 函数,并将整个 HPPCTest 对象指定为输入。

batteryEcm = fitECM(hppcExp25degC, SegmentToFit="loadAndRelaxation"); 

使用 batteryEcm 对象的 TestParameterTables 属性显示参数和估计误差。

disp(batteryEcm.TestParameterTables)
                TestBreakpoints: [1×1 struct]
       ChargeOpenCircuitVoltage: [3.5098 3.5695 3.6224 3.6936 3.7905 3.8751 3.9674 4.0570 4.1158]
                       ChargeR0: [0.0390 0.0382 0.0378 0.0392 0.0371 0.0369 0.0370 0.0397 0.0403]
                       ChargeR1: [0.0072 0.0067 0.0069 0.0049 0.0066 0.0065 0.0067 0.0052 0.0091]
                     ChargeTau1: [0.3751 0.3774 0.3982 0.3797 0.3286 0.3317 0.3874 0.3967 0.3551]
                       ChargeC1: [51.9419 56.5704 57.6792 76.7624 49.7476 51.0375 58.1648 76.3596 39.2237]
                       ChargeR2: [0.0103 0.0095 0.0644 0.0117 0.0129 0.0115 0.0114 0.0089 0.0154]
                     ChargeTau2: [9.5365 9.4661 24.1822 10.3457 8.3771 8.2633 8.6700 8.5273 9.3994]
                       ChargeC2: [921.5608 995.1325 375.6581 883.1525 649.5546 715.9945 761.9383 962.1568 612.1307]
                    ChargeFitPc: [2.3798e-05 2.1926e-05 8.9156e-05 2.5623e-05 2.9595e-05 2.7463e-05 2.9163e-05 2.8058e-05 3.7073e-05]
    DischargeOpenCircuitVoltage: [3.5507 3.6015 3.6500 3.7353 3.8460 3.9226 4.0837 4.1745]
                    DischargeR0: [0.0433 0.0418 0.0411 0.0408 0.0407 0.0406 0.0422 0.0407]
                    DischargeR1: [0.0017 0.0015 0.0016 0.0020 0.0024 0.0024 0.0023 0.0080]
                  DischargeTau1: [1.0136 1.0639 1.0778 1.1318 1.1306 1.1331 1.1418 0.6206]
                    DischargeC1: [587.1147 686.9393 670.4352 556.3512 467.1310 475.4616 489.4226 77.6454]
                    DischargeR2: [0.0180 0.0141 0.0122 0.0129 0.0146 0.0138 0.0108 0.0127]
                  DischargeTau2: [23.0014 21.2042 20.0352 20.7300 20.4551 19.9010 17.9218 15.9518]
                    DischargeC2: [1.2760e+03 1.5031e+03 1.6366e+03 1.6042e+03 1.3996e+03 1.4436e+03 1.6628e+03 1.2560e+03]
                 DischargeFitPc: [2.7466e-05 1.9487e-05 2.0726e-05 2.9118e-05 4.3007e-05 4.1371e-05 3.7379e-05 1.6776e-04]

TestParameterTables 属性内的参数与 ModelParameterTables 属性内的参数不同。ECM 对象通过使用您指定的 ECM 对象断点来确定 ModelParameterTables 属性内的参数。ECM 对象通过测试条件确定 TestParameterTables 属性内的参数。使用 ModelParameterTables 属性查看模型参数表。

disp(batteryEcm.ModelParameterTables)
       ChargeOpenCircuitVoltage: [3.5098 3.5098 3.5695 3.6224 3.6936 3.7905 3.8751 3.9674 3.9674 4.0570 4.1158]
                       ChargeR0: [0.0390 0.0390 0.0382 0.0378 0.0392 0.0371 0.0369 0.0370 0.0370 0.0397 0.0403]
                       ChargeR1: [0.0072 0.0072 0.0067 0.0069 0.0049 0.0066 0.0065 0.0067 0.0067 0.0052 0.0091]
                     ChargeTau1: [0.3751 0.3751 0.3774 0.3982 0.3797 0.3286 0.3317 0.3874 0.3874 0.3967 0.3551]
                       ChargeC1: [51.9419 51.9419 56.5704 57.6792 76.7624 49.7476 51.0375 58.1648 58.1648 76.3596 39.2237]
                       ChargeR2: [0.0103 0.0103 0.0095 0.0644 0.0117 0.0129 0.0115 0.0114 0.0114 0.0089 0.0154]
                     ChargeTau2: [9.5365 9.5365 9.4661 24.1822 10.3457 8.3771 8.2633 8.6700 8.6700 8.5273 9.3994]
                       ChargeC2: [921.5608 921.5608 995.1325 375.6581 883.1525 649.5546 715.9945 761.9383 761.9383 962.1568 612.1307]
                    ChargeFitPc: [2.3798e-05 2.3798e-05 2.1926e-05 8.9156e-05 2.5623e-05 2.9595e-05 2.7463e-05 2.9163e-05 2.9163e-05 2.8058e-05 3.7073e-05]
    DischargeOpenCircuitVoltage: [3.5507 3.5507 3.6015 3.6500 3.7353 3.8460 3.9226 3.9226 4.0837 4.0837 4.1745]
                    DischargeR0: [0.0433 0.0433 0.0418 0.0411 0.0408 0.0407 0.0406 0.0406 0.0422 0.0422 0.0407]
                    DischargeR1: [0.0017 0.0017 0.0015 0.0016 0.0020 0.0024 0.0024 0.0024 0.0023 0.0023 0.0080]
                  DischargeTau1: [1.0136 1.0136 1.0639 1.0778 1.1318 1.1306 1.1331 1.1331 1.1418 1.1418 0.6206]
                    DischargeC1: [587.1147 587.1147 686.9393 670.4352 556.3512 467.1310 475.4616 475.4616 489.4226 489.4226 77.6454]
                    DischargeR2: [0.0180 0.0180 0.0141 0.0122 0.0129 0.0146 0.0138 0.0138 0.0108 0.0108 0.0127]
                  DischargeTau2: [23.0014 23.0014 21.2042 20.0352 20.7300 20.4551 19.9010 19.9010 17.9218 17.9218 15.9518]
                    DischargeC2: [1.2760e+03 1.2760e+03 1.5031e+03 1.6366e+03 1.6042e+03 1.3996e+03 1.4436e+03 1.4436e+03 1.6628e+03 1.6628e+03 1.2560e+03]
                 DischargeFitPc: [2.7466e-05 2.7466e-05 1.9487e-05 2.0726e-05 2.9118e-05 4.3007e-05 4.1371e-05 4.1371e-05 3.7379e-05 3.7379e-05 1.6776e-04]

要查看所有估计参数的完整摘要,请使用 batteryECM 对象的 ParameterSummary 属性。

disp(batteryEcm.ParameterSummary)
    ID    Directionality      SOC       Temperature_degC    Current_A    OpenCircuitVoltage       R0          R1         Tau1        C1         R2         Tau2       C2        FitPc   
    __    ______________    ________    ________________    _________    __________________    ________    _________    _______    ______    _________    ______    ______    __________

     1     "Discharge"        0.9866           25            -6.1869           4.1745          0.040675    0.0079921    0.62055    77.645       0.0127    15.952      1256    0.00016776
     2     "Discharge"       0.87612           25             -6.187           4.0837          0.042195    0.0023329     1.1418    489.42     0.010778    17.922    1662.8    3.7379e-05
     3     "Discharge"       0.65521           25            -6.1868           3.9226          0.040602    0.0023832     1.1331    475.46     0.013786    19.901    1443.6    4.1371e-05
     4     "Discharge"       0.54476           25            -6.1868            3.846          0.040721    0.0024203     1.1306    467.13     0.014615    20.455    1399.6    4.3007e-05
     5     "Discharge"       0.43431           25            -6.1871           3.7353          0.040839    0.0020343     1.1318    556.35     0.012923     20.73    1604.2    2.9118e-05
     6     "Discharge"       0.32386           25            -6.1867             3.65          0.041133    0.0016076     1.0778    670.44     0.012242    20.035    1636.6    2.0726e-05
     7     "Discharge"        0.2134           25            -6.1869           3.6015          0.041807    0.0015487     1.0639    686.94     0.014107    21.204    1503.1    1.9487e-05
     8     "Discharge"       0.10295           25            -6.1869           3.5507          0.043282    0.0017264     1.0136    587.11     0.018026    23.001      1276    2.7466e-05
     9     "Charge"           0.9684           25             4.6393           4.1158          0.040273    0.0090541    0.35513    39.224     0.015355    9.3994    612.13    3.7073e-05
    10     "Charge"          0.85795           25             4.6406            4.057          0.039702    0.0051946    0.39666     76.36    0.0088627    8.5273    962.16    2.8058e-05
    11     "Charge"          0.74749           25             4.6394           3.9674          0.036987    0.0066604     0.3874    58.165     0.011379      8.67    761.94    2.9163e-05
    12     "Charge"          0.63704           25             4.6396           3.8751          0.036877     0.006499    0.33169    51.037     0.011541    8.2633    715.99    2.7463e-05
    13     "Charge"          0.52659           25             4.6396           3.7905            0.0371    0.0066046    0.32856    49.748     0.012897    8.3771    649.55    2.9595e-05
    14     "Charge"          0.41614           25             4.6405           3.6936          0.039245    0.0049462    0.37968    76.762     0.011715    10.346    883.15    2.5623e-05
    15     "Charge"          0.30569           25             4.6396           3.6224          0.037844    0.0069032    0.39817    57.679     0.064373    24.182    375.66    8.9156e-05
    16     "Charge"          0.19523           25             4.6397           3.5695          0.038239    0.0066714     0.3774     56.57    0.0095124    9.4661    995.13    2.1926e-05
    17     "Charge"         0.084783           25             4.6397           3.5098          0.038967    0.0072218    0.37511    51.942     0.010348    9.5365    921.56    2.3798e-05

要验证每个特定电流脉冲拟合的准确性,请使用 plot 函数。plot 函数以选项接受第二个参量,该参量指定要可视化的脉冲拟合的索引。此索引指向位于 ParameterSummary 属性表内的 PulseID 列。您可以将此索引指定为标量或向量。

绘制前四个放电脉冲的拟合曲线。

plot(batteryEcm,1:4)

绘制电荷脉冲 10、11、12 和 13 的拟合曲线。

plot(batteryEcm,10:13)

一旦确定了 ECM 阻抗参数,为进行参数验证,即可对整个 HPPCTest 进行仿真。fitECM 函数仅对数据中的阻抗和开路电压参数进行拟合。如果测试未能覆盖电池的完整 SOC 范围,则在这些测试区域中验证结果将显示为不正确。

为验证所得模型与 HPPC 测试数据的匹配度,仅需选取测试中包含脉冲的部分。

data = hppcData((300:21475),:);
data.("time (s)") = data.("time (s)")-data.("time (s)")(1);
hppcExp25degCSim = hppcTest(data, ...
    TimeVariable="time (s)", ...
    VoltageVariable="voltage (V)", ...
    CurrentVariable="current (A)", ...
    Capacity=2.84, ...
    InitialSOC=1);

使用simulateHPPCTest函数可视化模型验证过程。

simulateHPPCTest(batteryEcm,hppcExp25degCSim)

或者,您可以尝试不同的 ECM 拓扑以获得更佳匹配效果。创建一个 ECM 对象,并指定所需的并联电阻-电容对数量。

battery3RCECM = ecm(3);

要估计此 ECM 对象的模型参数,请使用 fitECM 函数。

battery3RCECM = fitECM(hppcExp25degC,ECM=battery3RCECM, ...
    SegmentToFit="loadAndRelaxation"); 

要验证每个特定电流脉冲拟合的准确性,请使用 plot 函数。

plot(battery3RCECM,1:4)

单电阻器或 DC 内阻 (DCIR) 表格

电池行业广泛使用 DC 电阻表。创建一个不包含并联电阻电容对的 ECM 对象。该拓扑代表一个单电阻器。

batteryECMSingleRes = ecm(0);

使用 fitECM 函数估计此 ECM 的模型参数。

batteryECMSingleRes = fitECM(hppcExp25degC,ECM=batteryECMSingleRes);

ECM 会根据脉冲持续时间,在不同时间尺度上自动填充 DCIR。fitECM 函数使用以下时间框架:2 秒,5 秒,10 秒,30 秒,60 秒。例如,如果脉冲持续时间小于 60 秒,则 fitECM 函数不会将该 DCIR 值包含在输出表中。

要查看所有 DCIR 表格,请使用 batteryECMSingleRes 对象的 TestParameterTables 属性。

disp(batteryECMSingleRes.TestParameterTables)
                TestBreakpoints: [1×1 struct]
       ChargeOpenCircuitVoltage: [3.5098 3.5695 3.6224 3.6936 3.7905 3.8751 3.9674 4.0570 4.1158]
                   ChargeDCIR2s: [0.0482 0.0467 0.0461 0.0458 0.0460 0.0458 0.0461 0.0470 0.0513]
                   ChargeDCIR5s: [0.0507 0.0491 0.0483 0.0484 0.0490 0.0487 0.0490 0.0495 0.0545]
                       ChargeR0: [0.0507 0.0491 0.0483 0.0484 0.0490 0.0487 0.0490 0.0495 0.0545]
                    ChargeFitPc: [100 100 100 100 100 100 100 100 100]
    DischargeOpenCircuitVoltage: [3.5507 3.6015 3.6500 3.7353 3.8460 3.9226 4.0837 4.1745]
                DischargeDCIR2s: [0.0463 0.0448 0.0442 0.0450 0.0459 0.0456 0.0467 0.0525]
                DischargeDCIR5s: [0.0484 0.0467 0.0460 0.0470 0.0483 0.0480 0.0486 0.0552]
                    DischargeR0: [0.0484 0.0467 0.0460 0.0470 0.0483 0.0480 0.0486 0.0552]
                 DischargeFitPc: [100 100 100 100 100 100 100 100]

HPPCTest 对象套件的估计参数

您可以在多种不同条件下执行电池 HPPC 测试,包括温度、SOC、电流和剩余容量。然后,您可以将这些测试存储在多个文件中。Simscape™ Battery™ 将多个 HPPC 测试文件作为 HPPC 测试套件进行引用。HPPC 测试套件通常根据每个电流脉冲开始时的电池温度进行分类,该温度在不同的 SOC 值和负载电流下保持恒定。在其他情况下,电池的初始温度也可能因测试设置和热环境的不同而在特定测试文件内产生差异。

在 Simscape™ Battery™ 中,您可以通过合并不同的电池 ECM 对象或使用 hppcTestSuite 对象,为一组 HPPC 测试估计多维参数表。

合并电池 ECM 对象

您可以在不同温度、SOC 值或电流条件下对不同的 HPPCTest 对象执行参数估计,随后将所得参数合并为单个 ECM 对象,该对象包含一组多维参数表的单个值。在本节中,您将估计在 0°C 条件下进行的高压脉冲腐蚀 (HPPC) 测试的电化学模型 (ECM) 参数。首先加载 HPPC 数据。

load("testDataBAKcells/hppcDataBAKcell0degC.mat")

使用 hppcTest 函数创建 HPPCTest 对象。

hppcExp0degC = hppcTest( hppcData,... 
    TimeVariable="time (s)",...
    VoltageVariable="voltage (V)",...
    CurrentVariable="current (A)",...
    Temperature=zeros(numel(hppcData(:,1)),1));

使用 fitECM 函数估计 ECM 参数。

batteryECM0degC = fitECM(hppcExp0degC, ...
    SegmentToFit="loadAndRelaxation");

您之前创建的 batteryEcm 对象代表 25°C 下的 ECM。可通过mergeModelParameters函数将 0°C HPPC 测试参数添加或合并至 25°C 模型中。

batteryEcm = mergeModelParameters(batteryEcm,batteryECM0degC);

可视化合并模型的测试参数表。

disp(batteryEcm.TestParameterTables)
                       TestBreakpoints: [1×1 struct]
       ChargeOpenCircuitVoltageThermal: [2×14 double]
                       ChargeR0Thermal: [2×14 double]
                       ChargeR1Thermal: [2×14 double]
                     ChargeTau1Thermal: [2×14 double]
                       ChargeC1Thermal: [2×14 double]
                       ChargeR2Thermal: [2×14 double]
                     ChargeTau2Thermal: [2×14 double]
                       ChargeC2Thermal: [2×14 double]
                    ChargeFitPcThermal: [2×14 double]
    DischargeOpenCircuitVoltageThermal: [2×15 double]
                    DischargeR0Thermal: [2×15 double]
                    DischargeR1Thermal: [2×15 double]
                  DischargeTau1Thermal: [2×15 double]
                    DischargeC1Thermal: [2×15 double]
                    DischargeR2Thermal: [2×15 double]
                  DischargeTau2Thermal: [2×15 double]
                    DischargeC2Thermal: [2×15 double]
                 DischargeFitPcThermal: [2×15 double]

验证测试断点是否如预期设置为 0°C 和 25°C。

disp(batteryEcm.TestParameterTables.TestBreakpoints.ResistanceTemperatureBreakpoints)
     0
    25

检查 TestParameterTables 属性的 ChargeR0Thermal 参数值。

disp(batteryEcm.TestParameterTables.ChargeR0Thermal)
    0.0496    0.0502    0.0509    0.0501    0.0510    0.0501    0.0500    0.0502    0.0507    0.0491    0.0501    0.0459    0.0490    0.0403
    0.0384    0.0383    0.0383    0.0383    0.0384    0.0384    0.0382    0.0385    0.0390    0.0390    0.0400    0.0400    0.0403    0.0403

使用 HPPCTestSuite 对象

要为一组高压高温压力 (HPPC) 测试估计多维参数表,首先加载在 10 °C、35 °C 和 45 °C 条件下进行的实验的 HPPC 文件,然后创建不同的 HPPCTest 对象。

load("testDataBAKcells/hppcDataBAKcell10degC.mat")
hppcExp10degC = hppcTest(hppcData, ...
    TimeVariable="time (s)", ...
    VoltageVariable="voltage (V)", ...
    CurrentVariable="current (A)", ...
    Temperature=repmat(10,numel(hppcData(:,1)),1));
load("testDataBAKcells/hppcDataBAKcell35degC.mat")
hppcExp35degC = hppcTest(hppcData, ...
    TimeVariable="time (s)", ...
    VoltageVariable="voltage (V)", ...
    CurrentVariable="current (A)", ...
    Temperature=repmat(35,numel(hppcData(:,1)),1));
load("testDataBAKcells/hppcDataBAKcell45degC.mat")
hppcExp45degC = hppcTest(hppcData, ...
    TimeVariable="time (s)", ...
    VoltageVariable="voltage (V)", ...
    CurrentVariable="current (A)", ...
    Temperature=repmat(45,numel(hppcData(:,1)),1));

要创建一个 HPPCTestSuite 对象,请使用 hppcTestSuite 函数。

hppcSuite = hppcTestSuite([hppcExp0degC;hppcExp10degC;hppcExp25degC;hppcExp35degC;hppcExp45degC], ...
    Temperature=[0;10;25;35;45]);
disp(hppcSuite.SuiteSummary)
    TestID                      Test                      Temperature    NumPulses
    ______    ________________________________________    ___________    _________

      1       1×1 simscape.battery.parameters.HPPCTest         0            18    
      2       1×1 simscape.battery.parameters.HPPCTest        10            18    
      3       1×1 simscape.battery.parameters.HPPCTest        25            17    
      4       1×1 simscape.battery.parameters.HPPCTest        35            18    
      5       1×1 simscape.battery.parameters.HPPCTest        45            19    

要使用默认 ECM 估计 HPPCTestSuite 对象的模型参数,请使用 fitECM 函数。

batteryEcm = fitECM(hppcSuite);

fitECM 函数估计每个脉冲的参数,并将结果参数存储在 TestParameterTables 属性中。

disp(batteryEcm.TestParameterTables)
                       TestBreakpoints: [1×1 struct]
       ChargeOpenCircuitVoltageThermal: [5×25 double]
                       ChargeR0Thermal: [5×25 double]
                       ChargeR1Thermal: [5×25 double]
                     ChargeTau1Thermal: [5×25 double]
                       ChargeC1Thermal: [5×25 double]
                       ChargeR2Thermal: [5×25 double]
                     ChargeTau2Thermal: [5×25 double]
                       ChargeC2Thermal: [5×25 double]
                    ChargeFitPcThermal: [5×25 double]
    DischargeOpenCircuitVoltageThermal: [5×25 double]
                    DischargeR0Thermal: [5×25 double]
                    DischargeR1Thermal: [5×25 double]
                  DischargeTau1Thermal: [5×25 double]
                    DischargeC1Thermal: [5×25 double]
                    DischargeR2Thermal: [5×25 double]
                  DischargeTau2Thermal: [5×25 double]
                    DischargeC2Thermal: [5×25 double]
                 DischargeFitPcThermal: [5×25 double]

这些参数表可能与您在 Simscape Battery 中使用的最终模型参数不同。差异在于您为 ECM 对象指定的断点属性。查看 ModelParameterTables 属性。

disp(batteryEcm.ModelParameterTables)
       ChargeOpenCircuitVoltageThermal: [3×11 double]
                       ChargeR0Thermal: [3×11 double]
                       ChargeR1Thermal: [3×11 double]
                     ChargeTau1Thermal: [3×11 double]
                       ChargeC1Thermal: [3×11 double]
                       ChargeR2Thermal: [3×11 double]
                     ChargeTau2Thermal: [3×11 double]
                       ChargeC2Thermal: [3×11 double]
                    ChargeFitPcThermal: [3×11 double]
    DischargeOpenCircuitVoltageThermal: [3×11 double]
                    DischargeR0Thermal: [3×11 double]
                    DischargeR1Thermal: [3×11 double]
                  DischargeTau1Thermal: [3×11 double]
                    DischargeC1Thermal: [3×11 double]
                    DischargeR2Thermal: [3×11 double]
                  DischargeTau2Thermal: [3×11 double]
                    DischargeC2Thermal: [3×11 double]
                 DischargeFitPcThermal: [3×11 double]

您可以通过更新 batteryECM 对象的 ResistanceTemperatureBreakpoints 属性来手动更改电阻断点。

batteryEcm.ResistanceTemperatureBreakpoints = simscape.Value([0,10,25,35,45]+273.15,"K");

查看更新后的 ModelParameterTables 属性。

disp(batteryEcm.ModelParameterTables)
       ChargeOpenCircuitVoltageThermal: [3×11 double]
                       ChargeR0Thermal: [5×11 double]
                       ChargeR1Thermal: [5×11 double]
                     ChargeTau1Thermal: [5×11 double]
                       ChargeC1Thermal: [5×11 double]
                       ChargeR2Thermal: [5×11 double]
                     ChargeTau2Thermal: [5×11 double]
                       ChargeC2Thermal: [5×11 double]
                    ChargeFitPcThermal: [5×11 double]
    DischargeOpenCircuitVoltageThermal: [3×11 double]
                    DischargeR0Thermal: [5×11 double]
                    DischargeR1Thermal: [5×11 double]
                  DischargeTau1Thermal: [5×11 double]
                    DischargeC1Thermal: [5×11 double]
                    DischargeR2Thermal: [5×11 double]
                  DischargeTau2Thermal: [5×11 double]
                    DischargeC2Thermal: [5×11 double]
                 DischargeFitPcThermal: [5×11 double]

使用 plotModelParameters 函数查看模型参数。

batteryEcm.plotModelParameters();

参数化 Battery Equivalent Circuit 模块

在参数化工作流的最后一步,您可以对 Battery Equivalent Circuit 模块进行参数化设置。此参数化设置使您能够在 Simulink® 中运行电池仿真。要创建新的 Simulink 电池模型并添加 Battery Equivalent Circuit 模块,请使用 createBatteryModel 脚本。

if ~exist("batteryModel", 'file')
run("createBatteryModel.m")
end

在对模块进行参数化之前,必须使用getSimulinkBlockHandle函数获取模块句柄。

batteryBlockHandle = getSimulinkBlockHandle('batteryModel/Battery01');

要自动参数化 Battery Equivalent Circuit 模块,请使用 parameterizeEquivalentCircuitBlock 函数。

batteryEcm.parameterizeEquivalentCircuitBlock(batteryBlockHandle,...
    ParameterizePseudoOCV=true)

打开 Battery Equivalent Circuit 模块掩码,以验证最终模型是否包含正确的参数表。

另请参阅

| | | | | | | | | | | | |

主题