This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] F28M35H52C:跳闸区域中断连续发生两次

Guru**** 2337160 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/584728/f28m35h52c-trip-zone-interrupt-happening-twice-in-a-row

部件号:F28M35H52C

我正在使用连接到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;

}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    多个跳闸事件可能是由于输入限定条件较低。 是否可以检查GPxQSEL值?

    此致,
    Gautam
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复。 我对GPIO引脚没有限定条件,所以 我添加了该限定条件。 在添加限定条件之前 ,我可以 通过 在清除标志之前禁用ISR开头的中断,然后在ISR结尾启用该中断,从而防止两个中断背靠背发生。 如下所示:

    __interrupt void epwm1_isr (void)

    EALLOW;

    EPwm1Regs.TZEINT.Bit.OST = 0;//禁用中断

    EPwm1Regs.TZCLr.bit.OST = 1;//必须通过写入TZCLR[OST]位手动清除单触发跳闸条件。

    EPwm1Regs.TZCLL.bit.DCBEVT1 = 1;//清除DC evt

    EPwm1Regs.TZCLR.bit.INT =1;//清除int标志

    EDIS;

     

    //确认此中断以接收来自组2的更多中断

    PieCtrlRegs.PIEACK.ALL = PIEACK_group2;

    EALLOW;

    EPwm1Regs.TZEINT.Bit.OST = 1;//重新启用int

    EDIS;

    }//结束epwm1_osht_isr

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在进行了一些更多的测试之后,实际上,在我的时间中,似乎只有很小一部分时间我仍然可以连续得到两个中断。 但是,现在我允许此ISR中断其他ISR。 现在我每次都能得到两个连续的中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    RS 说:
    我对GPIO引脚没有限定条件,因此 我添加了该限定条件[/QUOT]

    您将其设置为什么值? 最大值?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在GPXQSELY寄存器上尝试了三个样本鉴定和六个样本鉴定,但仍然看到两个连续中断。