打印

求助:F28335的QEP计算外部增量式编码器脉冲数出错的问题!

[复制链接]
9317|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zlf0146|  楼主 | 2014-1-12 13:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zlf0146 于 2014-1-12 13:14 编辑

当采用新买的增量式编码器(1000线)输出的A、B、I作为输入的信号时,手动转动编码器的转轴一圈时,发现EQep1Regs.QPOSCNT的值只有200多,正常应该有1000x4=4000,如果轴转得慢一点的话,EQep1Regs.QPOSCNT的值也会大一点,但远远没有达到4000。多转几圈的话,EQep1Regs.QPOSCNT的 值也并没有达到4000,基本是一圈200多递增,回转的时候也不递减,还是递增。
  用其他的芯片检测该增量式编码器信号时,则一切正确,证明该增量式编码器本身是工作正常的。
以下是QEP寄存器的设置:
void  PosSpeed_Init(void)
{

    #if (CPU_FRQ_150MHZ)
          EQep1Regs.QUPRD=1500000;        / Unit Timer for 100Hz at 150 MHz SYSCLKOUT =10ms
#endif        /在150MHz系统时钟下产生100Hz的单位时间值,即让qep10ms产生一次timeout中断         
  #if (CPU_FRQ_100MHZ)
          EQep1Regs.QUPRD=1000000;                        // Unit Timer for 100Hz at 100 MHz SYSCLKOUT
#endif        

        EQep1Regs.QPOSCNT = 0;               
        
        EQep1Regs.QDECCTL.bit.QSRC=00;// QEP quadrature count mode 求积计数模式:产生方向和4倍频的时钟
        EQep1Regs.QDECCTL.bit.XCR=0;        // 2x resolution (cnt falling and rising edges)
        EQep1Regs.QDECCTL.bit.SWAP=0;  
        EQep1Regs.QDECCTL.bit.IGATE=1;        //该位置1后,连索引脉冲都过滤了
        EQep1Regs.QDECCTL.bit.QAP=0;
        EQep1Regs.QDECCTL.bit.QBP=0;  
        EQep1Regs.QDECCTL.bit.QIP=0;  
        EQep1Regs.QDECCTL.bit.QSP=0;  
               
        EQep1Regs.QEPCTL.bit.FREE_SOFT=2;   //自然地动作
        EQep1Regs.QEPCTL.bit.PCRM=00;        // 每次索引事件产生时QPOSCNT复位
//        EQep1Regs.QEPCTL.bit.PCRM=01;        // 最大计数位置时QPOSCNT复位
        EQep1Regs.QEPCTL.bit.UTE=1;                 // Unit Timeout Enable 使能单位定时器
        EQep1Regs.QEPCTL.bit.QCLM=1; // Latch on unit time out使能单位时间输出时其他重要寄存器的锁存功能
//        EQep1Regs.QPOSMAX=0xffffffff;                //位置的最大计算值
        EQep1Regs.QPOSMAX=7999;                //位置的最大计算值
        EQep1Regs.QEPCTL.bit.QPEN=1;         // QEP enable 使能QEP
               
        EQep1Regs.QCAPCTL.bit.UPPS=5;           // 1/32 for unit position即每32个QCLK产生一个单位位置时件
        EQep1Regs.QCAPCTL.bit.CCPS=7;        // 1/128 for CAP clock 即捕捉定时器的时钟频率为SYSCLKOUT/128
        EQep1Regs.QCAPCTL.bit.CEN=1;         // QEP Capture Enable 使能QEP捕捉功能        
}
请各位大侠帮帮忙!谢谢!

相关帖子

沙发
zhangmangui| | 2014-1-12 17:14 | 只看该作者
你是采用硬件仿真的方式  手动转动  然后以查看变量或寄存器的方式查看的吗
我觉得最重要的一定  你是不是确认把编码器的某相输入指定为计数器的时钟输入
我以前用2812的时候是没问题的

使用特权

评论回复
板凳
zlf0146|  楼主 | 2014-1-12 21:20 | 只看该作者
zhangmangui 发表于 2014-1-12 17:14
你是采用硬件仿真的方式  手动转动  然后以查看变量或寄存器的方式查看的吗
我觉得最重要的一定  你是不是 ...

谢谢你的建议。我采用变量的方式查看的。但我不是很明白“把编码器的某项输入指定为计数器的时钟输入”这句话的意思,具体该怎么样操作呢?

使用特权

评论回复
地板
zhangmangui| | 2014-1-12 21:35 | 只看该作者
zlf0146 发表于 2014-1-12 21:20
谢谢你的建议。我采用变量的方式查看的。但我不是很明白“把编码器的某项输入指定为计数器的时钟输入”这 ...

我的意思是   编码器的A相或B相送入  就是将编码器信号作为事件管理器通用定时器
的时钟输入   具体寄存器的配置忘了

