原创 旋转编码开关(Rotary Encoder switch)

2008-4-6 09:38 10055 4 8 分类: EDA/ IP/ 设计与制造

这种旋转编码开关(Rotary Encoder switch),一个使用3脚的,后面一个使用5脚的,大家可能对这种玩意都不是很了解,但涉及到有调整的地方,这个玩意使用真是很爽,我弄了2个,研究了一下,供大家参考~


5脚的ALPS:
点击看大图


具有左转,右转,按下三个功能。4、5脚是中间按下去的开关接线   1 2 3脚 一般是中间2脚接地,1、3脚上拉电阻后,当左转、右转旋纽时,在1、3脚就有脉冲信号输出了。
着这是标准资料:
点击看大图


在单片机编程时,左转和右转的判别是难点,用示波器观察这种开关左转和右转时两个输出脚的信号有个相位差,见下图:


由此可见,如果输出1为高电平时,输出2出现一个高电平,这时开关就是向顺时针旋转; 当输出1 为高电平,输出2出现一个低电平,这时就一定是逆时针方向旋转.

所以,在单片机编程时只需要判断当输出1为高电平时,输出2当时的状态就可以判断出是左旋转或是右旋转了。

还有另外一种3脚的,除了不带按钮开关外,和上面是一样的使用。
点击看大图

参考:
#include "reg51.h"
#define uint unsigned int

sbit CodingsWitch_A=P1_1;
sbit CodingsWitch_B=P1_2;

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

点击看大图
//编码器计数程序
void encoder_cnt(void)
{
        uchar temp;
        temp = PIND; //取端口D管脚信号
        couch_clr = (temp & 0x08); //取编码器清零信号
        if(couch_clr != false) //有编码器清零信号
        {
                couch_num = 0; //水平床码清零
        }
        else
        {
                if(encoder_cnt_en == false) //编码器计数模块没有启动
                {
                        pr_couch_ba = temp & 0x03; //取编码器A、B相电平信号
                }
                else
                {
                        couch_ba = temp & 0x03; //取编码器A、B相电平信号
                        if(pr_couch_ba == 0x00)
                        {
                                if(couch_ba == 0x01)
                                {
                                        couch_num++; //水平床码加1
                                }
                                else if(couch_ba == 0x10)
                                {
                                        couch_num--; //水平床码减1
                                }
                        }
                        else if(pr_couch_ba == 0x01)
                        {
                                if(couch_ba == 0x11)
                                {
                                        couch_num++; //水平床码加1
                                }
                                else if(couch_ba == 0x00)
                                {
                                        couch_num--; //水平床码减1
                                }
                        }
                        else if(pr_couch_ba == 0x10)
                        {
                                if(couch_ba == 0x00)
                                {
                                        couch_num++; //水平床码加1
                                }
                                else if(couch_ba == 0x11)
                                {
                                        couch_num--; //水平床码减1
                                }
                        }
                        else if(pr_couch_ba == 0x11)
                        {
                                if(couch_ba == 0x10)
                                {
                                        couch_num++; //水平床码加1
                                }
                                else if(couch_ba == 0x01)
                                {
                                        couch_num--; //水平床码减1
                                }
                        }
                }
                pr_couch_ba = couch_ba;
        }
}


编码器及其计数模块原理
只允许会员下载 该文件只允许会员下载! 登录 | 注册

飘扬的旋转编码器的检测程序(MCS51)
//旋转编码器检测程序,A/B信号分别接在了INT0和INT1上
//程序作者:BG4UVR
//2005年1月15用KEIL编译、硬件测试通过

//注意:编码器的信号,程序未做消抖处理。测试中,A/B信号上各
//接了一只104的瓷片电容,工作很正常。如果不接电容,请自行编
//写信号消抖程序。

#include <at89x51.h>

sbit led="0xB1";//有一只LED接在了RXD引脚上,用来指示正反转;

main()
{
EA=1; //总中断允许
EX0=1; //外部中断0允许
IT0=1; //外部中断0为边沿触发方式
while(1);;
}


/*********************
编码器中断函数
入口:无
出口:无
*********************/
void encoder(void) interrupt 0 { //外部中断0
if (INT1){
led=1;
}else{
led=0;
}
}


whimsy 的AVR程序

//外部中断0,用于编码开关解码,解码图:   A接中断脚(AVR的PD2),以此为基准,B用来判断方向(连到AVR的PA1), C接地
//A -|
//   |   -----|__________|----------|____________
//C -|
//
//B -|
//   |   ----------|__________|----------|____________
//C -|  
//             CW  ===>>> ROTATION
//外部中断设置(ISC01=0,ISC00=1): INT0 引脚上任意的逻辑电平变化都将引发中断
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
//external interupt on INT0
    GICR=0;    //禁止外部中断
    if ((PIND & 0x04)==0)           //先判断是高电平产生的中断还是低点平的中断
                if ((PINA & 0x02)==0)         //再判断B线上的电平
                    {
                    keycounter--;      
                     keydirection="0";
                    }  
                else
                    {
                     keycounter++;
                     keydirection="1";
                    }          
                
        else
             if ((PINA & 0x02)==0)
            {
             keycounter++;  
             keydirection="1";
            }  
          else
           {
            keycounter--;
            keydirection=0;
           }
        GICR=0x40;
}


PARTNER CONTENT

文章评论4条评论)

登录后参与讨论

用户377235 2012-3-23 09:41

乱糟糟的,看得头晕

用户118596 2011-1-27 11:24

有没有哪位高手用MCS51系列单片机采用编码器进行菜单控制的成功案例。(我做这件事没有完全成功可以控制但可靠性不高)想找找原因。

nneverli_217963090 2009-11-4 13:26

顶你

用户1403487 2009-8-18 09:39

谢谢!这对我太有用了
相关推荐阅读
用户581254 2009-05-01 12:50
usb
http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=962394...
用户581254 2008-09-17 03:20
关于DDS
DDS是一种全数字化的频率合成器,由相位累加器、波形ROM、D/A转换器和低通滤波器构成。时钟频率给定后,输出信号的频率取决于频率控制字,频率分辨率取决于累加器位数,相位分辨率取决于ROM的地址线位数...
用户581254 2008-09-17 03:18
AD转换器的主要技术指标
1:参考电压需要足够精确,推荐使用外部高精准参考电压。2:如果PGA可调,增益系数一般是越小噪声越低。3:一般最好用到满量程,此时AD精度不浪费。4:如果有偏置,需要进行自校。5:请注意在使用DEMO...
用户581254 2008-09-17 03:16
频率合成技术(DDS)
(j) (j=1,2,…,m) 为频率合成器的输出频率。aij (i=1,2,…,n; j="1",2,…,m)为有理数。  (7.1.1)式包括了频率合成器的所有结构形式。当n=1时,频率合成器只有...
用户581254 2008-09-17 03:07
数字地与模拟地
★数字地与模拟地的区别     简单来说,数字地是数字信号的对地,模拟地是模拟信号的对地。 由于数字信号一般为矩形波,带有大量的谐波。如果电路板中的 数字地与模拟地没有从接入点分开,数字信号中的谐波很...
EE直播间
更多
我要评论
4
4
关闭 站长推荐上一条 /3 下一条