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.

[参考译文] TMS320F28377D:相移时、ePWM 跳过周期

Guru**** 2580495 points
Other Parts Discussed in Thread: CONTROLSUITE, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/661438/tms320f28377d-epwm-skipped-cycle-when-phase-shift

器件型号:TMS320F28377D
Thread 中讨论的其他器件:controlSUITEC2000WARE

尊敬的:

我有一个全 H 桥进行控制。 为此、我使用 ePWM1和 ePWM2。

ePWM1用于一个分支、具有零相移。

epWM2用于其他分支、相移是用于设置占空比的变量。

当我改变 ePWM2的相移时、ePWM2会损失一个周期?

我通过使用 EPwm2Regs.TBPHS.half-TBPHS 来更改相移。

我忘记设置了什么吗?

这是我使用的配置:

// ePWM 模块1

  EPwm1Regs.AQCSFRC.bit.CSFA=ePWM_AQ_CLEAR;

  EPwm1Regs.TBPRD=0;

  EPwm1Regs.CMPA.half.CMPA=0;

  EPwm1Regs.TBPHS.Halt.TBPHS=0;

  EPwm1Regs.TBCTL.bit.CLKDIV=ePWM_DIV1;

  EPwm1Regs.TBCTL.bit.HSPCLKDIV=ePWM_DIV1;

  EPwm1Regs.TBCTL.bit.CTRMODE=ePWM_TB_COUNT_UP;

  EPwm1Regs.TBCTL.bit.PHSEN=ePWM_TB_DISABLE;

  EPwm1Regs.TBCTL.bit.PRDLD=ePWM_TB_SHADOW;

  EPwm1Regs.TBCTL.bit.SYNCOSEL=ePWM_TB_CTR_ZERO;

  EPwm1Regs.CMPCTL.bit.SHDWAMODE=ePWM_CC_SHADOW;

  EPwm1Regs.CMPCTL.bit.SHDWBMODE=ePWM_CC_SHADOW;

  EPwm1Regs.CMPCTL.bit.LOADAMODE=ePWM_CC_CTR_ZERO;

  EPwm1Regs.CMPCTL.bit.LOADBMODE=ePWM_CC_CTR_ZERO;

  EPwm1Regs.AQCTLA.bit.ZRO=ePWM_AQ_SET;

  EPwm1Regs.AQCTLA.bit.CAU=ePWM_AQ_CLEAR;

  EPwm1Regs.DBCTL.bit.OUT_MODE=ePWM_DB_ENABLE_FULL;

  EPwm1Regs.DBCTL.bit.POLSEL=ePWM_DB_Activ_LOC;

  EPwm1Regs.DBFED=50;

  EPwm1Regs.DBRED=70;

  // ePWM 模块2.

  EPwm2Regs.AQCSFRC.bit.CSFA=ePWM_AQ_CLEAR;

  EPwm2Regs.TBPRD=0;

  EPwm2Regs.CMPA.half-CMPA=0;

  EPwm2Regs.TBPHS.Halt.TBPHS=0;

  EPwm2Regs.TBCTL.bit.CLKDIV=ePWM_DIV1;

  EPwm2Regs.TBCTL.bit.HSPCLKDIV=ePWM_DIV1;

  EPwm2Regs.TBCTL.bit.CTRMODE=ePWM_TB_COUNT_UP;

  EPwm2Regs.TBCTL.bit.PHSEN=ePWM_TB_ENABLE;

  EPwm2Regs.TBCTL.bit.PRDLD=ePWM_TB_SHADOW;

  EPwm2Regs.TBCTL.bit.SYNCOSEL=ePWM_TB_SYNC_IN;

  EPwm2Regs.CMPCTL.bit.SHDWAMODE=ePWM_CC_SHADOW;

  EPwm2Regs.CMPCTL.bit.SHDWBMODE=ePWM_CC_SHADOW;

  EPwm2Regs.CMPCTL.bit.LOADAMODE=ePWM_CC_CTR_ZERO;

  EPwm2Regs.CMPCTL.bit.LOADBMODE=ePWM_CC_CTR_ZERO;

  EPwm2Regs.AQCTLA.bit.ZRO=ePWM_AQ_SET;

  EPwm2Regs.AQCTLA.bit.CAU=ePWM_AQ_CLEAR;

  EPwm2Regs.DBCTL.bit.OUT_MODE=ePWM_DB_ENABLE_FULL;

  EPwm2Regs.DBCTL.bit.POLSEL=ePWM_DB_Activ_LOC;

  EPwm2Regs.DBFED=30;

  EPwm2Regs.DBRED=40;

 

//********

//步骤2:配置 ePWM 跳闸区域

//********

  //启用 CPU CLK 失败

  EPwm1Regs.TZSEL.bit.OSHT5=true;

  EPwm2Regs.TZSEL.bit.OSHT5=true;

  //使能驱动器故障

  EPwm1Regs.TZSEL.bit.OSHT1=true;

  EPwm2Regs.TZSEL.bit.OSHT2=true;

  //将驱动程序故障配置为触发区输入

  //故障1连接到 GPIO14

  TrigRegs.INPUT1SELECT = 14;

  //故障2连接到 GPIO15

  TrigRegs.INPUT2SELECT = 15;

  //电桥 A 侧将关闭

  EPwm1Regs.TZCTL.bit.TZA=ePWM_TZ_FORCE_LO;

  EPwm2Regs.TZCTL.bit.TZA=ePWM_TZ_FORCE_LO;

更改控件的参数如下所示:

期间=11111;

     EPwm1Regs.TBPRD=(uint16)周期;

     EPwm1Regs.CMPA.half.CMPA=(uint16)(周期>>>>1);

     EPwm2Regs.TBPRD=(uint16)周期;

     EPwm2Regs.CMPA.half.CMPA=(uint16)(周期>>>>1);

     //根据°设置在时钟脉冲中设置相位

     EPwm1Regs.TBPHS.Halt.TBPHS=0;

     EPwm2Regs.TBPHS.half.TBPHS=(uint16)(Period*(uint32) Phase/360);

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

    您好 Bart、

    这不是问题的根源、但根据您的帖子中的".half。TBPHS"、您似乎正在使用我们的头文件的过时版本。  请确保您使用的是 controlSUITE /C2000Ware 中的最新版本。

    出现此问题的原因是您要在 TBCTR = 0时将 PWM 输出设置为高电平。  当 TBPHS > 0时、TBCTR 会在下一个 SYNCIN 上立即加载该值、并跳过 TBCTR = 0、直到计数器溢出。

    最好的方法是使用两个比较事件(CMPA 和 CMPB)来控制 PWM 输出。  您需要确保比较值始终大于 TBPHS、或者如果其中一个比较值小于 TBPHS、您可以通过另一个软件方法(例如动作限定符强制)处理 PWM 输出。

    此致、

    Kris

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

    感谢您的回答。 我的问题可以通过更改以下内容来解决:

    EPwm2Regs.TBPHS.half.TBPHS=(uint16)(Period*(uint32) Phase/360);
    更改为
    EPwm2Regs.TBPHS.Half.TBPHS=周期-(uint16)(周期*(uint32)相位/360);

    在以下示例中找到了该解决方案:
    www.ti.com/.../sprug04a.pdf

    再次感谢。

    此致、

    BART