请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号: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过高。
我错过了什么吗?