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.

[参考译文] TMS570LS1224:死区生成额外的脉冲

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1260173/tms570ls1224-dead-band-generating-weird-additional-pulse

器件型号:TMS570LS1224
主题中讨论的其他器件:TMS320F28035HALCOGEN

大家好、我使用 PWM 驱动 BLDC 电机的时间已经很安静了、在测试期间、我注意到了一些奇怪的行为。   

我已经检测到这种情况在哪里,我 想知道为什么会发生。

(注意:  PWM_u 是  EPwm4Regs、 PWM_v 是 EPwm7Regs、 PWM_w 是 EPwm5Regs

使用向上/向下模式将 PWM 设置为20kHz 频率、到目前为止 PWM 外设中的所有变化都具有相同的结果)

/* Basic PWM periphery settings */
    pwm_u->TBPRD = 2000;                        // Period = 4001 TBCLK counts (20 kHz)
    pwm_u->TBPHS.half.TBPHS = 0;                // Set Phase register to zero
    pwm_u->TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Symmetrical mode
    pwm_u->TBCTL.bit.PHSEN = TB_DISABLE;        // Phase loading disabled
    pwm_u->TBCTL.bit.PRDLD = TB_SHADOW;
    pwm_u->TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;    // Sync down-stream module
    pwm_u->CMPCTL.bit.SHDWAMODE = CC_SHADOW;
    pwm_u->CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    pwm_u->CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;  // load on CTR=Zero
    pwm_u->CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;  // load on CTR=Zero
    pwm_u->AQCTLA.bit.CAU = AQ_SET;             // set actions for EPWM4A
    pwm_u->AQCTLA.bit.CAD = AQ_CLEAR;

这在中断内部被调用来改变哪些 PWM 输出应该被调制:

/* To prevent unintentional transistor short-circuit during force event */
    pwm_u->DBCTL.bit.OUT_MODE  = OUT_DISABLED;  // 0 - Disable Dead Band for output A
    pwm_v->DBCTL.bit.OUT_MODE  = OUT_DISABLED;  // 0 - Disable Dead Band for output A
    pwm_w->DBCTL.bit.OUT_MODE  = OUT_DISABLED;  // 0 - Disable Dead Band for output A

/* Main part */
    pwm_u->aqcsfrc.reg_value.csfa = PWM_AQ_SWF_NONE; // enable PWM on A output
    pwm_u->aqcsfrc.reg_value.csfb = PWM_AQ_SWF_LO;
    
    pwm_v->aqcsfrc.reg_value.csfa = PWM_AQ_SWF_LO;
    pwm_v->aqcsfrc.reg_value.csfb = PWM_AQ_SWF_HI;
    
    pwm_w->aqcsfrc.reg_value.csfa = PWM_AQ_SWF_LO;
    pwm_w->aqcsfrc.reg_value.csfb = PWM_AQ_SWF_LO;
    

    pwm_u->DBCTL.bit.HALFCYCLE = ENABLED;                // 1
    pwm_u->DBCTL.bit.IN_MODE   = IN_MODE_RA_FA;          // 0 - source for both falling-edge and rising-edge
    pwm_u->DBCTL.bit.POLSEL    = ACTIVE_HI_COMP;         // 2 - Active High Complementary (B is inverted)
    pwm_u->DBCTL.bit.OUT_MODE  = PWM_DB_OUT_FULL_ENABLE; // 3 - Enable Dead Band for both outputs

    pwm_v->DBCTL.bit.HALFCYCLE = DISABLED;               // 0
    pwm_v->DBCTL.bit.IN_MODE   = IN_MODE_RA_FA;          // 0 - source for both falling-edge and rising-edge
    pwm_v->DBCTL.bit.POLSEL    = ACTIVE_HI;              // 0 - Active High (neither A nor B is inverted)
    pwm_v->DBCTL.bit.OUT_MODE  = PWM_DB_OUT_A_ENABLE;    // 2 - Enable Dead Band for output A

    pwm_w->DBCTL.bit.HALFCYCLE = DISABLED;               // 0
    pwm_w->DBCTL.bit.IN_MODE   = IN_MODE_RA_FA;          // 0 - source for both falling-edge and rising-edge
    pwm_w->DBCTL.bit.POLSEL    = ACTIVE_HI;              // 0 - Active High (neither A nor B is inverted)
    pwm_w->DBCTL.bit.OUT_MODE  = PWM_DB_OUT_A_ENABLE;    // 2 - Enable Dead Band for output A

结果是:  

导致干扰的主要问题在某种程度上具有讽刺意味、即应该阻止此类事情(从我的角度来看)、并在强制动作限定符之前禁用死区。

现在另一个奇怪的现象是、当我增加占空比(高于35%)时、通道 B 上的脉冲很长(正在过载)。

占空比超过50%时、互补脉冲会正常工作并正常运行、这很奇怪:

现在进入我的问题。 当我移除禁用 U 相(ePWM4A)上 DBCTL 的线路后、互补通道 B 在每个占空比下都开始正常工作(不仅超过50%)。

有人能解释一下为什么会发生这种情况吗? 为什么我无法安全地首先禁用死区、然后几条指令在开启时不会产生奇怪的毛刺脉冲?

