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.

[参考译文] F28M36H53C2:ePWM Continuous Software Force不强制ePWMxB

Guru**** 2553450 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/630282/f28m36h53c2-epwm-continuous-software-force-does-not-force-epwmxb

部件号:F28M36H53C2

您好,

我在ePWM模块和软件强制状态方面遇到一些配置问题:

我的ePWM1和ePWM2配置如下:

 

PWMs[I]->TBCTR = 0;
PWMs[I]->TBPRDM2.Half.TBPRD =周期;
PWMs[I]->TBPHS.ALL = 0;
PWMs[I]->TBCTL.bit.FREE_SOFT = 0;
PWMs[i]->TBCTL.bit.PHSDIR = 0;
PWMs[I]->TBCTL.bit.CLKDIV = TB_DIV1;
PWMs[I]->TBCTL.bit.HSPCLKDIV = TB_DIV1;
PWMs[I]->TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
PWMs[I]->TBCTL.bit.PRDLD = TB_shadow;
PWMs[I]->TBCTL.bit.PHSEN = TB_DISABLE;
PWMs[I]->TBCTL.bit.CTRMODE = TB_COUNT_UP;
//计数器比较
PWMs[I]->CMPCTL.bit.SHDWBMODE = CC_SHADO;
PWMs[I]->CMPCTL.bit.SHDWAMODE = CC_SHAME;
PWMs[I]->CMPCTL.bit.LOADBMODE = CC_CTR_PRD;
PWMs[I]->CMPCTL.bit.LOADAMODE = CC_CTR_PRD;

PWMs[I]->CMPAM2.Half.CMPA = 0;
PWMs[I]->CMPBM.Half.CMPB = 0;

PWMs[I]->AQCTLR.bit.SHDWAQAMODE = 0x1;//阴影
PWMs[I]->AQCTLR.bit.SHDWAQBMODE = 0x1;//阴影
PWMs[I]->AQCTLR.bit.LDAQASYNC = 0x00;
PWMs[I]->AQCTLR.bit.LDAQBSYNC = 0x00;
PWMs[I]->AQCTLR.bit.LDAQAMODE = CC_CTR_PRD;
PWMs[I]->AQCTLR.bit.LDAQBMODE = CC_CTR_PRD;

//事件触发器
PWMs[I]->ETSEL.bit.SOCAEN =1;//在组上启用SOC
PWMs[I]->ETSEL.bit.SOCBEN =0;//禁用B组上的SOC
PWMs[I]->ETSEL.bit.SOCASEL = ET_CTRU_CMPA;//从CMPA/CSPC中选择SOC on up count (打开计数)
PWMs[I]->ETSEL.bit.SOCASELCMP = 0x0;// CMPA
PWMs[I]->etps.bit.SOCAPRD = et_1;//在每个事件上生成SOCA脉冲

PWMs[I]->TZsel.bit.CBC1 = 1;
PWMs[I]->TZCTL.bit.TZA = TZ_FORT_LO;
PWMs[I]->TZCTL.bit.TZB = TZ_FORT_LO;

PWMs[I]->TZCLR.bit.CBCPULSE =1;// PRD上CBC中断时清除
PWMs[I]->TZEINT.bit.CBC = 1;

//PWMs[I]->DCTRIPSEL.bit.DCAHCOMPSEL = DC_TRIPIN7;
//PWMs[I]->DCTRIPSEL.bit.DCBHCOMPSEL = DC_TRIPIN7;
//死区
PWMs[i]->DBCTL.bit.out模式= DB_FULL启用;
PWMs[I]->DBCTL.bit.POLSE= DB_ACTV_HIC;
PWMs[I]->DBFED=100;
PWMs[I]->DBRED=100;

PWMs[I]->AQSFRC.bit.RLDCSF= 3; 

我有ePWM1和ePWM2以这种方式链接:
EPwm2Regs.EPWMXLINK.Bit.CMPALINK = PWM_LINK_EPWM1;//synch将PWM1写入PWM2
EPwm2Regs.EPWMXLINK.Bit.CMPBLINK = PWM_LINK_EPWM1;//synch将PWM1写入PWM2
EPwm2Regs.EPWMXLINK.Bit.TBPRDLINK = PWM_LINK_EPWM1; 

每隔10毫秒,我修改一次Action Qualifier (操作限定符)以如下方式注册:

	如果(位置)
