打印
[DSP编程]

28335的ECAP抽风啦

[复制链接]
6159|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lzlz70707|  楼主 | 2014-5-28 09:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用了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
}

使用特权

评论回复
5
lzlz70707|  楼主 | 2014-5-28 23:50 | 只看该作者
找到问题鸟 跟ECAP自身配置没太大关系 问题出在中断里面的一个读取霍尔传感器的函数 此函数先是将ECAP模块用的引脚置为GPIO功能 再读取 读取完了再把那几个引脚复用给ECAP 去掉这个过程直接读取IO端口的数值就行 不用改变引脚的复用功能

使用特权

评论回复
6
lzlz70707|  楼主 | 2014-5-29 10:40 | 只看该作者
zhangmangui 发表于 2014-5-28 22:45
配置过的2812    不知道是否有参考价值
void InitEv(void)
{

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

使用特权

评论回复
7
zhangmangui| | 2014-5-29 21:22 | 只看该作者
lzlz70707 发表于 2014-5-29 10:40
如果IO的MUX被配置用于ECAP,对其进行读操作能有正常的结果么。

应该是不正确的  

使用特权

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

使用特权

评论回复
9
sdzhen| | 2014-6-26 23:49 | 只看该作者
我现在用dsp控制无刷直流电机,需要cap捕获三路霍尔位置信号来进行电子换相。这样的话,必须使每路信号的上升沿和下降沿触发中断啊!怎么解决呢?

使用特权

评论回复
10
zhangmangui| | 2014-6-27 12:44 | 只看该作者
sdzhen 发表于 2014-6-26 23:46
你好,可以问一个问题吗?我也用28335开发无刷直流电机控制器,采用ECap模块时检测霍尔信号时,28335的CAP ...

@lzlz70707 交流一下
帮忙解答

使用特权

评论回复
11
lzlz70707|  楼主 | 2014-6-30 10:34 | 只看该作者
sdzhen 发表于 2014-6-26 23:49
我现在用dsp控制无刷直流电机,需要cap捕获三路霍尔位置信号来进行电子换相。这样的话,必须使每路信号的上 ...

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

使用特权

评论回复
12
寒塘渡鹤| | 2015-5-11 10:23 | 只看该作者
楼主好牛

使用特权

评论回复
13
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个捕获寄存器的值一直一样。这是怎么回事?谢谢!

使用特权

评论回复
14
fanxingxing| | 2016-7-25 18:30 | 只看该作者
sdzhen 发表于 2014-6-26 23:46
你好,可以问一个问题吗?我也用28335开发无刷直流电机控制器,采用ECap模块时检测霍尔信号时,28335的CAP ...

同一个脉冲信号,一个检测上升沿,一个检测下降沿,怎么会同时引发中断呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

264

帖子

5

粉丝