使用epwm模块实现两路pwm180度相移
void InitEPwm1phaseshift(void)
{
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
EPwm1Regs.TBPRD=PERIOD;
EPwm1Regs.TBPHS.bit.TBPHS=0; //用于几个模块同步时加载到TBCTR
EPwm1Regs.TBCTR = 0x0000;
EPwm1Regs.TBCTL.bit.CTRMODE=TB_COUNT_UPDOWN;
EPwm1Regs.TBCTL.bit.PHSDIR = TB_UP;
EPwm1Regs.TBCTL.bit.PHSEN=TB_DISABLE;
EPwm1Regs.TBCTL.bit.PRDLD=TB_SHADOW; //开启TBPRD的shadow寄存器 //TBCLK=SYSCLK/(HSPCLKDIV*CLKDIV)
EPwm1Regs.TBCTL.bit.HSPCLKDIV=TB_DIV1; //对应HSPCLKDIV=1
EPwm1Regs.TBCTL.bit.CLKDIV=TB_DIV1; //对应CLKDIV=1
EPwm1Regs.TBCTL.bit.SYNCOSEL=TB_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.SHDWAMODE=CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE=CC_CTR_ZERO;
EPwm1Regs.AQCTLA.bit.CAU=AQ_SET;//到达比较值时电平为高
EPwm1Regs.AQCTLA.bit.CAD=AQ_CLEAR;//到达比较值时电平为低
EPwm1Regs.AQCTLA.bit.ZRO = AQ_NO_ACTION;
EPwm1Regs.AQCTLA.bit.PRD = AQ_NO_ACTION;
EPwm1Regs.DBCTL.bit.IN_MODE=0;//双边沿延时
EPwm1Regs.DBCTL.bit.OUT_MODE=3;//使能双边沿延时
EPwm1Regs.DBRED.bit.DBRED=400;
EPwm1Regs.DBFED.bit.DBFED=400;
EPwm1Regs.DBCTL.bit.POLSEL=2;//A不翻转,B翻转
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
}
void InitEPwm2phaseshift(void)
{
// Initialize ePWM1/2/3/4/5/6
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
EPwm2Regs.TBPRD=PERIOD;
EPwm2Regs.TBPHS.bit.TBPHS=PERIOD/2; //用于几个模块同步时加载到TBCTR
EPwm2Regs.TBCTR = 0x0000;
EPwm2Regs.TBCTL.bit.CTRMODE=TB_COUNT_UPDOWN;
EPwm2Regs.TBCTL.bit.PHSDIR = TB_UP;
EPwm2Regs.TBCTL.bit.PHSEN=TB_ENABLE;
EPwm2Regs.TBCTL.bit.PRDLD=TB_SHADOW; //开启TBPRD的shadow寄存器 //TBCLK=SYSCLK/(HSPCLKDIV*CLKDIV)
EPwm2Regs.TBCTL.bit.HSPCLKDIV=TB_DIV1; //对应HSPCLKDIV=1
EPwm2Regs.TBCTL.bit.CLKDIV=TB_DIV1; //对应CLKDIV=1
EPwm2Regs.TBCTL.bit.SYNCOSEL=TB_SYNC_IN;
EPwm2Regs.CMPCTL.bit.SHDWAMODE=CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE=CC_CTR_ZERO;
EPwm2Regs.AQCTLA.bit.CAU=AQ_SET;//到达比较值时电平为高
EPwm2Regs.AQCTLA.bit.CAD=AQ_CLEAR;//到达比较值时电平为低
EPwm2Regs.AQCTLA.bit.ZRO = AQ_NO_ACTION;
EPwm2Regs.AQCTLA.bit.PRD = AQ_NO_ACTION;
EPwm2Regs.DBCTL.bit.IN_MODE=0;//双边沿延时
EPwm2Regs.DBCTL.bit.OUT_MODE=3;//使能双边沿延时
EPwm2Regs.DBRED.bit.DBRED=400;
EPwm2Regs.DBFED.bit.DBFED=400;
EPwm2Regs.DBCTL.bit.POLSEL=2;//A不翻转,B翻转
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
}
代码如上,为什么实现不了移相功能,是我同步信号配置错了吗
最好在调试中找出问题,可以从下面几点检查:
同步信号配置
同步事件是否触发相位加载
时钟分频或周期设置
有条件可以用官方的硬件以及软件资源进行对比测试。