http://www.hlzs100.com

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来解决了。

  注意相邻卡点之间挤了4个AB端口的状态,因此延时不能过长。你可以试试更长的间隔。

  本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

  下一篇:LCD1602液晶显示模块的单片机驱动深入详解之软件篇(AVR)

  一、接线方式及端口定义RDY/BSY 判忙标志位。(0:设备正忙 1:等待新的命令)OE输出使能位 低电平有效WR 写脉冲 低电平有效BS[2:1] 字节选择1(0:选择低位字节 1:选择高位字节)XA[1:0] XTAL动作位00加载Flash或者EEPROM地址01加载数据10加载命令11保留PAGEL 加载程序存储器和EEPROM数据页DATA 双向数据/命令口0x80 芯片擦除0x40 写熔丝位0x20 写锁定位0x10 写FLASH0x11 写EEPROM0x08 读标示字节和校准字节0x04 读熔丝位及锁定位0x02 读FLash0x03 读EEPROM接线方式及端口定

  创建项目时,芯片选择ATMEGA16各种数据类型长度如下char 8位short 16位int 16位long 32位long long 64位有空再测试下double、float的长度后来偶然发现gcc提供一个头文件 stdint.h可以这样定义新的变量1 uint32_t a;//a是一个32位长无符号整型2 uint64_t b;//b是一个64位长无符号整型3 int8_t c;//

  1.舵机驱动的基本原理(可以参考)控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。简单的来讲,就是输出一个周期为20Ms,不同的占空比对应舵机转过不同的角度。难点主要在于舵机控制信号需要保持,这样就比用脉冲控制步进电机要复杂一些。你需

  中断源和中断向量:缺省情况下,AVR的程序存储区的最低端,即从Flash地址的0x0000开始用于放置中断向量,称做中断向量区。中断向量区大小 = 中断源个数 * 每个中断向量占据字数。对于Flash比较小的AVR处理器,每个中断向量占据一个字的空间,用于放置一条相对转移指令 rjmp(跳转范围-2K~+2K),而Flash较大的AVR,每个中断向量占据两个字空间,用于放置一条绝对转移指令 jmp,用于跳转到相应中断的中断服务程序的起始地址。在这21个中断中,包含1个非屏蔽中断(RESET)3个外部中断(INT0、INT1、INT2)和17个内部中断。RESET $000INT0 $002INT1 $004INT2

  codeblocks+winavr开发avr单片机(atmega16)

  在avrfeaks论坛里,有一个帖子是关于在codeblocks环境下(与winavr结合)开发avr单片机的,挺不错。

上一篇:TDK新型功率电感器及全新贴片型(SMD)电容器系列
下一篇:变压器的并联运转-变压器十三