要实现这么一个目的,初始化把ePWM2A和ePWM2B全部置零,然后开启中断,在中断中改变CPMA和CMPB的值,以产生某占空比的PWM以驱动推挽电路。
现在的问题是,初始化之后,ePWM2B就立刻置1,调试了好久,真是奇了怪了,导致一上电从GPIO3口就出来一个12.5us左右的脉冲,我的推挽就偏磁就炸管。
下面是ePWM2的初始化函数,频率40kHz,主频60M,所以增减模式TBPRD=750,关键位置我已经加粗。执行完这个初始化以后应该啥都不输出才对,因为ePWM2A在ZERO一置位就碰到了CPMA=0就清零;ePWM2B在PRD一置位就碰到了CPMB=750就清零。
void InitEPwm2()
{
EPwm2Regs.TBPRD = 750; //40kHz
EPwm2Regs.TBPHS.half.TBPHS = 0x0000;
EPwm2Regs.TBCTR = 0x0000;
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm2Regs.CMPA.half.CMPA = 0;
EPwm2Regs.CMPB = 750;
EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm2Regs.AQCTLB.bit.PRD = AQ_SET;
EPwm2Regs.AQCTLB.bit.CBD = AQ_CLEAR;
EPwm2Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;
EPwm2Regs.ETSEL.bit.INTEN = 1;
EPwm2Regs.ETPS.bit.INTPRD = ET_1ST;
}
主函数里,一执行完我加粗的那一句,ePWM2B,也就是03口就输出高电平。一直高到中断里改变CMPB的值。
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
InitEPwm2();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
奇了怪了
Liang Hu2:
我画了一个示意图:
中断里改变CMPA和CMPB的位置,以实现可变的占空比。
但初始化的时候,我让CMPA在0的位置,让CMPB在PRD的位置,这时应该没有波形输出才对。
要实现这么一个目的,初始化把ePWM2A和ePWM2B全部置零,然后开启中断,在中断中改变CPMA和CMPB的值,以产生某占空比的PWM以驱动推挽电路。
现在的问题是,初始化之后,ePWM2B就立刻置1,调试了好久,真是奇了怪了,导致一上电从GPIO3口就出来一个12.5us左右的脉冲,我的推挽就偏磁就炸管。
下面是ePWM2的初始化函数,频率40kHz,主频60M,所以增减模式TBPRD=750,关键位置我已经加粗。执行完这个初始化以后应该啥都不输出才对,因为ePWM2A在ZERO一置位就碰到了CPMA=0就清零;ePWM2B在PRD一置位就碰到了CPMB=750就清零。
void InitEPwm2()
{
EPwm2Regs.TBPRD = 750; //40kHz
EPwm2Regs.TBPHS.half.TBPHS = 0x0000;
EPwm2Regs.TBCTR = 0x0000;
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm2Regs.CMPA.half.CMPA = 0;
EPwm2Regs.CMPB = 750;
EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm2Regs.AQCTLB.bit.PRD = AQ_SET;
EPwm2Regs.AQCTLB.bit.CBD = AQ_CLEAR;
EPwm2Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;
EPwm2Regs.ETSEL.bit.INTEN = 1;
EPwm2Regs.ETPS.bit.INTPRD = ET_1ST;
}
主函数里,一执行完我加粗的那一句,ePWM2B,也就是03口就输出高电平。一直高到中断里改变CMPB的值。
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
InitEPwm2();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
奇了怪了
Liang Hu2:
回复 Liang Hu2:
找到问题的所在了,把同步化这段语句去掉,只留下InitEPwm2()就可以了。
/*EALLOW;SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;EDIS;*/InitEPwm2();/*EALLOW;SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS*/
但是我看controlSUITE里面28027的官方例程,所有有关PWM的都有Time Base Clock Synchronization的语句,不同步会出现什么问题?为什么要同步呢?