切换到宽版
爱科技/爱创意/爱折腾;电子/数码爱好者的家!欢迎访问新版数码之家网站
  • 13797阅读
  • 34回复

[C51]EC11旋转编码器奇怪的问题 [复制链接]

上一主题 下一主题
离线smzj10315655
 

发帖
2193
M币
1933
专家
0
粉丝
23
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2018-01-03
这几天再学习EC11编码器,我买到的是一圈20脉冲,5个引脚的,
刚开始用的普通IO连接的旋转编码器,感觉反应太慢了,还会丢步,
网上看到说用中断可以解决这个问题,就写了下面这段程序(只有按键处理部分),用的stc单片机,EC11_A连接外部中断INT0,EC11_B连接普通IO,中断设置成下降沿触发,现在是反转一切正常,正转的时候,程序有时候也会判断为反转,导致正转的时候,num的值一会加1,一会减1,整体下来基本没变化。只有慢慢的正转,才能正常,请问玩过这个编码器的坛友,这是怎么回事呢?编码器AB相硬件接了消痘电路。

void int0() interrupt 0 using 0
{
    EX0=0;
    if(EC11_A==0)
  {
        if(EC11_B==0)
    {
            if(num==20)
          num=0;
            num++;
    }
    if(EC11_B==1)
    {
            if(num ==0)
            num=20;
            num--;
    }
  }
    EX0=1;  
}
离线飞向狙沙

发帖
13086
M币
7380
专家
48
粉丝
10368
只看该作者 1楼 发表于: 2018-01-03
为啥要一个用中断一个不用呢
离线smzj10315655

发帖
2193
M币
1933
专家
0
粉丝
23
只看该作者 2楼 发表于: 2018-01-04
飞向狙沙:为啥要一个用中断一个不用呢
 (2018-01-03 23:13) 

我看别人的程序也是这样搞得,我就搬过来了,难道用两个中断就正常了?我明天试试,头一次玩这个不太懂

内容来自Android手机客户端

离线flave

发帖
420
M币
1800
专家
-1
粉丝
30
只看该作者 3楼 发表于: 2018-01-04
#include "head.h"

unsigned char gear_set;
//改动:不使用中断
void init_encoder(void)
{     //端口AB设置为输入
     PC_DDR|=0b00000000;
     PC_CR1|=0b00001000;
    
     PB_DDR|=0b00000000;
     PB_CR1|=0b00010000;
    
}
void scan_encoder(void)
{
    static u8 last_gear_set=0;
    static u8 last_port_A;
    static u8 last_port_B;
    
    last_gear_set=gear_set;
    
    if(TEST1(Encoder_B_IN,Encoder_B_line))//检测到端口B高电平
                last_port_B=1;
    else
                last_port_B=0;
                
    if(TEST1(Encoder_A_IN,Encoder_A_line))//检测到端口A高电平
                last_port_A=1;
    else
                last_port_A=0;
                
    if((last_port_B==0)&&(last_port_A==1))
    {
            F_encoder_edge=1;
    }

    if((last_port_B==0)&&(last_port_A==0)&&F_encoder_edge)
    {
        F_encoder_edge=0;

        gear_set--;//向左转
        
    }
    
    if((last_port_B ==1)&&(last_port_A==1)&&F_encoder_edge)
    {
        F_encoder_edge=0;
                
        gear_set++;//向右转
        
    }
        
    if(last_gear_set!=gear_set)//编码器转动
    {
            F_encoder_allow=1;
    }
}

以前用STM8做的供你参考,论坛里有很多关于编码器的帖子
离线smzj10315655

发帖
2193
M币
1933
专家
0
粉丝
23
只看该作者 4楼 发表于: 2018-01-04
回 flave 的帖子
flave:#include "head.h"
unsigned char gear_set;
//改动:不使用中断
void init_encoder(void)
....... (2018-01-04 08:38) 回 flave 的帖子

多谢了,我试试你的程序
离线蓝色sky

发帖
1426
M币
160
专家
1
粉丝
3
只看该作者 5楼 发表于: 2018-01-04
记得以前好像也遇到过,后面还是用的普通IO
需要判断上一次AB的电平
离线smzj10315655

发帖
2193
M币
1933
专家
0
粉丝
23
只看该作者 6楼 发表于: 2018-01-04
回 蓝色sky 的帖子
蓝色sky:记得以前好像也遇到过,后面还是用的普通IO
需要判断上一次AB的电平 (2018-01-04 14:51) 回 蓝色sky 的帖子

我用普通IO感觉反应很慢,稍微转的快了就不响应了,也是判断判断上一次B相的状态和当前B相的状态,然后判断是正转还是反转
离线66ok66

发帖
1357
M币
1010
专家
10
粉丝
21
只看该作者 7楼 发表于: 2018-01-04
无论你写多好 ,也会丢步的 ,你不信去些成品的产品用用 ,一样的丢步 ,辩断错误另一回事,但是丢步又另一回事了
          你扭得很快时 : 1 有可能它产生很快 ,单片机测不到了
                                         2 你别以为机械是 100%接触的,特别是一 二 元一个的 ,
                                            你压着来扭立即正常 ,这说明机械快了一样它本身接触不对
离线smzj10315655

发帖
2193
M币
1933
专家
0
粉丝
23
只看该作者 8楼 发表于: 2018-01-04
回 66ok66 的帖子
66ok66:无论你写多好 ,也会丢步的 ,你不信去些成品的产品用用 ,一样的丢步 ,辩断错误另一回事,但是丢步又另一回事了
          你扭得很快时 : 1 有可能它产生很快 ,单片机测不到了
         .. (2018-01-04 15:38) 回 66ok66 的帖子

我买的就是一块多一个的编码器,现在我把a b相和单片机连接的引脚调换过来,发现正转的时候程序响应是正常的,反转又不正常了,现在可以确定的是编码器没问题,多半是程序的原因了,暂时还没有找到问题所在
离线e820

发帖
371
M币
-283
专家
1
粉丝
5
只看该作者 9楼 发表于: 2018-01-04
旋转编码器每走一步,有四个按序出现的上升沿和下降沿,正常情况它们出现的次序只有两种可能,程序记录它们出现的次序,这两张以外的情况说明编码器坏了或者丢步。这样编码器有故障时,程序只是不响应,不会出现错乱的情况。
快速回复
限80 字节
“新手上路”发帖需审核后才能显示(请认真发帖),达到数码9级后取消此限制
 
上一个 下一个