AVR单片机教程——旋转编码器

2019-12-31来源: eefocus关键字:AVR  单片机教程  旋转编码器

旋转编码器好像不是单片机玩家很常用的器件,但是我们的开发板上有,原因如下:


旋转编码器挺好用的。电位器能旋转的角度有限,旋转编码器可以无限圈旋转;旋转时不连续,有卡点,适合对应离散数据。


开发板上选用的旋转编码器,使用起来简单、方便。


本来旁边的电位器(旋钮,以后会讲)一枝独秀,挺孤单的,我就配一个高度大致相同的旋转编码器陪伴它。


今天我想写旋转编码器,于是在网络上搜索了一下,相关资料很少。最基本地,旋转编码器的作用是将角位移、角速度等机械量转换为电信号。本文不求成为旋转编码器的百科全书,但会把 触点电刷式 增量式 旋转编码器的原理讲清楚。这里出现了两个定语,是对类别的限定;关于旋转编码器的分类,请自行百度。


开发板上的旋转编码器是从淘宝买的,淘宝商家提供了资料,这是本讲的主题。为避免广告嫌疑,我不能放链接上来,所以我就把它转换成图片放在文章里(请在新页面中查看):

我们从旋转编码器的原理开始。旋转编码器的内部是触点与电刷,可以看作按键:当两者接触时,开关闭合;反之断开。实际上它们的本质是一样的。在旋转时,按键会周期性地闭合、断开;如果一端接地,另一端接上拉电阻,就会有周期性高、低电平的脉冲信号产生。我们使用的旋转编码器每转过一圈会输出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端口的状态,因此延时不能过长。你可以试试更长的间隔。


关键字:AVR  单片机教程  旋转编码器 编辑:什么鱼 引用地址:http://news.nvwayi.com/mcu/ic484241.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:AVR单片机教程——串口发送
下一篇:LCD1602液晶显示模块的单片机驱动深入详解之软件篇(AVR)

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

AVR第11课:如何对待我们的单片机
大家学习MCS51单片机和AVR单片机,又或者是PIC单片机,又或者是MSP430单片机之后,是否感觉自己可以成为一名工程师了呢?我在这里来说说我的看法吧。我们学习这些单片机的时候,先学习了理论知识,这个一般是书本上的理论知识,比如介绍单片机的发展、单片机的应用领域、单片机的原理等等。然后呢找一块开发板,对着视频教程学习,边看视屏边做实验,学习完之后呢,去做那么一两个小项目,比如“基于LabView和PWM的霍尔测速和控速的直流电机系统”,这个项目呢,相对来说综合要求能力比较高,如果一个人能够坐下来的话,你的能力就算不错了,相当不错了。从设计电路图、焊接电路板、写程序、调试等等下来,会有很大的提高。如果仅仅做了实验,我可以告诉
发表于 2020-07-25
解决“检测到 #include 错误
配置好VSCode的Arduino环境后可能会在编写代码时出现以下错误检测到 #include 错误。请更新 includePath。已为此翻译单元(E:abc.ino)禁用波形曲线。C/C++(1696)无法打开 源 文件 "avr/pgmspace.h" (dependency of "C:Program Files (x86)ArduinohardwarearduinoavrcoresarduinoArduino.h")C/C++(1696)这个问题是由于VSCode找不到对应的文件导致的,解决方法是,进入项目文件夹中的.vscode文件夹(用VSCode打开项目文件夹会自动新建
发表于 2020-07-25
解决“检测到 #include 错误
AVR446_Linear speed control of stepper motor步进电机曲线分析
           1.1.  单片机代码处理// 定义定时器预分频,定时器实际时钟频率为:72MHz/(STEPMOTOR_TIMx_PRESCALER+1)#define STEPMOTOR_TIM_PRESCALER          3  // 步进电机驱动器细分设置为:   32  细// 定义定时器周期,输出比较模式周期设置为0xFFFF#define STEPMOTOR_
发表于 2020-07-25
<font color='red'>AVR</font>446_Linear speed control of stepper motor步进电机曲线分析
LCD1602液晶显示模块深入详解之软件篇(AVR)
On/Off Control):其实就是c.1(打开显示)(4)进入模式设置(Entry Mode set):其实就是d(5)前面就是初始化,后面就是写显示数据了///////////////////////////////////////////////////////////////////////////////////////////////////////////////////下面是Atmega AVR驱动LCD1602液晶显示模块代码,第一行显示“LCD1602 DEMO”,第二行显示“--CNBLOGS--”,这里没有读状态指令的使用,实际使用时,在写指令或数据时加一些延时即可注意:分了三个文件,main.c是入口
发表于 2020-07-25
LCD1602液晶显示模块深入详解之软件篇(<font color='red'>AVR</font>)
旧文备份:AVR读写EEPROM分析
由于AVR的EEPROM写周期比较长(一般为毫秒级),因此在编程使用过程中要特别注意.对于读EEPROM没什么好说的,读一个字节的数据要耗费4个时钟周期,可以忍受,写就比较麻烦了,虽然放在EEPROM的数据都不是频繁访问的;虽然可以用读-比较-写的机制降低EEPROM的写操作频度,但在写入过程中,过长的写入周期还是会造成一些问题,下面就分析一下几种方式的EEPROM写操作.循环查询式将地址和数据写入EEPROM相关的寄存器,置写标志后就循环不断查询写完成标志,直到写完成,退出循环,顺序执行其他程序.在置写入标志到写完成的这段时间,程序除了不断查询写完成标志和响应硬件中断之外什么也不干,这段时间就这么浪费了,如果是个实时性要求比较
发表于 2020-07-25
通过底层AVR方法实现SPI数据传输
主机端: 1 /********************************* 2 代码功能:通过底层AVR方法实现SPI数据传输(主机端) 3 创作时间:2016*10*17 4 使用资源: 5     更低阶的 aTmega(AVR) 库 6     SPI三个寄存器SPCR(控制寄存器),SPCR(状态寄存器),SPDR(数据的暂存器) 7         SPCR(SPI Control Register暂存寄存器) 8 
发表于 2020-07-25
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 nvwayi.com, Inc. All rights reserved
真人娱乐免费送彩金 免费送彩金28元 送彩金论坛 充值送彩金活动 送彩金的网址怎么找 怎么找送彩金的网站 生日送彩金的博彩公司 免费送彩金可提款 送彩金的娱乐棋牌游戏 手机彩票送彩金