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.

[参考译文] TMS320F280049M:以可变频率运行时两个脉冲之间的死区时间折叠问题

Guru**** 2609275 points
Other Parts Discussed in Thread: TMS320F280049, TMS320F28069, TMS320F28027, TMS320F28035, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/675157/tms320f280049m-issue-with-deadtime-collapse-between-two-pulses-when-operating-with-variable-frequency

器件型号:TMS320F280049M

您好!

我已经设置 TMS320F280049来驱动两个开关、这两个开关的脉冲是互补的、具有50%占空比、并且它们之间具有150ns 的死区时间。 脉冲频率在50kHz 至1MHz 之间变化。 我通过改变 ADC 输入端连接的可变电阻器来改变 ADC 输入端的电压、从而改变频率。 在由 ADC 转换脉冲结束触发的固定频率 ISR 中读取 ADC 寄存器并计算脉冲频率、在 EPWM1 ISR 中更新 PWM 寄存器(TBPRD、CMPA、CMPB)、EPWM1 ISR 是在 EPWM 1 CTR=0时触发的较高优先级中断。 EPWM1中断嵌套在 ADC 中断中。 ADC 转换开始由 CPU 定时器0触发、该定时器以50kHz 的固定频率运行。

通过分别向 CMPA 和 CMPB 寄存器写入等于 TBPRD/2的电平、可生成占空比为50%的 ePWM 脉冲。 然后、EPWMB 脉冲在死区 模块中反相、以生成互补脉冲。  

ADC ISR 中还会根据输入电压进行其他一些计算、这与频率、CMPA 和 CMPB 的计算无关。 ADC ISR 的总计算时间为9.5us、EPWM1 ISR 为~360ns (因为在此例程中仅更新 ePWM 寄存器)。

脉冲之间的死区时间是恒定的、在初始化期间只设置一次 、达到150ns。

在这个设置中、我观察到两个脉冲之间的死区时间被随机地折叠至小于50ns、这意味着没有保持150ns 的死区时间。

我试验并观察到、只有出于某种原因、CMPA 和 CMPB 的执行值不相等时才会发生这种情况。 如果我在嵌套在 ADC 中断内的较高优先级中断 EPWM1 ISR 中以相同的值=TBPRD/2逐一更新两个寄存器、则不应发生这种情况。

如果 EPWM1 ISR 优先级更高、首先应更新所有寄存器、然后程序计数器应返回 ADC ISR 以计算下一个频率值。

当程序计数器处于 ADC ISR 中并计算频率时、我暂时通过将标志设置为高电平来解决死区时间崩溃问题。 当 FLAG 为高电平时、我不允许 EPWM1 ISR 中的 EPWM 1寄存器更新、即使 EPWM1 ISR 仍然可以中断 ADC ISR。 计算完成后、我使 FLAG 变为低电平、然后 EPWM1 ISR 中的 EPWM 1寄存器可以更新。 通过这种方式、死区时间保持在150ns。

但是 、这是一种解决问题的蛮力方法。 我希望 TI 能提供更好的解决方案/建议来解决这个问题。

谢谢、

