7161|0

662

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

【Nucleo心得】+ (EX06) 旋转编码器使用 [复制链接]

本帖最后由 slotg 于 2014-10-19 09:37 编辑

本次实验编写了一个旋转编码器的驱动,顺时钟旋转时计数器增加,逆时钟旋转时计数器减少,压下中间开关时计数器清除。

旋转编码器的接脚与输出波形:



旋转编码器是输出2个相位差90度的波形,由于旋转编码器内部也是机械式的接点,因此输出的波形不可能如上图那样的完美,波形会存在开关抖动 bounce 的情况,如下图所示:



因此我们必须做 debounce 的处理,在这里我们使用的方法是在程序中使用了时钟中断,将旋转编码器信号的处理放在中断函数,时钟每2ms中断一次,也就是每2ms判断一次旋转编码器的状态,这样的处理方法可以有效的排除开关抖动的影响。

  1. // timer interrupt , 2ms
  2. void ProcTmr()
  3. {
  4.     static bool fg_PHA = 0;
  5.     static bool fg_PHB = 0;

  6.     if(PHA) {
  7.         if(PHB) {
  8.             fg_PHA = 0;
  9.             fg_PHB = 0;
  10.         }
  11.     } else {
  12.         if(!fg_PHA) {
  13.             fg_PHA = 1;
  14.             if(fg_PHB) {
  15.                 fg_CW = 1;
  16.             }
  17.         }
  18.     }

  19.     if(PHB) {
  20.         if(PHA) {
  21.             fg_PHA = 0;
  22.             fg_PHB = 0;
  23.         }
  24.     } else {
  25.         if(!fg_PHB) {
  26.             fg_PHB = 1;
  27.             if(fg_PHA) {
  28.                 fg_CCW = 1;
  29.             }
  30.         }
  31.     }
  32. }
复制代码

程序中宣告了全局变量 fg_CW 与 fg_CCW ,分别表示正转或是反转动作,主回路中依这2个变量处理计数器的增加或是减少。

  1.     while(1) {

  2.         if(fg_CW) {
  3.             fg_CW = 0;
  4.             if(++cnt > 99) {
  5.                 cnt = 0;
  6.             }

  7.             DsData(cnt);
  8.         }

  9.         if(fg_CCW) {
  10.             fg_CCW = 0;
  11.             if(cnt == 0) {
  12.                 cnt = 100;
  13.             }
  14.             cnt--;

  15.             DsData(cnt);
  16.         }


  17.         if(!SW) {
  18.             cnt = 0;
  19.             DsData(cnt);
  20.         }
  21.     }
复制代码


工程文件:
Nucleo_EX06_full.zip (1.72 KB, 下载次数: 144)

Nucleo_EX06_full.zip (1.72 KB, 下载次数: 144)

视频如下:
http://v.youku.com/v_show/id_XODA2MzIzMjUy.html




【Nucleo心得】+ 8x8点阵驱动 (EX01)
https://bbs.eeworld.com.cn/thread-448651-1-1.html

【Nucleo心得】+ 8x8点阵驱动 (EX02)
https://bbs.eeworld.com.cn/thread-448710-1-1.html

【Nucleo心得】+ 8x8点阵驱动 (EX03)
https://bbs.eeworld.com.cn/thread-448769-1-1.html

【Nucleo心得】+ 8x8点阵驱动 (EX04)
https://bbs.eeworld.com.cn/thread-448879-1-1.html

【Nucleo心得】+ 8x8点阵驱动 (EX05)
https://bbs.eeworld.com.cn/thread-448906-1-1.html


此帖出自stm32/stm8论坛

赞赏

1

查看全部赞赏

点赞 关注(1)
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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