16529|15

348

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

【吴鉴鹰实战技术分享】如何使用数字旋转编码开关 [复制链接]

 
本帖最后由 吴鉴鹰. 于 2015-5-24 21:11 编辑

数字旋转编码器在现在的工控领域运用广泛,跑步机的旋钮,控制器的旋钮,音响的音量控制旋钮,都是数字旋转编码器的典型应用。

      看一个数字旋转编码器的视频,加深一下理解。


5脚的数字旋转编码器:


图 1 旋转编码器的实物图


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

图2 旋转编码器的结构图


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


图3 旋转编码器在旋转的时候的输出波形



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

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

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

图4 三个脚的旋转编码器

  1. 参考程序:
  2. #include "reg51.h"
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit Rotation_Key_A = P1_1; //定义旋转编码器的方向判断A口
  6. sbit Rotation_Key_B = P1_2; //定义旋转编码器的方向判断B口

  7. uint CodingsWitchPolling()//
  8. {
  9.    static uchar A_Last_State,B_Last_State; //定义了两个变量用来储蓄上一次调用此方法是编码开关两引脚的电平
  10.    static uchar High_Last_State;//定义了一个变量用来储蓄以前是否出现了两个引脚都为高电平的状态
  11.    uint tmp = 0;
  12.    if(Rotation_Key_A&&Rotation_Key_B)
  13.    High_Last_State = 1;  //
  14.    if(High_Last_State) //如果High_Last_State为1执行下面的步骤
  15.    {
  16.       if(Rotation_Key_A==0&&Rotation_Key_B==0)      //如果当前编码开关的两个引脚都为底电平执行下面的步骤
  17.       {
  18.          if(B_Last_State)      //为高说明编码开关在向加大的方向转
  19.          {
  20.             High_Last_State = 0;      
  21.             tmp++;      //
  22.          }
  23.          if(A_Last_State)      //为高说明编码开关在向减小的方向转
  24.          {
  25.             High_Last_State = 0;
  26.             tmp--;      //设返回值
  27.          }
  28.       }
  29.    }
  30.    A_Last_State = Rotation_Key_A; //储存A口的当前状态
  31.    B_Last_State = Rotation_Key_B; //储存B口的当前状态
  32.    return tmp;            //
  33. }


  34. //编码器计数程序
  35. void encoder_cnt(void)
  36. {
  37.         uchar Reade_Io_Data;
  38.         Reade_Io_Data = PIND; //取端口D管脚信号
  39.         Reade_Clr_Signal = (Reade_Io_Data & 0x08); //读取编码器清零信号
  40.         if(Reade_Clr_Signal != false) //有编码器清零信号
  41.         {
  42.                 couch_num = 0; //水平床码清零
  43.         }
  44.         else
  45.         {
  46.                 if(encoder_cnt_en == false) //编码器计数模块没有启动
  47.                 {
  48.                         pr_couch_ba = Reade_Io_Data & 0x03; //取编码器A、B相电平信号
  49.                 }
  50.                 else
  51.                 {
  52.                         couch_ba = Reade_Io_Data & 0x03; //取编码器A、B相电平信号
  53.                         if(pr_couch_ba == 0x00)
  54.                         {
  55.                                 if(couch_ba == 0x01)
  56.                                 {
  57.                                         couch_num++; //水平床码加1
  58.                                 }
  59.                                 else if(couch_ba == 0x10)
  60.                                 {
  61.                                         couch_num--; //水平床码减1
  62.                                 }
  63.                         }
  64.                         else if(pr_couch_ba == 0x01)
  65.                         {
  66.                                 if(couch_ba == 0x11)
  67.                                 {
  68.                                         couch_num++; //水平床码加1
  69.                                 }
  70.                                 else if(couch_ba == 0x00)
  71.                                 {
  72.                                         couch_num--; //水平床码减1
  73.                                 }
  74.                         }
  75.                         else if(pr_couch_ba == 0x10)
  76.                         {
  77.                                 if(couch_ba == 0x00)
  78.                                 {
  79.                                         couch_num++; //水平床码加1
  80.                                 }
  81.                                 else if(couch_ba == 0x11)
  82.                                 {
  83.                                         couch_num--; //水平床码减1
  84.                                 }
  85.                         }
  86.                         else if(pr_couch_ba == 0x11)
  87.                         {
  88.                                 if(couch_ba == 0x10)
  89.                                 {
  90.                                         couch_num++; //水平床码加1
  91.                                 }
  92.                                 else if(couch_ba == 0x01)
  93.                                 {
  94.                                         couch_num--; //水平床码减1
  95.                                 }
  96.                         }
  97.                 }
  98.                 pr_couch_ba = couch_ba;
  99.         }
  100. }


  101. 编码器及其计数模块原理

  102. 旋转编码器的检测程序(基于51单片机)
  103. //旋转编码器检测程序,A/B信号分别接在了INT0和INT1上
  104. //2005年3月27用KEIL编译、硬件测试通过

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

  108. #include <at89x51.h>

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

  110. main()
  111. {
  112.         EA=1; //总中断允许
  113.         EX0=1; //外部中断0允许
  114.         IT0=1; //外部中断0为边沿触发方式
  115.         while(1);;
  116. }


  117. /*********************
  118. 编码器中断函数
  119. 入口:无
  120. 出口:无
  121. *********************/
  122. void encoder(void) interrupt 0
  123. { //外部中断0
  124.         if (INT1)
  125.         {
  126.                 led=1;
  127.         }
  128.         else
  129.         {
  130.                 led=0;
  131.         }
  132. }


  133. whimsy 的AVR程序

  134. //外部中断0,用于编码开关解码,解码图:   A接中断脚(AVR的PD2),以此为基准,B用来判断方向(连到AVR的PA1), C接地
  135. //A -|
  136. //   |   -----|__________|----------|____________
  137. //C -|
  138. //
  139. //B -|
  140. //   |   ----------|__________|----------|____________
  141. //C -|  
  142. //             CW  ===>>> ROTATION
  143. //外部中断设置(ISC01=0,ISC00=1): INT0 引脚上任意的逻辑电平变化都将引发中断
  144. #pragma interrupt_handler int0_isr:2
  145. void int0_isr(void)
  146. {
  147.         //external interupt on INT0
  148.     GICR=0;    //禁止外部中断
  149.     if ((PIND & 0x04)==0)           //先判断是高电平产生的中断还是低点平的中断
  150.         {
  151.                 if ((PINA & 0x02)==0)         //再判断B线上的电平
  152.                 {
  153.                         keycounter--;      
  154.                         keydirection=0;
  155.                 }  
  156.                 else
  157.                 {
  158.                         keycounter++;
  159.                         keydirection=1;
  160.                 }         
  161.         else
  162.                 if ((PINA & 0x02)==0)
  163.                 {
  164.                         keycounter++;  
  165.                         keydirection=1;
  166.                 }  
  167.             else
  168.             {
  169.                         keycounter--;
  170.                         keydirection=0;
  171.             }
  172.                         GICR=0x40;
  173.         }
  174. }
