lzlz70707 发表于 2014-5-28 09:14

28335的ECAP抽风啦

我用了ECAP2 ECAP3 ECAP4分别去检测无刷电机的U V W转子信号。
刚开始发现第一次的上升沿或者下降沿中断,各个ECAP还挺正常的,再来一次沿跳变信号,这三个ECAP中的两个ECAP就不断的进入中断,根本停不下来。
后来改了改程序发现,这几个ECAP就进入一次中断,然后就再也不进了,每个ECAP产生且仅响应一次中断,而别的外设中断仍然正常运作。
下面贴一小段代码各位帮帮忙。

lzlz70707 发表于 2014-5-28 09:15

           // Configure peripheral registers
           ECap2Regs.ECCTL2.bit.CAP_APWM = 0;         // ECAP模式,另一种模式是APWM
           ECap2Regs.ECCTL2.bit.CONT_ONESHT = 1;      // One shot
           ECap2Regs.ECCTL2.bit.STOP_WRAP = 0;      // Stop at 1 events
           ECap2Regs.ECCTL1.bit.CAP1POL = 0;          // 默认上升沿触发
           //ECap2Regs.ECCTL1.bit.CAP2POL = 1;          // Falling edge
          // ECap2Regs.ECCTL1.bit.CAP3POL = 0;          // Rising edge
           //ECap2Regs.ECCTL1.bit.CAP4POL = 0;          // Falling edge
           ECap2Regs.ECCTL1.bit.CTRRST1 = 1;          // Difference operation
           //ECap2Regs.ECCTL1.bit.CTRRST2 = 1;          // Difference operation
           //ECap2Regs.ECCTL1.bit.CTRRST3 = 1;          // Difference operation
           //ECap2Regs.ECCTL1.bit.CTRRST4 = 1;          // Difference operation
           ECap2Regs.ECCTL2.bit.SYNCI_EN = 0;         // Disable sync
           ECap2Regs.ECCTL2.bit.SYNCO_SEL = 2;      // Disable sync out
           ECap2Regs.ECCTL1.bit.CAPLDEN = 1;          // Enable CAP1-CAP4 register loads
           ECap2Regs.ECCTL1.bit.PRESCALE = 0;
           ECap2Regs.ECCTL2.bit.TSCTRSTOP = 1;      // Start Counter
           ECap2Regs.ECCTL2.bit.REARM = 1;            // arm one-shot
           ECap2Regs.ECEINT.bit.CEVT1 = 1;
           ECap2Regs.ECEINT.bit.CEVT2 = 1;            // CEVENT = interrupt

lzlz70707 发表于 2014-5-28 09:31

interrupt void ISRCap2(void)
{
        ControllerEventHandler(TRIGER);
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
    ECap2Regs.ECCLR.all=0xFFFF;//clare all flag
    ECap3Regs.ECCTL2.bit.REARM = 1;
}

interrupt void ISRCap3(void)
{
        ControllerEventHandler(TRIGER);
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
    ECap3Regs.ECCLR.all=0xFFFF;//clare all flag
    ECap3Regs.ECCTL2.bit.REARM = 1;
}

interrupt void ISRCap4(void)
{
        ControllerEventHandler(TRIGER);
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
    ECap4Regs.ECCLR.all=0xFFFF;//clare all flag
    ECap4Regs.ECCTL2.bit.REARM = 1;
}

zhangmangui 发表于 2014-5-28 22:45

