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.

[参考译文] TMS470MF06607:当占空比从100更改为0时、HET PWM 线路不会变低

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/565672/tms470mf06607-het-pwm-line-not-getting-low-when-duty-cycle-is-changed-from-100-to-0

器件型号:TMS470MF06607
主题中讨论的其他器件:HALCOGEN

您好、TI、

开发板: TMDX470MF066HDK Hercules 开发套件


我使用 HET 生成 PWM 信号。 HET 的驱动器级代码由 HALCoGen 生成。
我的应用要求 PWM 引脚在需要时为低电平。 我只是将占空比更改为0 %。
当我将占空比从100%更改为0%时、HET 引脚仍然保持为高电平。 然而、从1-99%占空比到0%的任何变化都是完全正常的、HET 引脚变为低电平。

通过以下解决方法可以解决该问题、但我仍然不明白出现了什么问题!


权变措施1: 当我在 PwmSetDuty (0)之后施加延迟时、引脚从高电平(100%占空比)变为低电平(0 %占空比)

解决方法2: 这就是我的 PwmSetDuty 函数的外观:-

当我将 PWCNT 指令中数据字段的计数增加1时、将1U (  在图像中标记为红色)替换为2U。
但是、这将导致产生的脉冲出现不准确的情况、这是不可取的。

 完成此变通后、HET 引脚从高电平变为低电平(0%占空比)(100%占空比)。

请帮助我找到问题原因并解决同样的问题。



如果我产生了任何困惑、请返回给我。