复制代码


此帖出自单片机论坛

最新回复

这个很实用的。  详情 回复 发表于 2016-2-20 18:41

赞赏

2

查看全部赞赏

点赞 关注(3)
个人签名为了方便大家交流,建了两个QQ群:QQ群3号:198387118  【1000人群】QQ群5号: 239316959【2000人群】群内已有成员3000余人!
更多内容关注微信公众号:单片机精讲吴鉴鹰
 

回复
举报

31

帖子

0

TA的资源

一粒金砂(中级)

推荐
 
好东西,正式我需要的,谢谢啊
此帖出自单片机论坛

点评

貌似开心的很  详情 回复 发表于 2015-4-2 15:16
原来高富帅就长这样啊。  详情 回复 发表于 2015-3-30 19:24
 
 

回复

348

帖子

0

TA的资源

纯净的硅(初级)

板凳
 
我是糕肤摔 发表于 2015-3-30 18:19
好东西,正式我需要的,谢谢啊

原来高富帅就长这样啊。
此帖出自单片机论坛
 
个人签名为了方便大家交流,建了两个QQ群:QQ群3号:198387118  【1000人群】QQ群5号: 239316959【2000人群】群内已有成员3000余人!
更多内容关注微信公众号:单片机精讲吴鉴鹰
 
 

