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.

28035 Ecap如何设置可以使上升沿和下降沿同时触发一个中断ECAP1_INT?

Other Parts Discussed in Thread: CONTROLSUITE

我在用GPIO24作为Ecap时,只能使其上升沿触发中断ECAP1_INT,或下降沿触发ECAP1_INT,怎么就不能二者都触发中断ECAP1_INT?

求各位能否给出个代码的例子,我的例子贴出来,看看怎么修改?

1、初始化

 EALLOW;                       // Enable EALLOW
 // Set up the ECAP1 pin to primary function
 GpioCtrlRegs.GPAPUD.bit.GPIO24 = 0;//上拉
 GpioCtrlRegs.GPADIR.bit.GPIO24 = 0; //输入
 GpioCtrlRegs.GPAQSEL2.bit.GPIO24 = 0; //
 GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 1;  // GPIO24 is ECAP1
 EDIS;                         // Disable EALLOW

   ECap1Regs.ECEINT.all = 0x0000;             // Disable all capture interrupts
   ECap1Regs.ECCLR.all = 0xFFFF;              // Clear all CAP interrupt flags
   ECap1Regs.ECCTL1.bit.CAPLDEN = 0;          // Disable CAP1-CAP4 register loads
   ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0;        // Make sure the counter is stopped

   // Configure peripheral registers
   ECap1Regs.ECCTL2.bit.CAP_APWM = 0; //Ecap模式
   ECap1Regs.ECCTL2.bit.CONT_ONESHT = 1;      // one shot mode
   ECap1Regs.ECCTL2.bit.STOP_WRAP = 1;        // Stop at 2 events

   //ECap1Regs.ECCTL1.bit.CAP1POL = 1;          // Falling edge
   ECap1Regs.ECCTL1.bit.CAP2POL = 0;          // Rising edge
   ECap1Regs.ECCTL2.bit.SYNCI_EN = 0;         // Disable sync in
   ECap1Regs.ECCTL2.bit.SYNCO_SEL = 2;   //Disable sync out
   ECap1Regs.ECCTL2.bit.REARM = 1;            // arm one-shot
   //ECap1Regs.ECEINT.bit.CEVT1 = 1;            // 1st events = interrupt
   ECap1Regs.ECEINT.bit.CEVT2 = 1;            // 2st events = interrupt

2、开中断

   EALLOW; 

   PieVectTable.ECAP1_INT = &ecap1_isr;
   EDIS;
   IER |= M_INT4;
   PieCtrlRegs.PIEIER4.bit.INTx1 = 1;

3、中断函数