使用特权

评论回复
5
zlf0146|  楼主 | 2014-1-13 12:35 | 只看该作者
zhangmangui 发表于 2014-1-12 21:35
我的意思是   编码器的A相或B相送入  就是将编码器信号作为事件管理器通用定时器
的时钟输入   具体寄存 ...

今天又试了一下,在我手动转了一会儿之后,这个EQep1Regs.QPOSCNT的值一开始正常的,到了4000后又开始重新计数,可过了一会,就直接跳为0了,怎么转都没数值更新了。我的主程序中,循环是
while(1)
{
    mech=EQep1Regs.QPOSCNT;
}
当我在该语句处设置断点时,运行程序,数值又跟手动旋转保持一致了。是不是没有进循环呢?请问版主知道是什么问题吗?有什么原因引起的?

使用特权

评论回复
6
zhangmangui| | 2014-1-13 13:40 | 只看该作者
zlf0146 发表于 2014-1-13 12:35
今天又试了一下,在我手动转了一会儿之后,这个EQep1Regs.QPOSCNT的值一开始正常的,到了4000后又开始重 ...

应该是抓你配置的定时器的值吧  
2812中是读取CAPK1 = EvaRegs.T2CNT;
以下是相关配置
/*配置通用定时器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

使用特权

评论回复
7
zlf0146|  楼主 | 2014-1-13 17:09 | 只看该作者
本帖最后由 zlf0146 于 2014-1-14 15:52 编辑
zhangmangui 发表于 2014-1-13 13:40
应该是抓你配置的定时器的值吧  
2812中是读取CAPK1 = EvaRegs.T2CNT;
以下是相关配置


使用特权

评论回复
8
zlf0146|  楼主 | 2014-1-14 15:33 | 只看该作者
本帖最后由 zlf0146 于 2014-1-14 15:55 编辑
zhangmangui 发表于 2014-1-13 13:40
应该是抓你配置的定时器的值吧  
2812中是读取CAPK1 = EvaRegs.T2CNT;
以下是相关配置

版主,我用的是28335里的eQEP模块,呵呵,这里面EQep1Regs.QPOSCNT就是计数器的值。初学这个,搞了很久还没完成。

使用特权

评论回复
9
zhangmangui| | 2014-1-14 16:05 | 只看该作者
@paradoxfx   符兄   有时间帮忙看看   谢谢

使用特权

评论回复
10
colorfish1976| | 2014-4-2 16:43 | 只看该作者
我也在做这个,有没有硬件连接图?能不能传分给我,谢谢!
colorfish1976@sina.com

使用特权

评论回复
11
寻觅不倒翁| | 2015-7-17 16:41 | 只看该作者
zhangmangui 发表于 2014-1-12 17:14
你是采用硬件仿真的方式  手动转动  然后以查看变量或寄存器的方式查看的吗
我觉得最重要的一定  你是不是 ...

你好,请问调试F28335,TI官网例程eqep_pos_speed,寄存器EQep1Regs.QPOSCNT的值一直为0 ,是怎么回事啊?谢谢

使用特权

评论回复
12
zhangmangui| | 2015-7-17 23:59 | 只看该作者
寻觅不倒翁 发表于 2015-7-17 16:41
你好,请问调试F28335,TI官网例程eqep_pos_speed,寄存器EQep1Regs.QPOSCNT的值一直为0 ,是怎么回事啊 ...

没有捕获到数   原因很多啊  
这个例程我们看过  不好意思啊

使用特权

评论回复
13
angerbird| | 2015-7-18 09:42 | 只看该作者
zhangmangui 发表于 2014-1-13 13:40
应该是抓你配置的定时器的值吧  
2812中是读取CAPK1 = EvaRegs.T2CNT;
以下是相关配置

看这个相关寄存器的设置的还是没啥问题的啦。

使用特权

评论回复
14
寻觅不倒翁| | 2015-7-19 10:17 | 只看该作者
zhangmangui 发表于 2015-7-17 23:59
没有捕获到数   原因很多啊  
这个例程我们看过  不好意思啊

谢谢解答,请问你有28335的开发板吗?方便帮我调试一下TI官网的eqep_pos_speed例程吗?看你那边运行出来是怎样的结果,谢谢!

使用特权

评论回复
15
zhangmangui| | 2015-7-19 21:55 | 只看该作者
寻觅不倒翁 发表于 2015-7-19 10:17
谢谢解答,请问你有28335的开发板吗?方便帮我调试一下TI官网的eqep_pos_speed例程吗?看你那边运行出来 ...

不好意思  啊     没条件   

使用特权

评论回复
16
BODO| | 2019-5-6 19:47 | 只看该作者
请问,问题解决了吗?我也碰到这个问题了

使用特权

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

本版积分规则

1

主题

7

帖子

0

粉丝