非常感谢!

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

    感谢您使用 E2E。 遗憾的是、您提到的问题是由 Halcogen 生成的 HET 程序中的一个缺陷。 问题又回到了 PWCNT 指令的使用和该指令无法同时处理两个条件变化的问题。 如果您在 TRM 中查看此指令的伪代码、您将看到一组相对复杂的条件语句被考虑、如果满足其中一个条件语句、则不会检查其余的条件语句。 在这种情况下、会检测到脉冲结束、但不会检测占空比的变化。 解决这个问题的唯一方法是使用不同的指令并从头重新设计 HET 程序。 根据我的理解、试图消除诸如这种限制等极端情况可能非常具有挑战性、并且会极大地增加程序的复杂性。

    您能否提供有关解决方法#1的更多详细信息? 这是否只是在每次调用 PwmSetDuty 调用后造成延迟? 这对您的应用有什么负面影响吗? 我不知道这种做法的原因。 可能是因为它允许在脉冲结束后再使用一个 LRP? 我需要与我们的 HET 专家一起查看您的解决方案、以确定这可能有帮助的原因。

    此外、我同意解决方法#2如果在 PWM 脉冲宽度中增加足够显著的误差、从而影响您的应用、这是不现实的。 然而、这之所以有效、是因为它阻止了占空比真正达到0。

    作为 FYI、我们确实提供了有关 Halcogen PWM 的应用手册、该手册可能对您了解 Halcogen HET 程序很有用。 应用手册位于以下链接 :www.ti.com/.../spna225.pdf。 尽管它没有明确讨论这个特定问题、但它也列出了可能感兴趣的其他几个限制。 此外、本文档附录中还列出了 HET 程序。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 Chuck 快速而详尽的回复!

    详情如下:

    这是否只是在每次调用 PwmSetDuty 调用后造成延迟?

    *对于权变措施#1,我在每次调用 PwmSetDuty()后都没有设置延迟,只有在设置0%占空比后才需要延迟,这也是我们需要将占空比从100%更改为0%时需要的延迟

    这对您的应用有什么负面影响吗?

    目前没有显著的影响、但随着应用程序的发展、变通办法#1可能是需要处理的问题。 是的、我提供的延迟是超过1个环路分辨率周期。
    对于解决问题的解决方法#1的原因、我仍然不满意。

    此外、我还不知道您针对解决方法#2所做的以下几点

    "然而、这之所以有效、是因为它阻止了占空比真正达到0"

    感谢您提供 HET 应用手册链接。 我将进行介绍。 )

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

    Sanjeev、

    因此、您看到的100%->0%占空比边界条件的限制只是执行 PWM 的指令的结果。

    执行双缓冲周期和占空比的四条指令:

    DPWM_1 PWCNT{NEX=PPWM_1、hr_lr=low、COND_addr=PPWM_1、PIN_PWM1、ACTION =POL_PWM1、reg =none、 IRQ=OFF、DATA=Duty_CNT1、hr_data=0};
    PPWM_1 DJZ{NEX=DPWM_2、COND_addr=DLOAD_1、RE=NONE、IRQ=OFF、DATA=PERD_CNT1};
    (笑声)
    (笑声)
    DLOAD_1 MOV64{nute=LOAD_1、remote=DPWM_1、en_pin_action=enable_PWM1、cond_addr=PPWM_1、pin=PIN_PWM1、com_mode=ecMP、action=POL_PWM1、 REG=none、IRQ=EOD_IRQ1、DATA=Duty_load1};
    LOAD_1 MOV64{NEX=DPWM_2、REMOV=PPWM_1、COND_ADDR=DLOAD_1、COMP_MODE=ECMP、REG=NONE、 IRQ=EOP_IRQ1、DATA=PERD_LOAD1};
    
    现在查看 PWCNT 的伪代码(在 TRM 部分12.7.3.16 PWCNT (脉宽计数)中)

    if (数据字段值=0)
    {
    选择的寄存器=0;
    跳转至下一个程序地址
    ;}
    If (数据字段值>1)
    {
    选择的寄存器=数据字段值-1;
    数据字段值=计数器值-1;
    if (使能引脚动作= 1)
    选择的引脚=下一个环路分辨率时钟上的引脚动作;
    跳转至下一个程序地址;
    }
    If (数据字段值= 1)
    {
    所选寄存器= 00000h;
    数据字段值= 00000h;
    if (相反操作=1)
    {
    if (hr_lr bit =0)
    {
    If (Enable Pin action ==1)
    Selected Pin = Rearing Level of Pin Action at next loop
    resolution clock + HR delay;
    }
    否则
    {
    如果(使能引脚动作= 1)
    选择的引脚=下一个环路
    分辨率时钟上引脚动作的相反电平;
    }
    
    如果(中断使能= 1)
    SW 中断标志= 1;
    跳转至条件地址
    } 

    我将改述上述内容如下:

     数据字段= 0

         (笑声) 不采取任何行动

     数据字段= 1

        (笑声)  计划引脚在下一个 LRP 时翻转至"相反"状态、 递减计数。

     数据字段> 1.

        (笑声)  计划引脚在下一个 LRP 时处于活动状态、递减计数

    问题在于:

     -要获得100%占空比、尤其是在多个周期内、 我们需要使用大于 PPWM_1中值的值对 DPWM_1中的 PWCNT 数据字段进行编程、以便 DPWM_1中的 PWCNT 永远不会在数据字段中使用"1"执行。  如果在数据字段中以"1"执行、 则引脚将在至少1个环路分辨率周期内进入相反的引脚状态、 引脚"on" 100%时、您永远不会获得100%占空比、它始终具有一个环路的较短关断时间。

     -如果 PWCNT 设置为100%、 并且下一个周期为0%、则会发生以下情况:

         - PWCNT 使用'2'的数据字段执行。 这会将引脚设置为"ON"、但随后会在 PWCNT 数据字段中保留值"1"。

          单独来说、下一次 PWCNT 迭代将使引脚返回到关断状态。

         -在 PWCNT 从2->1开始的同一循环中 ,DJZ 为零,这会导致程序跳转到地址 DLOAD_1,其中 DLOAD_1

           执行 LOAD_1。    在 PWCNT 有机会以值"1"执行之前、DLOAD_1会向 PWCNT 写入一个"0"的值。


    因此、现在在0%占空比期间、PWCNT 立即具有值0、并且始终对引脚"不执行任何操作"。

    但是、由于之前的周期留下了引脚"ON"、因此引脚保持开启状态、因此它看起来卡住或挂起。



    要解决此问题、您必须重写代码。   我尝试了一个用 ADCNST 替代 MOV64的实验、并且能够使 PWCNT 从100%转换到0%、而不会出现任何问题、但不知道二者之间的值是否正确。    通常、对于 HET、类似这样的简单更改可能会在其他地方引入另一个边界条件。     


    因此、为了解释这一点、我们不使用用"0"对"1"进行写操作的"MOV64"、 而是向 PWCNT 中剩余的任何内容添加"0"、这是获得0%的更好策略、因为:

       a)如果 PWCNT 中已经有"0"、则表示该引脚已关闭 (之前的占空比不是100%)。

       b)如果 PWCNT 中有值"1"、则表示最后一个占空比为100%、但向其添加0会使 PWCNT 的值为1。

          因此、它将以1 -> 0的值执行、并在下一个环路分辨率周期中关闭引脚。

      c) ADCNST 的工作方式是将立即值添加到远程值(如果远程值不为零)或将偏移添加到立即值

          并将其写入远程设备(如果远程设备为0)。   

          因此、您可以设置立即=占空比- 1、然后设置偏移= 1。

          如果远程值为100%占空比之前运行的值"1"、 则 ADCNST 将  Duty -1添加 到1、并在 PWCNT 字段中留下"uty"。

          如果远程值为"0"时、则 ADCNST 将添加占空比-1 + 1 (ADCNST 的常量偏移字段)、并且您仍在 PWCNT 中获得"待定"值。

    不过、使用 ADCNST 时会出现一些问题。   首先、它不像 MOV64那样进行控制字段更新。   因此、您无法"缓冲"极性或使能或任何其他字段、并在周期结束时仅使用 ADCNST 同步更新它们、就像使用 MOV64时一样。   因此、依赖于 MOV64 (LOAD_1、DLOAD_1)的'buffer '位置中更新的这些字段的一些 API 将会中断。

    然后、通过使用"Add"而不是"MOV"、您将有可能在远程 PWCNT 寄存器中累积一些错误;尤其是在 DJZ 指令中的周期在占空比发生变化的同时发生变化的情况下。   
    例如,如果您将 PWCNT 的值保留为“2”,而不是“1”。 那么偏移为"1"的 ADCNST 是错误的、会中断、 如果这种情况随后变为 PWCNT 中剩下"3"的情况、则该误差可能会滚雪。    而 MOV64会在不"添加"的情况下向 PWCNT 写入定义的值、因此误差无法滚雪。


    我不知道第二个问题是否真实存在、但我想在更改 HET 代码之前对其进行全面仿真。  我和同事的经验是、这些边界条件如100%-> 0%比实际摆脱更容易"移动"。   我的意思是、修复100%-> 0%的边界条件更有可能将问题移至0%-> 100%的情况、或者在某些情况下会引入 PWM 占空比的轻微误差、而不是使 PWM "完美"。   使其"完美"通常意味着添加处理临界情况的说明。