This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28379D:使用 CLA 的多个顺序 PI 环路

Guru**** 2587365 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1127515/tms320f28379d-multiple-sequential-pi-loops-using-cla

器件型号:TMS320F28379D

您好!

我想使用 CLA 实现3个 PI 环路。 循环是顺序的、第一个循环的输出是输入到第二个循环、第二个循环的输出是输入到第三个循环。

我创建了3个 DCL_PI_CLA 实例、并使用每个循环的值初始化所有实例

问题1:

我可以 在一个任务中将函数"DCL_runPI_L1"调用3次吗? 还是应该有3个不同的任务任务任务任务1、任务2和任务3? 我已经尝试过这两种方法、但我只能看到第一个循环在使用 uk1时根据 rk1中的变化改变其值。 uk2和 uk3最初为零、然后直接跳转到1 (当 rk1发生更改时)、之后完全不会更改。 uk1逐渐变化并达到1。

uk1 = DCL_runPI_L1 (&pi1、rk1、yk1);

uk2 = DCL_runPI_L1 (&Pi2、RK2、yk2);

uk3 = DCL_runPI_L1 (&PI3、rk3、yk3);

问题2:

我希望它们根据 EPWM2模块以一定的频率运行 CLA、因此我将触发源定义如下

CLA_setTriggerSource (CLA_task_1、CLA_TRIGGER_EPWM2INT);
CLA_setTriggerSource (CLA_task_2、CLA_TRIGGER_EPWM2INT);
CLA_setTriggerSource (CLA_task_3、CLA_TRIGGER_EPWM2INT);

是否有办法在第一个环路完成时触发第二个环路、并在第一个环路完成时类似地触发第三个环路?

问题3:

即使 CLA 正在计算并且我可以在观察窗口中看到 uk1值发生变化、调试窗口显示 CLA 被暂停。 它应该是这样吗?  

如果我按下运行按钮、控制台中会出现以下错误

问题4:

是否有单独的 DCL_PI_L1架构图? 此图中未找到 L1函数代码中使用的一些变量、例如 i6。 我正在尝试找到我需要分配积分器增益的变量、该增益将与之前的积分器输出相乘。

积分器输出+=增益*上一个积分器输出

其中先前积分器输出=误差* Ki   (误差= rk - YK)

您能否给我指出我应该为其分配此"增益"值的变量? 它是 i6、i10还是其他东西?

  

此致、