配置过的2812    不知道是否有参考价值
void InitEv(void)
{
       
        EvaRegs.DBTCONA.all = 0x0530;        //使能死区定时器,分频40/16=2.5M,死区时间5*0.4us=2us
       
        EvaRegs.T1CNT = 0;                                //定时器1初值设为0
        EvaRegs.T1PR = 4652;            //1K(4650)       
        EvaRegs.ACTR.all = 0x0066;                //PWM2低有效,PWM1高有效,改变设置可使电机反转
        EvaRegs.CMPR1=0;
    EvaRegs.CMPR2=0;
           EvaRegs.COMCONA.all = 0xA600;        //比较器控制A
//        EvaRegs.T1CMPR = 2400;          //定时器1比较值
//        EvaRegs.T1CON.all = 0x144E;   //连续增模式,TPS系数40M/16=2.5M,T1使能
        EvaRegs.T1CON.all = 0x1442;   //定时器输入预定标时钟HSPCLK/16
       
/*配置通用定时器2用于正交编码QEP模块和捕获单元模块CAP */
    EvaRegs.T2CON.all=0x1830;      //仿真停挂起,双向递增/减计数,禁止定时器操作,定时器时钟来源QEP
                                     //定时器重载条件保留,禁止定时器比较操作
    EvaRegs.T2PR = 0xFFFF;                   //定时周期0xFFFF
    EvaRegs.T2CNT = 0x7FFF;                 //设置定时初值为0x7FFF

/*配置通用定时器3用于精确时间测量,服务于M/T测速   */
    EvbRegs.T3CNT = 0;             //定时器3初始值,用于测量高频脉冲个数,M/T测速
    EvbRegs.T3PR = 0xFFFF;         
        EvbRegs.T3CON.all = 0x1000;      //连续增模式,输入时钟预定标为0(HSPCLK=75M,周期为13.33ns)

        EvaRegs.CAPCONA.all=0;         //复位捕获单元寄存器,QEP电路清0
    EvaRegs.CAPCONA.bit.CAP1EDGE=1;//捕获单元检测上升沿
    EvaRegs.CAPCONA.bit.CAP12TSEL=0;//捕获单元选择定时器为定时器2
        EvaRegs.CAPFIFO.bit.CAP1FIFO=0; //清空CAP1FIFO
//        EvaRegs.CAPCONA.bit.CAPRES = 0;         //清除所有捕获单元寄存器,QEP电路清0
        EvaRegs.EVAIFRC.bit.CAP1INT=1;//清中断标志位
    EvaRegs.EVAIMRC.bit.CAP1INT=1;//CAP1中断使能
        EvaRegs.CAPCONA.bit.CAPQEPN = 0;         //禁止捕获单元1和2
//        EvaRegs.T2CON.bit.TENABLE = 1;         //使能定时器2
        EvaRegs.T2CON.bit.TCLKS10 = 3;          //启动T2计数QEP
}

lzlz70707 发表于 2014-5-28 23:50

找到问题鸟 跟ECAP自身配置没太大关系 问题出在中断里面的一个读取霍尔传感器的函数 此函数先是将ECAP模块用的引脚置为GPIO功能 再读取 读取完了再把那几个引脚复用给ECAP 去掉这个过程直接读取IO端口的数值就行 不用改变引脚的复用功能

lzlz70707 发表于 2014-5-29 10:40

zhangmangui 发表于 2014-5-28 22:45 static/image/common/back.gif
配置过的2812    不知道是否有参考价值
void InitEv(void)
{


如果IO的MUX被配置用于ECAP,对其进行读操作能有正常的结果么。

zhangmangui 发表于 2014-5-29 21:22

lzlz70707 发表于 2014-5-29 10:40 static/image/common/back.gif
如果IO的MUX被配置用于ECAP,对其进行读操作能有正常的结果么。

应该是不正确的

sdzhen 发表于 2014-6-26 23:46

你好,可以问一个问题吗?我也用28335开发无刷直流电机控制器,采用ECap模块时检测霍尔信号时,28335的CAP引脚不能像2812那样既能检测上升沿,又能检测下降沿,28335的ECAP检测分为四个事件,如果设置CEVT1检测上升沿,CEVT2检测下降沿,同时设置两个事件引发中断,好像不可以。不知道你是怎么检测的?希望能看到我的留言并帮忙解答下,谢谢

sdzhen 发表于 2014-6-26 23:49

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

zhangmangui 发表于 2014-6-27 12:44

sdzhen 发表于 2014-6-26 23:46 static/image/common/back.gif
你好,可以问一个问题吗?我也用28335开发无刷直流电机控制器,采用ECap模块时检测霍尔信号时,28335的CAP ...

@lzlz70707 交流一下
帮忙解答

lzlz70707 发表于 2014-6-30 10:34

sdzhen 发表于 2014-6-26 23:49 static/image/common/back.gif
我现在用dsp控制无刷直流电机,需要cap捕获三路霍尔位置信号来进行电子换相。这样的话,必须使每路信号的上 ...

28335 每个ECAP都有四个CEVT 分别配置为FALLING和RISING 比如我是配置1 3Falling 2 4Rising,然后开 1 2的中断,3 4也可以开。就妥了

寒塘渡鹤 发表于 2015-5-11 10:23

楼主好牛

XINGFUDEWUNAI 发表于 2015-7-1 17:48

lzlz70707 发表于 2014-6-30 10:34
28335 每个ECAP都有四个CEVT 分别配置为FALLING和RISING 比如我是配置1 3Falling 2 4Rising,然后开 1 2 ...

楼主,我现在用到28035的捕获,补一个频率大概为100Hz的方波的频率,但是出来的结果一直不对,4个捕获寄存器的值一直一样。这是怎么回事?谢谢!

fanxingxing 发表于 2016-7-25 18:30

sdzhen 发表于 2014-6-26 23:46
你好,可以问一个问题吗?我也用28335开发无刷直流电机控制器,采用ECap模块时检测霍尔信号时,28335的CAP ...

同一个脉冲信号,一个检测上升沿,一个检测下降沿,怎么会同时引发中断呢?
页: [1]
查看完整版本: 28335的ECAP抽风啦