此外、我一直在使用具有相同 PWM 设置和相同代码的 TMS320F28035 (当然、由于其处理器的不同而进行了一些微小的更改)、但那里并未发生这种情况。

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

    尊敬的 Youda:

    您能否与您提出的问题分享一个示例项目?

    如果我们在结束时轻松触发问题、这将非常有用、这样我们就可以进行调试并提供必要的解决方案。

    --

    谢谢。此致、
    Jagadish。

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

    您好、很抱歉耽误你的时间:)、无论如何、 我在这里用 HALcogen 和 HAL 库重现了问题、并在 Hercules TMS570LS12x/RM46 LaunchPad 上对其进行了测试。

    以下是示例代码、因此您可以尝试马上告诉我低占空比(低于15%占空比)下为什么会出现干扰。 (我向导致出现干扰的代码的"sys_main.c"部分添加了注释:

    .e2e.ti.com/.../PWM_5F00_glitch.zip

    此致。

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

    尊敬的 Youda:

    我到星期一不在办公室、请预计会有一些延误、以便进一步了解此问题的最新情况。

    --

    谢谢。此致、
    Jagadish。

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

    当然没问题、

    我只是想补充一下,在将我的代码闪存到 launchpad 之后,可以通过 PWM4上的示波器或逻辑分析仪观察到故障(TMS570LS12x launchpad 上的接头 J11 -->引脚26和引脚27)

    此致。

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

    尊敬的 Youda:

    我没有此 TMS570LS12x 板、因此我只是使用 RM46x 重新创建您的示例项目。 我完成了该项目、我必须找一个逻辑分析仪来对其进行测试。

    我将对其进行测试并尽快提供更新。

    --

    谢谢。此致、
    Jagadish。

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

    尊敬的 Youda:

    我刚刚在 RM46x 上测试了您的项目、但在逻辑分析仪上看不到任何 PWM。 我仍然在致力于生成波形。

    --

    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    我不确定您是如何重新创建到 RM46x 的、因为我使用了 Halcogen 来实现外围设置、但您可以检查我的.DIL 文件以获取 TMS570LS1224外围设备的 Halcogen 设置(请注意 PINMUX、ETPWM 和 ADC1设置、因为我使用了特殊的引脚多路复用[ADC 触发选项 B])。  

    e2e.ti.com/.../PWM_5F00_glitch_5F00_test_5F00_halcogen.zip

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

    尊敬的 Youda:

    很抱歉我的回复出现延迟!

    我在 RM46上重新创建了您的项目、并进行了测试。

    下面是我的项目:
    e2e.ti.com/.../PWM_5F00_Glitch_5F00_Issue_5F00_RM46.zip

    PWM4A 和 PWM4B 的逻辑分析仪波形:
    e2e.ti.com/.../Glitch_5F00_Test_5F00_RM46.sal

    我没有看到您讨论的干扰、  

    我想知道你的以下几点:

    您收到此干扰的频率有多高?

    只在 PWM4A 和 PWM4B 或任何其他 PWM 上发生?

    --

    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    我检查了您的代码、并且重新创建的代码与我使用的代码不同。

    例如、您不会在代码中的任何位置调用函数"ADC_EOC_UPDATE_PWM"、该函数是可以观察干扰的主函数。 在我的代码中、它在周期结束 EOC 中断"adc1Group0Interrupt"中的模块 ADC.c 中使用(合并20kHz PWM)、因此每50us 调用一次。

    当我首先尝试禁用死区时、所有三个 PWM (4、7和5)都始终具有这个毛刺脉冲。

    我没有研究 PWM 外围设备的设置,但从我的 geuss 中,您不会在中断期间更改死区设置,所以可能这就是您看不到任何问题的原因。

    此致。

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

    对于响应的延迟、我们深表歉意。

    我对其他问题很感兴趣、感谢您提供更多详细信息。

    我将在明天再次尝试重现此问题。

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

    尊敬的 Youda:

    我可以看到您说的干扰、我现在正在分析波形、并将尝试在明天提供更新。

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

    Jagadish、您好!

    好的、这也是 RM46上的内容、现在我期待着为您解释可能的原因。

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

    尊敬的 Youda:

    我知道发生了什么、以及为什么 波形中会出现这种额外的干扰。

    为了理解这一点、我进行了3次捕获。

    1.无死区:

    我刚刚注释掉了 adc1Group0Interrupt 中对函数"ADC_EOC_UPDATE_PWM"的调用、并捕获了波形、这里是输出。

    你可以认为这是波形,如果没有死区存在,我的意思是死区完全被绕过. 请记住、如果绕过死区、PWM_B 将完全为低电平。

    2.死区,但不能禁用:

    在本例中、我将调用函数"ADC_EOC_UPDATE_PWM"、但我在该函数中添加了"etpwmDisableDeadband"行的注释。

    在本例中、由于我们配置的延迟、我们的脉冲宽度减小了。在本例中、由于我们进行了反相配置、我们看到 PWM_B 上出现了反相输出。

    3.禁用死区:

    在本例中没有添加任何注释、而且您已经知道这个波形

    下面进行 解释:

    实际上第3个屏幕截图是1和2的组合、我的意思是如果您通过将0x00写入 DBCTL 寄存器来禁用死区、它将完全绕过死区。 因此、如果您禁用死区意味着您将在 CAPTURE_1中获得波形(对于 PWM_B 而言这是完全低的)。

    为了便于理解、我将波形放大并解释了不同的边沿点。

    我认为这会澄清你的疑问。

    --
    谢谢。此致、
    Jagadish。