Rashmitha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Rashmika、

    很抱歉、我迟到了回复:

    [引用 userid="493381" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1127515/tms320f28379d-multiple-sequaling-pi-loops-using-cla]I 能否 在一个任务中3次调用函数"DCL_runpi_l1"? [/报价]

    是的、您可以这样做、但这应该起作用。 您可能需要进行调试、以了解这些值为何不符合预期。 在每个 PI 调用之间添加一个 mdebugstop 指令、以使 CLA 停止执行、以便您可以检查和调试意外值。

    [引用 userid="493381" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forume/1127515/tms320f28379d-multiple-sequaling-pi-loops-using-cla"]

    CLA_setTriggerSource (CLA_task_1、CLA_TRIGGER_EPWM2INT);
    CLA_setTriggerSource (CLA_task_2、CLA_TRIGGER_EPWM2INT);
    CLA_setTriggerSource (CLA_task_3、CLA_TRIGGER_EPWM2INT);

    是否有办法在第一个环路完成时触发第二个环路、并在第一个环路完成时类似地触发第三个环路?

    [/报价]

    由于按照硬件优先级同时触发所有3个循环、由于任务1 > 2 > 3的优先级、任务1应在任务2和3挂起时开始执行、任务2应在任务1完成后开始执行。 同样、任务3应在任务2完成后执行。 这种情况可能不会发生的唯一情况是、在任务1执行期间、它被触发并再次被挂起、在这种情况下、任务1将在任务1完成后再次执行。

    [引用 userid="493381" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1127515/tms320f28379d-multiple-sequaling-pi-loops-using-cla]CLA 即使 CLA 正在计算并且我可以在观察窗口中看到 uk1值发生变化、调试窗口也会显示 CLA 已暂停。 [/报价]

    您能否检查并确保分配给 CLA 的所有 LS RAM 在初始化代码中均已正确配置、并按照链接器命令文件中的定义分配给 CLA 用于程序或数据? 听起来 LS RAM 存储器未按预期初始化。

    [引用 userid="493381" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1127515/tms320f28379d-multiple-sequaling-pi-loops-using-cla"]是否单独有 DCL_pi_L1架构图?

    我将与 DCL 专家联系并告知您。

    谢谢、

    Ashwini

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="84566" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1127515/tms320f28379d-multiple-sequaling-pi-loops-using-cla/4184873#4184873"]在每个调用之间添加一个 mdebugstop 指令,以便检查意外的执行值并停止 PI[]。

    1.我可以看到程序在每个 mdebugstop 语句上停止,但是 uk2和 uk3值没有像 uk1那样从0升级到1。

    即使我将函数顺序更改为首先调用 uk3、然后分别调用 uk2和 uk1、我也只看到 uk1的运行方式符合预期。 其他两个值直接跳转到1、就像 PI 控制器的积分器部分在第一次迭代本身中饱和一样。 另一个问题是、如果出现负面反馈、uk1将从1返回到0。 但是,uk2和 uk3的情况并非如此;一旦达到1,它们就永远不会递减,并停留在1。

    2.当我单步 执行_DCL_runPI_L1时、我在寄存器窗口中看到 MR0、MR1、MR2根本没有更新。 是否有一条使能语句单独阻止这些寄存器写入? MAR0和 MPC 工作正常。

      

    [引用 userid="493381" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1127515/tms320f28379d-multiple-sequaling-pi-loops-using-cla]cla_setTriggerSource (cla_task_1、cla_trigger_EPWM2INT);
    CLA_setTriggerSource (CLA_task_2、CLA_TRIGGER_EPWM2INT);
    CLA_setTriggerSource (CLA_task_3、CLA_TRIGGER_EPWM2INT);[/引用]

    3.您能否建议这些线路的替代方案? 我想使用 EPWM2 INT 触发源触发任务1、但对于任务2和3、我想提到完成之前的任务作为触发源。

    [引用 userid="84566" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1127515/tms320f28379d-multiple-sequaling-pi-loops-using-cla/4184873#4184873"]您能否检查并确保在引用中正确地将所有 LS/RAM 配置为 CLA 初始化代码[引用]

    4.下面是我 的 configClaMemory()函数中配置 LS4_5和 LS 0 & 1的行,我使用 的是2837xD_FLASH_CLA_lnk_CPU1.cmd C2000提供的 CMD 文件,其中增加了一些缺少扇区名称的内容。

    //
    // Initialize and wait for CLA1ToCPUMsgRAM
    //
    MemCfg_initSections(MEMCFG_SECT_MSGCLA1TOCPU);
    while (!MemCfg_getInitStatus(MEMCFG_SECT_MSGCLA1TOCPU))
    {
    }

    //
    // Initialize and wait for CPUToCLA1MsgRAM
    //
    MemCfg_initSections(MEMCFG_SECT_MSGCPUTOCLA1);
    while (!MemCfg_getInitStatus(MEMCFG_SECT_MSGCPUTOCLA1))
    {
    }

    //
    // Select LS4RAM to be the programming space for the CLA
    // First configure the CLA to be the master for LS4 and then
    // set the space to be a program block
    //
    MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS4, MEMCFG_LSRAMMASTER_CPU_CLA1);
    MemCfg_setCLAMemType(MEMCFG_SECT_LS4, MEMCFG_CLA_MEM_PROGRAM);
    MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS5, MEMCFG_LSRAMMASTER_CPU_CLA1);
    MemCfg_setCLAMemType(MEMCFG_SECT_LS5, MEMCFG_CLA_MEM_PROGRAM);

    //
    // Next configure LS0RAM and LS1RAM as data spaces for the CLA
    // First configure the CLA to be the master for LS0(1) and then
    // set the spaces to be code blocks
    //
    MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS0, MEMCFG_LSRAMMASTER_CPU_CLA1);
    MemCfg_setCLAMemType(MEMCFG_SECT_LS0, MEMCFG_CLA_MEM_DATA);

    MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS1, MEMCFG_LSRAMMASTER_CPU_CLA1);
    MemCfg_setCLAMemType(MEMCFG_SECT_LS1, MEMCFG_CLA_MEM_DATA);

    [引用 userid="84566" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1127515/tms320f28379d-multiple-sequaling-pi-loops-using-cla/4184873#4184873"]我将联系 DCL 专家并告知您[引用]。

    当然、谢谢!

    此致、

    Rashmitha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Rashmitha、

    对于问题4 -参考指南中的图9对应于 DCL_PI_L1控制器、而不是图7。

    图9与 ASM 匹配。

    谢谢、

    Sira

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 

    感谢您向我指出正确的数字。 这很有帮助!

    我还有两个关于这一点的问题

    问题1:

    您能否确认  DCL_PI_L4是否使用正向电流或反向电流集成? 我想为我的应用实施 Forward Euler。

    问题2:

    [引用 userid="493381" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forume/1127515/tms320f28379d-multiple-sequaling-pi-loops-using-cla"]

    我正在尝试找到我需要分配积分器增益的变量、该增益将与之前的积分器输出相乘。

    积分器输出+=增益*上一个积分器输出

    其中先前积分器输出=误差* Ki   (误差= rk - YK)

    您能否给我指出我应该为其分配此"增益"值的变量? 它是 i6、i10还是其他东西?

    [/报价]

    您能帮我处理这个增益变量吗?

    谢谢、此致、

    Rashmitha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Rashmitha、

    对于未 按预期更新的变量、有2个可能的原因:

     https://software-dl.ti.com/C2000/docs/cla_software_dev_guide/debugging.html?highlight=single#why-are-the-variables-in-the-cla-code-not-updating-as-expected

    在 CLA 上单步执行(与 C28不同)时、流水线会针对每个步骤移动1个周期。 因此、有时您需要执行一些额外的步骤、直到管道到达执行/写入阶段、结果在寄存器中更新并反映在调试器表达式窗口中。 您能否再尝试4-5步 、超过44行、其中 M1加载了存储器(我假设它是一些非零值)、并查看调试器窗口中是否显示了正确的值。

    关于计算、

    您能否将输入变量 pi*、rk*、yK*添加到表达式中,并确认当您在 CLA 任务中停止时,这些变量的值看起来正确。 这样、我们就可以消除将输入变量分配给未初始化 CLA 访问的存储器的任何可能性。

    谢谢、
    Ashwini

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 

    我已开始使用 DCL_runPI_L4函数、因此我看到 MR0-MR3正在更新、并且我还运行了全部3个循环。

    现在的问题是什么

    调试窗口仍然显示 CLA 被暂停。

    2. pi*、rk*、yK*每一个都说 “未知行2:意外标记:”

    [引用 userid="493381" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1127515/tms320f28379d-multi-sequaling-pi-loops-using-cla/4186216#4186216"]

    问题1:

    您能否确认  DCL_PI_L4是否使用正向电流或反向电流集成? 我想为我的应用实施 Forward Euler。

    [/报价]

    我还在等待有关 PI_L4使用正向 Euler 还是反向 Euler 的响应。

    [引用 userid="493381" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1127515/tms320f28379d-multi-sequaling-pi-loops-using-cla/4186216#4186216"]

    问题2:

    我正在尝试找到我需要分配积分器增益的变量、该增益将与之前的积分器输出相乘。

    积分器输出+=增益*上一个积分器输出

    其中先前积分器输出=误差* Ki   (误差= rk - YK)

    您能否给我指出我应该为其分配此"增益"值的变量? 它是 i6、i10还是其他东西?

    您能帮我处理这个增益变量吗?

    [/报价]

    我意识到 i6和 I10都不能用于分配我要介绍到控制环路的增益乘法器。 因此、我编辑 了 DCL_runPI_L4函数以引入我需要的乘法器。 我使循环按预期工作、但我想知道编辑此默认 CLA 函数是否会出现任何其他问题。

    是否有另一种方法将其他变量引入 PI 环路?

    此致、

    Rashmitha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Rashmitha、

    [引用 userid="493381" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1127515/tms320f28379d-multiple-sequaling-pi-loops-using-cla/4187827#4187827"]调试窗口仍然显示 CLA 已挂起。

    您是否看到 CLA 被暂停、即使任务代码中没有嵌入 mdebugstop 断点?

    [引用 userid="493381" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000-f/C2000-microcontrollers-forume/1127515/tms320f28379d-multiple-sequaling-pi-loops-using-cla/4187827#4187827"] pi*、rk*,说出 未知的“2个”标记:[YK:

    请在不带*的表达式中添加变量的全名。 (我在上面的答复中添加了一个*作为 变量名称的数字1和2的占位符)

    谢谢、

    Ashwini

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好

    [引用 userid="84566" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1127515/tms320f28379d-multiple-sequaling-pi-loops-using-cla/4187944#4187944"]即使没有嵌入式任务断点代码、您是否仍会看到 CLA 被暂停?[引用 gstop 代码]

    是的、即使没有 mdebugstop 或 mnop 行、CLA 也会显示为挂起。 PI 控制器工作正常、调试窗口中显示 ClaTask1不包含帧信息。

    [引用 userid="84566" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1127515/tms320f28379d-multiple-sequaling-pi-loops-using-cla/4187944#4187944"]请在表达式中添加变量的全名,而不使用引号*[]。

    我可以在"Expressions"窗口中看到变量更新

    我还想 确认__mnop()指令是否是必需/必需的。 我删除了它们、代码看起来运行正常。

    此致、

    Rashmitha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Rashmitha、请给我一天时间来看看您为我提出的两个问题。

    谢谢、Sira

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好

    感谢回来! 当然、当您有答案时、请告诉我

    此致、

    Rashmitha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    问题1:我认为这是 Euler 的前瞻性实施。

    问题2:只有2个增益项 Kp 和 Ki、比例增益和积分器增益。

    谢谢、

    Sira

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好

    [引用 userid="493381" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1127515/tms320f28379d-multi-sequaling-pi-loops-using-cla/4187827#4187827"]

    我编辑 了 DCL_runPI_L4函数以引入我需要的乘法器。 我使循环按预期工作、但我想知道编辑此默认 CLA 函数是否会出现任何其他问题。

    是否有另一种方法将其他变量引入 PI 环路?

    [/报价]

    您也可以对上述引述的问题发表意见吗?

    此致、

    Rashmitha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    明天我要回答-今天是美国的假日。

    (只是一个请求,不要用确认/确定来回复,因为它将人为地修改我们保留的一些内部指标:) )

    谢谢、Sira

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Rashmitha、

    您添加了乘法因子0.000025、对吧? 从本质上讲、您刚刚更改了 Ki。 因此、为什么不仅要适当地修改 Ki 以满足您的控制环路需求。

    谢谢、

    Sira

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好

    是的、没错、我现在只更改了乘法因子。 但是、如果我更改函数内的任何其他内容-这会对 CLA 使用此函数的方式产生任何负面影响吗?

    提出这一问题的原因是、我有另一个模型在类似的 PI 并行拓扑上工作、但对于相同的 Kp、Ki 值、当我使用 CLA 时、响应速度似乎较慢、 这与 CLA 的存在非常矛盾、因为它应该由于独立计算而加速、如果我错了、请纠正我的错误。

    因此、我想修改这个函数来复制我的旧模型的工作方式、这需要围绕变量移动、改变方程的顺序并引入中间变量。 我想知道我是否可以对默认函数进行此类修改。

    此致、

    Rashmitha  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Rashmitha、

    1.当你说"但对于相同的 Kp、Ki 值、当我使用 CLA 时、响应速度似乎较慢"时、相对于什么而言、你是"较慢"的意思? 如果您将性能与 C28x 进行比较、则架构会有所不同(例如 CLA 上的寄存器较少)、因此会对性能产生影响。 如果这些控制循环在 ISR 内部运行、那么无论您是在 C28x 还是 CLA 上运行它们、都可以实现独立计算。  

    因此、您似乎希望修改 DCL_runPI_L4、使其与您的其他模型类似。 从控制循环的角度来看,您可以做任何想要做的事情,因为您是设计人员:),但修改的 DCL_runPI_L4不会与您的其他模型基本相同,最终显示与上面(1)相同的问题? 我的观点是、无论您做什么、都需要基于以上(1)项。

    谢谢、

    Sira