回复

348

帖子

0

TA的资源

纯净的硅(初级)

4
 
我是糕肤摔 发表于 2015-3-30 18:19
好东西,正式我需要的,谢谢啊

貌似开心的很
此帖出自单片机论坛
 
个人签名为了方便大家交流,建了两个QQ群:QQ群3号:198387118  【1000人群】QQ群5号: 239316959【2000人群】群内已有成员3000余人!
更多内容关注微信公众号:单片机精讲吴鉴鹰
 
 

回复

138

帖子

0

TA的资源

一粒金砂(中级)

5
 
学习一下 .mbed系统好像有这个库.
此帖出自单片机论坛
 
个人签名 与时间赛跑
 
 

回复

108

帖子

0

TA的资源

一粒金砂(中级)

6
 
好东西一定要收藏的。以前见公司里人们用,叫飞梭旋钮。感觉很是高大上,我也要学会这个东西。
此帖出自单片机论坛

点评

这个现在的产品上用的很多  详情 回复 发表于 2015-4-7 13:19
 
 
 

回复

348

帖子

0

TA的资源

纯净的硅(初级)

7
 
曹世鹏 发表于 2015-4-7 12:19
好东西一定要收藏的。以前见公司里人们用,叫飞梭旋钮。感觉很是高大上,我也要学会这个东西。

这个现在的产品上用的很多
此帖出自单片机论坛
 
个人签名为了方便大家交流,建了两个QQ群:QQ群3号:198387118  【1000人群】QQ群5号: 239316959【2000人群】群内已有成员3000余人!
更多内容关注微信公众号:单片机精讲吴鉴鹰
 
 

回复

144

帖子

3

TA的资源

一粒金砂(中级)

8
 
此帖出自单片机论坛
 
个人签名        
 
 

回复

348

帖子

0

TA的资源

纯净的硅(初级)

9
 
此帖出自单片机论坛
 
个人签名为了方便大家交流,建了两个QQ群:QQ群3号:198387118  【1000人群】QQ群5号: 239316959【2000人群】群内已有成员3000余人!
更多内容关注微信公众号:单片机精讲吴鉴鹰
 
 

回复

10

帖子

0

TA的资源

一粒金砂(初级)

10
 
此帖出自单片机论坛

点评

笑一笑,十年少  详情 回复 发表于 2015-4-12 22:02
 
 
 

回复

348

帖子

0

TA的资源

纯净的硅(初级)

11
 

笑一笑,十年少
此帖出自单片机论坛
 
个人签名为了方便大家交流,建了两个QQ群:QQ群3号:198387118  【1000人群】QQ群5号: 239316959【2000人群】群内已有成员3000余人!
更多内容关注微信公众号:单片机精讲吴鉴鹰
 
 

回复

574

帖子

11

TA的资源

一粒金砂(高级)

12
 
感谢分享在stm32上边调试一下,看一下效果。。。
此帖出自单片机论坛
 
 
 

回复

574

帖子

11

TA的资源

一粒金砂(高级)

13
 
谢谢您,已经搞定
此帖出自单片机论坛
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(初级)

14
 
好!谢谢分享!
此帖出自单片机论坛
 
 
 

回复

31

帖子

0

TA的资源

一粒金砂(中级)

15
 
这个很实用的。
此帖出自单片机论坛

点评

在工控领域运用很广泛的。  详情 回复 发表于 2016-2-23 10:16
 
 
 

回复

348

帖子

0

TA的资源

纯净的硅(初级)

16
 

在工控领域运用很广泛的。
此帖出自单片机论坛
 
个人签名为了方便大家交流,建了两个QQ群:QQ群3号:198387118  【1000人群】QQ群5号: 239316959【2000人群】群内已有成员3000余人!
更多内容关注微信公众号:单片机精讲吴鉴鹰
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表