xyy211502 发表于 2010-10-19 11:00:22

EC11编码器解码问题!!!!

我用网上找的解码程序,发现要旋转两格才有输出,于是使用的春风里面的解码程序,发现编码器也是旋转两格才有输出,大家有没有遇到过这个问题?请大家进讨论一下,一下是我用的几种解码程序,都是旋转两个才有输出:
#define KeyA()         (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6))//GPIOC->IDR & GPIO_Pin_6       
#define KeyB()       (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7))//GPIOC->IDR & GPIO_Pin_7

//其中FlagUp FlagDown分别代表左旋,右旋

第一种春风电源程序里得解码程序:
static vu16 key5del = 100;//按键5禁止延时       
static vu16 key6del = 100;//按键6禁止延时       
vu8 a,c,d;
static vu8 Key5Circs = 0;//按键5状态
static vu8 Key6Circs = 0;//按键6状态

for(a = 0;a < 50;a++);               
if(KeyA() == 0)c = 0;
else             c = 1;
for(a = 0;a < 50;a++);
if(KeyB() == 0)d = 0;
else             d = 1;               
if(key5del > 0) key5del --;//按键5禁止延时
if(key6del > 0) key6del --;//按键6禁止延时

if((c == 0)&&(d == 0)&&(Key5Circs == 0)&&(key5del == 0))    Key5Circs = 1;       //c0,d0
else if((c == 0)&&(d == 1)&&(Key5Circs == 1))Key5Circs = 2;                //c0,d1
else if((c == 1)&&(d == 1)&&(Key5Circs == 2))Key5Circs = 3;                //c1,d1
else if((c == 1)&&(d == 0)&&(Key5Circs == 3))Key5Circs = 4;                //c1,d0   
else if((c == 0)&&(d == 0)&&(Key5Circs == 4)){Key5Circs = 0; FlagDown = 1;Key6Circs = 0;key6del = 100;} //c0,d0 按键有效

if((c == 0)&&(d == 0)&&(Key6Circs == 0)&&(key6del == 0))    Key6Circs = 1;       //c0,d0
else if((c == 1)&&(d == 0)&&(Key6Circs == 1))Key6Circs = 2;                //c1,d0
else if((c == 1)&&(d == 1)&&(Key6Circs == 2))Key6Circs = 3;                //c1,d1
else if((c == 0)&&(d == 1)&&(Key6Circs == 3))Key6Circs = 4;                //co,d1   
else if((c == 0)&&(d == 0)&&(Key6Circs == 4)){Key6Circs = 0; FlagUp = 1;Key5Circs = 0;key5del = 100;} //c0,d0 按键有效

第二种网上的程序:
void ReadSwith(void)
{
static u8 Aold;   //定义了变量用来储蓄上一次调用此方法是编码开关两引脚的电平
if(KeyA()==0&&Aold==1)      //如果当前编码开关的两个引脚都为底电平执行下面的步骤
{
          if(KeyB())      //为高说明编码开关在向加大的方向转
        {
             FlagUp=1; FlagDown=0;
       }
        else
        {
             FlagUp=0; FlagDown=1;
       }                                                                                        
   }
Aold = KeyA() ;
}

u8 ReadSwith()//
{
static u8 Aold,Bold; //定义了两个变量用来储蓄上一次调用此方法是编码开关两引脚的电平
static u8 st;       //定义了一个变量用来储蓄以前是否出现了两个引脚都为高电平的状态
u8 tmp = 0;
if(KeyA() &&KeyB() )
       st = 1;    //      
if(st)             //如果st为1执行下面的步骤
{
       if(KeyA()==0&&KeyB()==0)    //如果当前编码开关的两个引脚都为底电平执行下面的步骤
       {
         if(Bold)    //为高说明编码开关在向加大的方向转
         {
         st = 0;   
         tmp++;    //
         }
         
         if(Aold)    //为高说明编码开关在向减小的方向转
         {
         st = 0;
         tmp--;    //设返回值
         }
       }
}
Aold = KeyA();
Bold = KeyB();
return tmp;
}

以上三种程序我都测试,都是旋转2格才有输出,大家来看看是什么问题,是不是编码器不对啊?

shnd 发表于 2010-10-19 22:16:17

我也对编码器程序很感兴趣!

abandon 发表于 2016-1-19 11:33:10

有得编码器就是两格才输出一个的,可以用示波器看下.

rowen800 发表于 2016-5-24 14:48:15


请教下各位大牛,如何判断编码器的正反转呢?正转,计数器增加,增加到最大值时,又从0开始。反转减小,

wangrb 发表于 2016-5-24 23:21:40

接在tim1-5或tim8上直接有正交解码

rowen800 发表于 2016-5-25 18:32:39

wangrb 发表于 2016-5-24 23:21
接在tim1-5或tim8上直接有正交解码

是的,我也是这么接的,只是定时器我们可利用的就是定时器计数器吧,如何通过定时器的变化得知方向呢?编码器是增量型的,转到最大值输出又从0开始

rootxie 发表于 2017-3-29 16:51:10

这个程序有问题 会误读,我使用的是2元不到的EC11,今天总算完美解决

yunhuisong 发表于 2017-3-29 18:45:01

我是使用两个中断脚做的,效果很好,不管你转多快都精准无误

duan2822 发表于 2017-5-3 10:02:28

转动时,不停中断,开销好大

john78 发表于 2017-5-3 20:11:57

编码器用中断做的很多,一圈,也几十次怕啥

FESENS 发表于 2017-5-4 15:34:20

编码器要用好也是比较讲究的

stm32_xiaocai 发表于 2017-5-8 17:45:38

duan2822 发表于 2017-5-3 10:02
转动时,不停中断,开销好大

应该不会快过1ms吧

pz91 发表于 2023-7-26 22:11:23

yunhuisong 发表于 2017-3-29 18:45
我是使用两个中断脚做的,效果很好,不管你转多快都精准无误
(引用自8楼)

能分享一下程序么?

ibmx311 发表于 2023-7-26 23:26:27

每当我看到别人不会玩编码器,就会抑制不住的幸灾乐祸
页: [1]
查看完整版本: EC11编码器解码问题!!!!