加入收藏 | 发展历程 | 在线留言 | 在线招聘     您好,欢迎来到广东升威电子制品有限公司官网!
中文 英文
全国咨询热线:182-1927-6011

33年模组、传感器、编码器、电位器、开关定制厂家

电位器国家标准制定单位 | 编码器行业标准制定单位
您所在位置: 首页 > 升威动态 > 升威动态
升威动态

Granville dynamic

广东升威电子制品有限公司

电 话:0769-38833333
传 真:0769-87930111
    0769-87930222
E-mail:sw@soundwell-cn.com
地 址:广东省东莞市塘厦镇凤凰岗升威工业园

推荐产品

旋转编码开关的应用原理

文章出处:www.soundwell-cn.com  编辑:升威电子  发表时间:2016-10-18

       旋转编码开关的应用非常广泛,今天给大家介绍下如下这款3脚和5脚的EC11旋转编码开关。

5脚的旋转编码开关,如下图

EC11旋转编码开关

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

推荐型号:EC11旋转编码开关

 

EC11旋转编码开关


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

 

EC11旋转编码开关信号


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

 

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


#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;
}

 

升威电子风采相册

  • 升威团队风采
 

升威员工心声:

在别人看来,升威是一个企业,在我们看来,升威是一个家,升威电子的每个员工都有一份积极向上的心,对生活和工作充满着激情,感谢升威给自己这个发展平台,未来希望大家同心协力,共同进步。 >>点此进入相册

升威自动化事业部
升威自动化事业部
作为业界的专业企业,广东升威电子制品有限公司于2006年花巨资成立自动化事业部,开始为母公司提供全自动精密部件组装设备、测试设备... [查看详情]
  • 返回顶部
  • 0769-38833333-881
  • 18219276011
  • 李小姐
  • sw@soundwell-cn.com
  • 微信二维码
升威首页 | 电位器 | 编码器 | 旋转开关 | 升威产品 | 走进升威 | 荣誉资质 | 实地参观 | 标准制定 | 联系升威 |
郑重声明:未经授权禁止转载、摘编,如有违反,追究法律责任