您好!
在初始化期间、我希望 EPWM 信号持续为高电平、然后当发生中断时、我希望禁用强制并根据 CMPA 寄存器中更新的值生成 PWM。 为了持续强制输出高电平、我将 AQCSFRC 寄存器0x2的 CSFB 位置为有效位、因为 ePWM6的 B 通道需要输出。 然后、一旦产生中断、我就通过使 CSFB 位为0x0并更新 CMPA 寄存器来禁用强制。 我面临的问题是、初始化期间持续高电平信号与根据 CMPA 寄存器值生成的 PWM 之间存在36ms 的低电平周期 、这是不可取的。 我 无法弄清为什么这么长的这段短时间的这段时间是介于两者之间的。 我使用的 PWM 频率为12kHz。 下面是 PWM 波形的代码和快照。 在图中、蓝色信号在 ePWM 引脚上输出。
int main()
{
InitSysCtrl();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(uint32)&RamfuncsLoadSize);
InitFlash();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;
EDIS;
EPwm6Regs.TBPHS.Halt.TBPHS = 0; //将相位寄存器设置为零
EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//对称模式
EPwm6Regs.TBCTL.bit.PHSEN = TB_disable; //主机模块
EPwm6Regs.TBCTL.bit.PRDLD = TB_SHADOW; //加载影子
EPwm6Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; //同步下流模块
EPwm6Regs.AQSFRC.bit.RLDSF = 3;
EPwm6Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm6Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm6Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // CTR 上的负载=零
EPwm6Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // CTR 上的负载=零
EPwm6Regs.AQCTLB.bit.CAU = AQ_SET; //设置 EPWM6B 的操作
EPwm6Regs.AQCTLB.bit.CAD = AQ_CLEAR;
EPwm6Regs.DBCTL.ALL = DB_DISABLE;
EPwm6Regs.ETSEL.bit.INTEN = 1; //中断使能
EPwm6Regs.ETSEL.bit.INTSEL = 1;当定时器基址计数器等于零时、// Tnterrupt 触发
EPwm6Regs.ETPS.bit.INTPRD = 1;
EPwm6Regs.TBCTR = 0;
EPwm6Regs.AQCSFRC.bit.CSFB = 2; //在输出 B 上强制 A 持续为高电平
EPwm6Regs.TBPRD =周期值;
EPwm6Regs.CMPA.half-CMPA = periodValHalf;
EPwm6Regs.TBCTL.bit.CLKDIV = clkDiv;
EALLOW;
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;
EDIS;
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
}
void epwm6_isr ()
{
EPwm6Regs.ETCLR.bit.INT = 1;
EPwm6Regs.AQCSFRC.bit.CSFB = 0;
EPwm6Regs.CMPA.half.CMPA = 934;
}