/*ePWM reg 1 */
PWMs[I]->AQCTLA.ALL = AQ_SET |(AQ_NO_ACTION << 2)|(AQ_CLEAR <4)|(AQ_NO_ACTION <<6)|(AQ_NO_ACTION <<8)|(AQ_NO_ACTION <<10);
PWMs[I]->AQCTLB.ALL = AQ_CLEAR |(AQ_NO_ACTION << 2)|(AQ_SET << 4)|(AQ_NO_ACTION <<6)|(AQ_NO_ACTION <<8)|(AQ_NO_ACTION <<10);
/*ePWM reg 2 */
PWMs[I+1]->AQCTLA.ALL = AQ_CLEAR |(AQ_NO_ACTION << 2)|(AQ_NO_ACTION << 4)|(AQ_NO_ACTION <<6)|(AQ_NO_ACTION <<8)|(AQ_NO_ACTION <10);
PWMs[I+1]->AQCTLB.ALL = AQ_SET |(AQ_NO_ACTION <<2)|(AQ_NO_ACTION <<4)|(AQ_NO_ACTION <<6)|(AQ_NO_ACTION <<8)|(AQ_NO_ACTION <10);
}
其它
{
PWMs[I]->AQCTLA.ALL = AQ_CLEAR |(AQ_NO_ACTION << 2)|(AQ_NO_ACTION << 4)|(AQ_NO_ACTION <<6)|(AQ_NO_ACTION <<<8)|(AQ_NO_ACTION <10);
PWMs[I]->AQCTLB.ALL = AQ_SET |(AQ_NO_ACTION << 2)|(AQ_NO_ACTION << 4)|(AQ_NO_ACTION <<6)|(AQ_NO_ACTION <<<8)|(AQ_NO_ACTION <10);
PWMs[I+1]->AQCTLA.ALL = AQ_SET |(AQ_NO_ACTION << 2)|(AQ_CLEAR <4)|(AQ_NO_ACTION <<6)|(AQ_NO_ACTION <<<8)|(AQ_NO_ACTION <10);
PWMs[I+1]->AQCTLB.ALL = AQ_CLEAR |(AQ_NO_ACTION <<2)|(AQ_SET <<4)|(AQ_NO_ACTION <<6)|(AQ_NO_ACTION <<8)|(AQ_NO_ACTION <10);
} 

现在在某些情况下,我需要执行软件强制以强制降低它,我不能使用HW强制,因为它已经专用于不同的逻辑。

因此,我所做的是调用一个正在执行以下操作的函数:

PWMs[I]->AQCSRC.bit.CSFA= 1;
PWMs[I]->AQCSRC.bit.CSFB= 1;
PWMs[I]->AQCFRCM.bit.CSFA= 1;
PWMs[I]->AQCFRCM.bit.CSFB= 1;
PWMs[I]->AQCTLA.ALL = AQ_CLEAR |(AQ_NO_ACTION << 2)|(AQ_NO_ACTION << 4)|(AQ_NO_ACTION <<6)|(AQ_NO_ACTION <<<8)|(AQ_NO_ACTION <10);
PWMs[I]->AQCTLB.ALL = AQ_CLEAR |(AQ_NO_ACTION << 2)|(AQ_NO_ACTION << 4)|(AQ_NO_ACTION <<6)|(AQ_NO_ACTION <<<8)|(AQ_NO_ACTION <10);
PWMs[I]->AQCTLAM.ALL = AQ_CLEAR |(AQ_NO_ACTION << 2)|(AQ_NO_ACTION << 4)|(AQ_NO_ACTION <<6)|(AQ_NO_ACTION <<<8)|(AQ_NO_ACTION <10);
PWMs[I]->AQCTLBM.ALL = AQ_CLEAR |(AQ_NO_ACTION << 2)|(AQ_NO_ACTION << 4)|(AQ_NO_ACTION <<6)|(AQ_NO_ACTION <<8)|(AQ_NO_ACTION <10); 

在ePWM1和ePWM2上

现在的问题是,我的ePWM1A和ePWM2A过低,而ePWM1B和ePWM2B过高。

我错过了什么吗?

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

    在快速查看您的代码后,我看到在您共享的第三个代码片段中,它正在为EPWM1配置AQCSRC寄存器,但没有用于配置EPWM2的AQCSRC的代码。 您的项目中是否有执行此操作的代码,但只是没有在此处发布?

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

    您好,Elizabeth:

    为了更清楚地说明,PWM[i]是EPwmXRegs数组的指针(其中X从1到12)我调用包含ePWM1和ePWM2的循环中的第三个代码片段。

    事实上,我可以看到ePWM1A和ePWM2A较低,而ePWM1B和ePWM2B较高。

    我不知道这是否有帮助,但如果我以这种方式修改我的代码:

    wms[I]->AQCFRCM.bit.CSFA= 2;
    PWMs[I]->AQCFRCM.bit.CSFF=2;
    PWMs[I]->AQCFRCM.Bit.AQFA=2; AQ_CSLCFRCM.Bit.CSFB=2; PWMs[I]->AQQAQAQAQ=2;
    
    
    无行动<_AQAQAQAQ_5<_AQAQAQ_5<_AQAQAQAQAQ_5<)无行动<_AQAQAQAQ_5<_AQAQAQAQ_5<_5<_AQAQAQAQAQAQAQ_6<_AQAQAQ_5=10<_AQ_AQ_AQ_AQ_AQ_AQ_AQ_AQAQ_AQ_1=无行动<_5<_AQAQAQAQAQAQ_
    PWMs[I]->AQCTLAM.ALL = AQ_CLEAR |(AQ_NO_ACTION <<2)|(AQ_NO_ACTION <<4)|(AQ_NO_ACTION <<8)|(AQ_NO_ACTION <<10);PWMs[I]->AQCTLAM.ALL
    =(AQ_NO_AC_ACT_ACT.)<_4)0无操作<_10<_AQ_0 

    将ePWM强制为高状态,我认为ePWM1A和ePWM2A高,但ePWM1B和ePWM2B低。

    我没有编写ePWM配置的原始代码,但对我来说,它看起来好像有一个东西可以反转A和B输出。 我浏览了文档,但找不到任何可以解释这种情况的信息。

    感谢您的帮助,

    Claudio

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

    我看到第46行中DBCTL寄存器的POLSEL位被设置为有源高互补,这将使EPWMxB输出反转。
    此位可设置为活动高模式,在该模式下,A/B输出均不会反转。

    此致,
    伊丽莎白
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢您的帮助! 这解决了我的问题。