历史上的今天
今天是:2024年12月31日(星期二)
2019年12月31日 | AVR单片机教程——旋转编码器
2019-12-31 来源:eefocus
旋转编码器好像不是单片机玩家很常用的器件,但是我们的开发板上有,原因如下:
旋转编码器挺好用的。电位器能旋转的角度有限,旋转编码器可以无限圈旋转;旋转时不连续,有卡点,适合对应离散数据。
开发板上选用的旋转编码器,使用起来简单、方便。
本来旁边的电位器(旋钮,以后会讲)一枝独秀,挺孤单的,我就配一个高度大致相同的旋转编码器陪伴它。
今天我想写旋转编码器,于是在网络上搜索了一下,相关资料很少。最基本地,旋转编码器的作用是将角位移、角速度等机械量转换为电信号。本文不求成为旋转编码器的百科全书,但会把 触点电刷式 增量式 旋转编码器的原理讲清楚。这里出现了两个定语,是对类别的限定;关于旋转编码器的分类,请自行百度。
开发板上的旋转编码器是从淘宝买的,淘宝商家提供了资料,这是本讲的主题。为避免广告嫌疑,我不能放链接上来,所以我就把它转换成图片放在文章里(请在新页面中查看):






我们从旋转编码器的原理开始。旋转编码器的内部是触点与电刷,可以看作按键:当两者接触时,开关闭合;反之断开。实际上它们的本质是一样的。在旋转时,按键会周期性地闭合、断开;如果一端接地,另一端接上拉电阻,就会有周期性高、低电平的脉冲信号产生。我们使用的旋转编码器每转过一圈会输出24个脉冲。
通过对脉冲进行计数,可以知道编码器转过的角度。如果不管方向,测量角度或角加速度等,用一个输出就够了。但是如果考虑方向,无论是顺时针还是逆时针转动,电平都是“高低高低高……”。为了获得方向的信息,需要使用两个输出,它们的相位相差90°,如图所示:

A和B是两个输出端,C端接地。当程序检测到A端由高电平变为低电平时(方法在按键那里讲过了),如果检测到B端是高电平(这就更简单了),那就是顺时针旋转;如果是低电平,那就是逆时针旋转。实际上不一定要检测A端的下降沿,只要按照这张图来,怎么都对。
库函数使用的检测方法是:A、B端由低低变为高低时,判为顺时针转过一格;由低低变为低高时,判为逆时针转过一格。这不是最好的方法(你可以想一下怎样改进,但是不要低估它的难度),但从实际使用上来看,只要用户不故意在两个卡点之间扭来扭去,这种方法是可以胜任的。
我们写一个用旋转编码器控制数码管显示数字的程序,也可以理解为对旋转编码器进行计数并用数码管显示。旋转编码器A和B端分别连接端口4和5,数码管连接6和7。程序的思路是:每隔一毫秒调用rotary_rotated(它和button_pressed函数类似——如果你还记得的话)检测编码器是否被转动以及转动的方向,并根据方向对计数器变量num进行增减。(为什么让num为uint8_t类型?)为了凸显旋转编码器的主题,数码管就用segment_auto来解决了。
#include #include #include int main() { rotary_init(PIN_4, PIN_5); segment_init(PIN_6, PIN_7); segment_auto(); uint8_t num = 0; while (1) { switch (rotary_rotated()) { case ROTARY_CW: ++num; break; case ROTARY_ACW: --num; break; default: break; } segment_hex(num); delay(1); } } 注意相邻卡点之间挤了4个AB端口的状态,因此延时不能过长。你可以试试更长的间隔。
史海拾趣
|
Intevac是商用和军用市场光学产品的前沿开发商。本文介绍该公司NightVista嵌入式电子系统的开发,该产品是高性能超低亮度紧凑型摄像机。该摄像机最初采用了流行的数字信号处理器、几个ASSP和外部存储器件。系统对性能的需求越来越高,工程师团队决 ...… 查看全部问答> |
|
昨天,记者从“2006上海国际数字家庭高峰论坛”上获悉,上海电信正在5000户ADSL用户中试点数字家庭业务,这些用户可以享受到包括IPTV、网络远程监控、电话POS机、远程医疗以及家电的远程控制,这也是国内运营商在该领域的首次尝试。 与会 ...… 查看全部问答> |
|
P89C51RB2/RC2/RD2具有16K32K64K并行可编程的非易失性FLASH程序存贮器,并可实现对器件串行在 系统编程和在应用中编程,在系统的编程:当MUC安装在 用户板上时,应许用华下载新的 代码,在应用中编程:MUC可以在系统中获取新代码并对自己重新编程。 ...… 查看全部问答> |
|
突然脑子里想到家里暖水瓶,上午烧得水下午就不热了,由此,希望设计师在设计电热产品时,为节能作出点贡献,比如,电饭煲的外壳使用四层结构来延长保温时间,或者增加闷饭档来节电,设计其他电器产品用小的支出来换取功能的增加也是不错的,比如饮 ...… 查看全部问答> |
|
怎么编写并口驱动,如果建立在parport.sys之上,是用过滤驱动还是自定义类驱动,或者ports类驱动 怎么编写并口驱动,如果建立在parport.sys之上,是用过滤驱动还是自定义类驱动,或者ports类驱动。 如果自己写并口驱动,系统自带的怎么完全卸载而不影响COM口? 如果是建立在parport.sys之上的自定义类驱动,inf文件中还需要LogConfig项吗? ...… 查看全部问答> |
|
哪个大虾帮忙解决一下? java.lang.IllegalArgumentException的问题 我编译时一直出现下面得错误: #java.lang.IllegalArgumentException # at com.mathworks.util.NativeJava.hWndFromComponent(NativeJava.java:183) # at sun.awt.windows.WToolkit.even ...… 查看全部问答> |
|
当程序在运行时,如何不让手机待机(当手机已设置10分钟待机),这三个方法哪个能现实? 当程序在运行时,如何不让手机待机(当手机已设置10分钟待机),这三个方法哪个能现实? 如果能实现的话请给一个实例... SetSystemPowerState SetDevicePower SetPowerRequirement… 查看全部问答> |