interrupt void ecap1_isr(void)
{
    GpioDataRegs.GPATOGGLE.bit.GPIO6 ^=1; //用来测试中断跳变和外部信号是否一致
    //ECap1Regs.ECCLR.bit.CEVT1 = 1;
    ECap1Regs.ECCLR.bit.CEVT2 = 1;
    ECap1Regs.ECCLR.bit.INT = 1;
    ECap1Regs.ECCTL2.bit.REARM = 1;
    // Acknowledge this interrupt to receive more interrupts from group 4
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
}

  • 建议您参考eCap_ePWM的例程修改

  • Rogers,

    你查看一下文档SPRUFZ8A - TMS320F2802x, 2803x Piccolo Enhanced Capture (eCAP) Module,里面有中断使能寄存器,可以对多个捕获事件进行中断使能,所以就可以在捕获上升沿和下降沿的时候都进入中断。

    ECAP Interrupt Enable Register (ECEINT)

    Eric

  • Thanks Eric:

    你说的这种设置我已经设置了,如  

      ECap1Regs.ECEINT.bit.CEVT1 = 1;            // 1st events = interrupt
       ECap1Regs.ECEINT.bit.CEVT2 = 1;            // 2st events = interrupt

    但是还是只能触发事件CEVT1中断,我不知道在设置双边沿触发时,oneshot模式和continuous模式会不会有影响,请问有没有一个设置双边沿触发的例子?

  • 谢谢您的提示,我也是看过了,但该例程是在产生第四个事件时才触发中断,并没有设置成双边沿触发中断,还是有区别,您有设置成双边沿触发中断的代码例子吗??

  • Eric:

    发现我设置了强制中断事件就可以双边沿触发了:

      if(test1)
      {
       ECap1Regs.ECFRC.bit.CEVT1=1;
       test1=0;
      }
      else
      {
       ECap1Regs.ECFRC.bit.CEVT2=1;
       test1=1;
      }

    这个代码在100us的定时中断中执行,这样强制了之后,就能两个事件都触发外部中断,但是我用实际的一路HALL信号触发时,只能在单边沿触发中断,不知何解?

     

  • rogers,

    根据你的测试,我又看了一下user guide以及根据ControlSUITE 的例程ecap_capture_pwm做了测试,发现确实不能同时设置两个CEVT事件产生中断,比如如果同时设置CEVT1,2,这是CEVT2事件会被忽略,同理,CEVT2,3,则CEVT3会被忽略,没有计数值载入到CAP3中。所以我应该纠正我前面的说法,应该只能使用一个事件产生中断。

    再看一下eCAP的user guide,在ECEINT寄存器下面有这段话:

    The interrupt enable bits (CEVT1, ...) block any of the selected events from generating an interrupt. Events will still be latched into the flag bit (ECFLG register) and can be forced/cleared via the ECFRC/ECCLR registers.

    所以我认为CEVT1会阻断CEVT2的中断,依次类推。

    Eric

  • Thanks Eric:

    我就得更改计算方法了,嘿嘿,真心的感谢你的支持!!!

  • 您好!我遇到了类似的问题,偶然看到了你们的讨论。受益匪浅。请问,最后您的问题是怎么解决的呢?

    我有个问题想请教您!

    我现在用dsp控制无刷直流电机,需要cap捕获三路霍尔位置信号来进行电子换相。这样的话,必须使每路信号的上升沿和下降沿触发中断啊!怎么解决呢?

    期待您的解答,谢谢您!

  • 好久没搞电机了,貌似不用上升沿和下降沿都做触发吧,电机的转速又不均匀的,HALL出来的也不是方波,检测三相HALL的上升沿不就好了么!

    仅供参考!

  • 看到别人是这么解决的,把CEVT1和CEVT2 分配给两个CAP中断来分别俘获!参考http://bbs.eeworld.com.cn/thread-380183-1-1.html

  • 那要捕获上下沿 均进入中断 要怎么做?  带霍尔的直流无刷电机场合 使用!

    能否给一个答复 xinchangkk@126.com

  • 通过寄存器ECCTL1的位CAP1POL配置为0(上升沿),CAP2POL配置为1(下降沿)。再通过寄存器ECEINT的位CEVT1配置为1,CEVT2配置为1使能这两个中断。

    Eric 

  • 试过了, 按你说的设置, 只能进入 CEVT1捕获中断 , CEVT2捕获的中断就无法进入了,

    用的是 28069pz的芯片

    试了另一种方法:

    ECap1Regs.ECCTL2.bit.CONT_ONESHT = 1;      // 单次模式

    ECap1Regs.ECCTL2.bit.STOP_WRAP = 0;        // 单次模式下捕获事件1后重启

    ECap1Regs.ECCTL1.bit.CAP1POL = 0;          // 捕获事件1在下降沿触发

    ECap1Regs.ECCTL1.bit.CTRRST1 = 1;          // 捕获事件1发生时复位计数器为0

    ECap1Regs.ECCTL2.bit.SYNCI_EN = 0; // 相位载入

    ECap1Regs.ECCTL2.bit.SYNCO_SEL = 2;        // 选择同步输出事件作为同步输出信号

    ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;        // 计数器运行

    ECap1Regs.ECCTL2.bit.REARM = 1;            // 单次模式下重新载入顺序

    ECap1Regs.ECCTL1.bit.CAPLDEN = 1;          // 使能cap1~4载入

    ECap1Regs.ECEINT.bit.CEVT1 =1;    // 捕获事件1~1作为一个中断源


    如此设置 然后在中断中:

    interrupt void ecap1_isr(void)
    {
    if (ECap1Regs.ECCTL1.bit.CAP1POL == 1) ECap1Regs.ECCTL1.bit.CAP1POL =0;
    else ECap1Regs.ECCTL1.bit.CAP1POL = 1;    // 切换上升沿和下降沿触发

    ECap1Regs.ECCLR.bit.CEVT1 = 1;
    ECap1Regs.ECCLR.bit.INT = 1;
    ECap1Regs.ECCTL2.bit.REARM = 1;
    // Acknowledge this interrupt to receive more interrupts from group 4
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;

    }

    这样方能捕获 上升沿和下降沿。  

    同时开启 CEVT1、CEVT2捕获中断时 , CEVT1中断处理完了CEVT2时钟无法进入中断,待下一个 CEVT1到来才又进入中断

    ----------------敢问这是何缘故?(TMS320F28069PZ)



  • 您好,可以加一下QQ吗?我有一个ECAP中断的小问题想问您一下,thanks

    qq:568991873

  • 您好,可以加一下QQ吗?我有一个ECAP中断的小问题想问您一下,thanks

    qq:568991873

  • 无法进入CEVT2中断,请问是否有什么需要注意的配置吗

    带hall的无刷直流电机需要检测上升下降沿来控制换向,需要ecap在双边沿进入中断