Misha

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

    以下是我的理解、

    您可以在 ADC ISR 中计算 ePWM 寄存器值、该值发生在固定频率下。
    然后、在 ePWM ISR 中、使用计算值更新所有寄存器。

    当 CMPA 和 CMPB 不相同时、就会出现此问题。 对吧?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Nima、

     是的、我在 ADC ISR 中计算 EPWM1.TBPRD (对应于我要生成的开关频率)和 EPWM1.CMPA 的值、CMPB =TBPRD/2 (占空比为50%)。 我在 EPWM1 ISR 中写入所有这些寄存器(当 EPWM1 CTR = 0时生成 EPWM1 ISR)。 CMPA 和 CMPB 配置为影子加载模式、其 值在 CTR=0时加载。 尽管 CMPA 和 CMPB 寄存器写入的值都相同=TBPRD/2、但它们只能在以下情况下变得不相等:

    在 EPWM1 ISR 中, 在我写入 CMPA 寄存器后,如果由于某种原因,程序计数器返回到 ADC ISR (这不应该发生,因为 EPWM 1 ISR 优先级更高,应该先完成) 在这里、它为 TBPRD/2获取新值、然后返回 EPWM1 ISR、将该新值写入 CMPB。 在这种情况下、CMPA 和 CMPB 不相等。

    另一种可能是、当我写入 CMPA 时、ePWM 1 ISR 中的 CMPB (在 CTR=0时生成)、CMPA 和 CMPB 也设置为在 CTR=0时从影子寄存器加载到活动寄存器。因此、我不确定是否在 EPWM1 ISR 生成时、 此时 CMPA 和 CMPB 被立即 写入并加载到活动寄存器中、或者在下一个 CTR=0时被写入并随后加载到活动寄存器中。

    正如我在上一篇文章中提到的、只有在 我在 ADC ISR 中进行计算时设置标志以防止写入 ePWM 1 ISR 中的 ePWM 1寄存器时、我才能解决死区时间折叠问题、  在 ADC ISR 中完成计算后、我将清除该标志、以启用对 ePWM 1 ISR 中 ePWM 1寄存器的写入。

    但是、我想从 TI 获得一些有关此问题的其他解决方案、并想了解其背后的可能原因、以便我能够防止将来发生这种情况。

    另请注意、我还在 TMS320F28027、TMS320F28069、TMS320F28035等其他 Piccolos 中使用了相同的代码、并且没有死区时间崩溃的问题。 而对于该芯片、我遇到了这个问题。 我不知道为什么。

    感谢您的帮助!

    Misha

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

    你好、Nima、

    我正在等待您对此作出答复。

    谢谢、

    Misha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、这是我认为您下一步应该做的事情。

    选项1:
    在当前设置中、取消 ADC ISR 中的标志。 然后执行类似这样的操作

    //Globale 变量
    int writing _TO_CMPS = 0;

    //输入 ADC ISR
    Writing_TO_CMPS = 1;
    CMPA =您的计算值;
    CMPB =您的计算值;
    Writing_TO_CMPS = 0;

    //在 ePWM ISR 中
    //在 ISR 开始时
    如果(Writing_TO_CMPS = 1)

    ESTOP0;


    这样、我们就知道 ISR 是否在错误的时间被中断。

    选项2:
    由于您使用的是分压模式、因此、为什么不只更新 CMPA、CMPB 和 ADC ISR 中的所有其他内部 ISR、当 ePWM CTR=0发生时、它们已经被加载、而您不必在 ISR 中执行此操作。

    您能否尝试这两者并让我知道您找到的内容?

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

    你好、Nima、

    我尝试了您推荐的两种选项。 在第一个选项中、我的代码没有停止、但我仍然遇到死区时间崩溃问题。

    我尝试了第二个选项、其中我完全删除了 EPWM1ISR 并删除了其在 ADC ISR 中的嵌套、将 TBPRD、CMPA、CMPA 置于 CTR=0上的影子加载、并在 ADC ISR 计算结束附近更新了 TBPRD、CMPA、CMPB、但仍然存在死区时间折叠问题。

    我现在的情况是,我 不知道为什么会发生这种情况。 另一个需要注意的问题是、我必须以特定的方式触发示波器、以捕获这种死区时间崩溃、这意味着它随机发生。 此外、它 专门发生在低于500kHz 而不是高于500kHz 的频率 上。 如果可能、我可以向您发送我的代码、也可以帮助我改进。

    谢谢、

    Misha

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

    Misha、

    我同意。 请发布您的代码、我将对其进行审核。

    NIMA

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

    你好、Nima、

    我是否需要将其发布在该论坛上? 如果您可以提供您的电子邮件 ID,我可以通过电子邮件将其发送给您。

    Misha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们继续在私人消息中处理此主题、并将发布最终解决方案和问题原因。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     你好、Nima、

    今天、我运行了一个测试(请参阅随附的图)。 绿色波形是一个标志、当在 ADCISC 中计算 CMPA 和 CMPB 值时将其置1、并在该值之后清零。 粉色波形是一个标志、该标志在 EPWM1ISR 中更新 CMPA 和 CMPB 值时置1、并在该值之后清零。 它们不会重叠、这表明 CMPA 和 CMPB 寄存器被写入相同的值(当 CMPA 和 CMPB 寄存器被写入时、ADCIR 不会中断 EPWMISR)。 您可以看到红色和蓝色波形(EPWM1A 和 EPWM1B)之间的死区时间崩溃(死区时间为80ns、而编程的死区时间为150ns)。

    我还尝试检查 ADCIR 是否在另一个时刻中断 EPWM1ISR、而 ADCIR 无法及时中断 EPWM1ISR。

    我真的不知道为什么会发生死区时间崩溃、为什么 CMPA 和 CMPB 的更新值不相等、尽管我用相同的值编写它们?

    现在我将在 EPWMISR 内部执行 ADCIR 禁用并再次检查、但理想情况下、如果芯片正常工作、我就不必这么做。

    我还通过实验验证了如果没有嵌套、中断不会相互中断。 只有使用嵌套、它们才能相互中断。 由于在我的案例中、ADCIR 未嵌套在 EPWM1ISR 中、因此 ADCIR 不应中断 EPWM1ISR。

    我仍然不清楚中断在这个新 芯片中的工作情况。

    Misha

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

    如果已禁用嵌套、它们将不会相互中断。  

    好的、这里有一个想法、我可以实现这一点。 当 PWM 速度较低时会出现问题、对吧? 好的、如果 CMPB 负载正在发生并在 CMPA 尚未加载时生效、该怎么办! 我将进一步研究这个问题、看看我是否可以找到解决方案。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Nima、
    我同意你的建议。 如果 CMPA 未加载时 CMPB 的加载生效、可能会发生这种情况。 但据我了解,这不是我们所能控制的。 这就是芯片的工作方式。 如果您有解决此问题的方法、请告诉我。
    此外、我想提一下、当我进入 EPWM1ISR 时、我尝试使用 DINT 禁用所有中断、在退出 EPWM1ISR 之前、我使用 EINT 启用了中断、但仍然存在死区时间折叠问题。
    这再次证明、由于 ADCISPR 是中断 EPWMISR、因此不会发生此问题、但可能是由于您解释的原因而发生的。

    到目前为止,我能够防止死区时间崩溃的唯一方法如下(BTW,这是我3周前的解决方案):

    在初始化期间启用标志"startcalc"。

    在 ADCIR 中、
    if (startcal=1)

    执行周期和 CMP 计算
    startcalc=0;


    功能
    if (startcalc==0)

    更新 EPWM1寄存器、如 TBPRD、CMPB、CMPA
    startcalc=1;

    只有这样,我才能够停止死区时间的崩溃。
    但我不确定这是否是正确的解决方案。 它可能有助于防止死区时间崩溃、但会减慢 PWM 寄存器的更新速度。 此外、如果芯片工作正常、我不需要这么做。

    请告诉我您的想法

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

    您好 Misha、

    请使用280049 PWM 上提供的一次性和全局重新加载功能。 如果您使用 PWM ISR 的唯一原因是写入 PWM1寄存器、则如果您使用一次性全局重新加载功能、则可以完全摆脱 PWM ISR。 使用此功能时、只要 ADC ISR 中的所有更新完成、就可以直接写入全局重新加载位。 这可以从 ADC ISR 内部完成(对于本用例)。 如果仍然需要 PWM ISR,则可以从 PWM ISR 写入全局重新加载位。

    这将确保所有寄存器在同一 PWM 周期中更新为最新值。

    但愿这对您有所帮助。

    Hrishi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Hrishi、您好!
    感谢您的回复。 什么是一次性和全局重新加载功能? 这种芯片中是否引入了新功能? 您是否有任何示例代码来展示如何使用此功能? 我在哪里可以阅读到它?
    谢谢、
    Misha
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Misha、

    此功能适用于具有4类 PWM 的器件。 TRM 中的第18.3.2.7节"全局重新加载"中对此进行了记录。    

    我们在 C2000Ware 中提供了一个示例代码、位于 \device_support\f2837xd\examples\cpu1\HRPWM_dadband _SFO_V8。 此示例同时实现了 HRPRD (高分辨率周期)、HRDUTY (占空比)、HRPHS (相移)和 HRDB (死区)。 如果您不需要一个或多个多相移、高分辨率相位控制、高分辨率周期控制和高分辨率死区、则可以针对您的特定用例简化此示例。

    但愿这对您有所帮助。

    Hrishi

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

    Hrishi、您好!

    非常感谢! 看起来我解决了这个问题。 我使用全局 PWM 加载寄存器和一次性加载模式来解决它。

    我完全省去了 EPWMISR。   在 ADCIR 中、在计算所有周期和比较值后、我立即启用了 GLDCTL2.OSHTLD (单次锁存条件打开)。 这意味着只有当启用一次性锁存器时、寄存器 CMPA、CMPB 和 TBPRD 的值才会从影子加载到活动寄存器。 这确保了 CMPA 和 CMPB 的值 保持不变、因此没有死区时间崩溃。

    经过这种体验、我认为 TI 应该在手册中明确指出、即使将寄存器配置为在同一时刻加载(在我的示例中为 CTR=0)、也会将寄存器从影子寄存器单独加载到活动寄存器、 不保证它们的值将 完全 同时从影子寄存器加载到活动寄存器。

    因此、TI 必须引入全局 PWM 加载寄存 器、以便所有寄存器可以同时从影子寄存器加载到活动寄存器。 这在某些应用中可能非常重要。

    谢谢、

    Misha

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

    感谢您的更新! 很高兴知道、全局负载解决了您的问题、并且实际上也为您节省了一些处理器带宽。

    您是对的、这正是我们开发此功能的原因。 感谢您提供的文档反馈。 我们将尝试在不久的将来 TRM 修订版中纳入这一点。

    Hrishi