| 首页 | 调频技术 | 电子技术 | 酷站产品 | 资源下载 | OEM/ODM定产 | 酷站留言 | 联系方式 | 酷站论坛 | 网站简介
  首页-电子技术-电子基础与入门-旋转编码开关(Rotary Encoder switch) 发表文章 返回上页

旋转编码开关(Rotary Encoder switch)

作者:  发布:2010-5-25 人气:2762

这种旋转编码开关(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;
}

 

用户名:
密 码:




,欢迎你回来!

修改资料  退出

申请成为高级会员






硬盘mp3电路原理图..(33611)
集成电路型号功能对照表(32014)
lm358双运算放大..(13395)
常用晶体管3极管资料..(11461)
常用发射三级管资料(10998)
dc/ac逆变器的制..(10829)
用lm3886制作5..(10329)
常用功率场效应管参数(9732)
单片开关电源原理及应用(9226)
实用的可调三端稳压模块(8995)
开关电源的分类及应用(8364)
便携式mp3播放器的..(7689)
酷站首页 - 购买方法 - 酷站留言 - 申请会员 - 酷站论坛 - 站长简介 - 联系我们
调频酷站(C) 2003-2005 版权所有 www.fmku.com All Rights Reserved
电子信箱 yj3886@163.com 电话:13882021417 028-8988 8900 qq:175411283 四川 成都
备案号:蜀ICP备08006042 Powerd By Iceflame Studio Design By Slim