我正在使用连接到GPIO并分配给Trip5的比较器的输出来触发EPWM1TZ中断。 我的问题是中断总是连续发生两次,但我确信跳闸条件的发生时间仅够导致 一次跳闸 (比较器上的鉴定时间为~800ns,我正在使用脉冲发生器对比较器输入进行900 ns脉冲)。
当我在ISR中步进代码时,执行PieCtrlRegs.PIEACK.ALL = PIEACK_group2,我看到PIEACK 从0x0002转到0x0000, 然后 ,我执行EPwm1Regs.TZCLL.bit.INT =1,我注意到TZCLR INT位不清除, PIEIFR2寄存器设置为0x0001,PIEACK设置回0x0002 -似乎似乎是EPwm1Regs.TZCLL.Bit.INT =1正在强制发生另一个中断。 这毫无意义,但这正是我所看到的。
有什么想法? 我在想,也许我是不是因为我设置了epwm1而导致了两个中断脉冲,但是我在寄存器中看到的行为让我觉得这是另一回事了。 我最初尝试在没有数字比较的情况下让中断工作,但无法使其工作。 是否有更好的设置方法?
下面是我的ISR和init:
__interrupt void epwm1_isr (void)
{
//确认此中断以接收来自组2的更多中断
PieCtrlRegs.PIEACK.ALL = PIEACK_group2;
EALLOW;
EPwm1Regs.TZCLR.bit.INT =1;//清除TZ中断
EPwm1Regs.TZCLr.bit.OST = 1;//必须通过写入TZCLR[OST]位手动清除单触发跳闸条件。
EPwm1Regs.TZCLL.bit.DCBEVT1 = 1;//清除DC evt
EDIS;
}
void InitEpwm1 (void)
{
EPwm1Regs.TBPRD = 400;
EPwm1Regs.TBCTR = 0;//时基计数器寄存器
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//向上/向下计数
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.PRDLD = TB_immediate;//设置即时负载
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;//SET B HIGH AT TBCTR = 0
EPwm1Regs.DCBHTRIPSEL.bit.TRIPINPUT5 =1;
EPwm1Regs.DCTRIPSEL.bit.DCBHCOMPSEL = DC_TRIPIN5;//直流跳闸选择- DCB高输入选择位到TZ2
EPwm1Regs.TZDCSEL.bit.DCBEVT1 = TZ_DCBH_HI;//DCB跳闸事件1 (当DCBH高时)-即当Trip5高时
//EPwm1Regs.TZsel.bit.OSAHT5 = TZ_enable;//启用TZ5作为一个激发
EPwm1Regs.TZsel.bit.DCBEVT1 = TZ_ENABLE;//启用TZ5作为dcbevt1单次激发
EPwm1Regs.TZCTL.bit.DCBEVT1 = TZ_FORT_LO;//B将在事件1上处于低位
EPwm1Regs.TZCTL.bit.TZB = TZ_FORM_LO;//在发生跳闸事件时,EPWM1B将强制为低电平
EPwm1Regs.TZEINT.Bit.OST = 1;//启用中断生成;单触发跳闸事件将导致EPWM1_TZINT PIE中断。
//EPwm1Regs.TZEINT.DBI.DCBEVT1 = 1;
}