TI中文支持网
TI专业的中文技术问题搜集分享网站

28027的ePWM2B初始化后总置一

要实现这么一个目的,初始化把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的语句,不同步会出现什么问题?为什么要同步呢?

赞(0)
未经允许不得转载:TI中文支持网 » 28027的ePWM2B初始化后总置一
分享到: 更多 (0)