历史上的今天
返回首页

历史上的今天

今天是: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端口的状态,因此延时不能过长。你可以试试更长的间隔。


推荐阅读

史海拾趣

成都振芯/国腾(CORPRO)公司的发展小趣事

2003年,成都国腾微电子有限公司(后更名为成都振芯科技股份有限公司)正式成立,标志着CORPRO的起点。公司由成都国腾电子集团投资设立,创始人团队汇聚了来自中国物资储运集团、电子科技大学等单位的精英。在成立之初,CORPRO就致力于集成电路、微波组件及相关电子器件的设计、开发与销售,奠定了其在电子行业的基础。

CSB公司的发展小趣事

随着国内市场的饱和,CSB公司开始将目光投向海外市场。公司制定了国际化战略,通过设立海外分支机构、拓展国际市场渠道、加强与国际合作伙伴的合作等方式,逐步实现了全球市场的布局。在国际市场上,CSB公司的产品和服务得到了广泛认可,为公司带来了丰厚的回报。

这些故事虽然是对电子行业企业发展的一般性描述,但可能在一定程度上反映了CSB公司或其他类似企业在电子行业中的发展历程。然而,需要注意的是,每个企业的发展道路都是独特的,具体的故事还需根据企业自身的实际情况来编写。

Elec & Eltek公司的发展小趣事

Eltek公司是一家专注于电力电子技术的公司,成立于20世纪中期。创始人王刚(化名)意识到电力电子技术对于提高能源利用效率的重要性,于是决定投身这一领域。在他的带领下,Eltek公司不断研发出高效、可靠的电力电子产品,如变频器、逆变器等。随着可再生能源技术的兴起,Eltek公司抓住机遇,将电力电子技术应用于可再生能源领域,如太阳能、风能等。这一创新举措让Eltek公司在可再生能源领域取得了显著的成绩。

博流(Bouffalo Lab)公司的发展小趣事

随着公司的发展壮大,博流积极寻求与全球知名企业的合作机会。其中,与谷歌的合作尤为引人注目。作为Google Matter EAP合作伙伴,博流与谷歌共同推动Matter协议在智能家居生态系统中的应用,为用户提供更加便捷、智能的家居体验。此外,博流还与多家产业链上下游企业建立了紧密的合作关系,共同推动物联网产业的发展。

Global Connector Technology公司的发展小趣事
使用合适的工具检查电源电压是否稳定,是否存在电磁干扰等问题。
Comair Rotron公司的发展小趣事

随着电子技术的飞速发展,Comair不断投入研发,力求在技术上取得突破。在某次关键的技术研发中,公司成功开发出了一种新型高效风扇,其性能远超当时市场上的同类产品。这一技术突破为Comair赢得了更多电子行业客户的青睐,公司的市场份额也逐渐扩大。

问答坊 | AI 解惑

采用FPGA集成DSP功能,提高成像应用的性能

Intevac是商用和军用市场光学产品的前沿开发商。本文介绍该公司NightVista嵌入式电子系统的开发,该产品是高性能超低亮度紧凑型摄像机。该摄像机最初采用了流行的数字信号处理器、几个ASSP和外部存储器件。系统对性能的需求越来越高,工程师团队决 ...…

查看全部问答>

上海5000用户开始试点数字家庭

昨天,记者从“2006上海国际数字家庭高峰论坛”上获悉,上海电信正在5000户ADSL用户中试点数字家庭业务,这些用户可以享受到包括IPTV、网络远程监控、电话POS机、远程医疗以及家电的远程控制,这也是国内运营商在该领域的首次尝试。    与会 ...…

查看全部问答>

P89C51RB2-RC2-RD2中文数据手册

P89C51RB2/RC2/RD2具有16K32K64K并行可编程的非易失性FLASH程序存贮器,并可实现对器件串行在 系统编程和在应用中编程,在系统的编程:当MUC安装在 用户板上时,应许用华下载新的 代码,在应用中编程:MUC可以在系统中获取新代码并对自己重新编程。 ...…

查看全部问答>

节能....电器设计师的责任

突然脑子里想到家里暖水瓶,上午烧得水下午就不热了,由此,希望设计师在设计电热产品时,为节能作出点贡献,比如,电饭煲的外壳使用四层结构来延长保温时间,或者增加闷饭档来节电,设计其他电器产品用小的支出来换取功能的增加也是不错的,比如饮 ...…

查看全部问答>

soso

求制作简单逻辑分析仪的全电路图…

查看全部问答>

正弦表

在F28335里面有固化的正弦表么?是不是512个点的那个   在定义那个段的时候,怎么定义啊?有没固定的格式啊?   还有自己建立个正弦表好,还是用固化的好?…

查看全部问答>

怎么编写并口驱动,如果建立在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 ...…

查看全部问答>

禁止qq和msn的配置脚本(针对不支持DI的老版本设备)

禁止qq和msn的配置脚本(针对不支持DI的老版本设备) 支持se club成立   回亏广大老用户  ...…

查看全部问答>

当程序在运行时,如何不让手机待机(当手机已设置10分钟待机),这三个方法哪个能现实?

当程序在运行时,如何不让手机待机(当手机已设置10分钟待机),这三个方法哪个能现实? 如果能实现的话请给一个实例... SetSystemPowerState SetDevicePower SetPowerRequirement…

查看全部问答>