文章由皮皮黄(微信/QQ: pph846375164)首发,转载请注明出处

本篇讲解一下单片机读取光栅编码器角度的方法。在刚开始接触光栅编码器之初,搜索了一些网上资源,但均不太稳定,容易出现丢步的情况。几经周折之后,索性花了2周时间好好研究了一下光栅编码器原理。现给自己做个笔记,也希望和各坚持技术道路的同行们交流。

目录
1、增量式光栅编码器结构
2、增量式编码器工作原理
3、网上程序错误解析
4、稳定的编码器程序算法
5、ATmeag16单片机程序示例

增量式光栅编码器结构:

增量式编码器工作原理:
编码器码盘上刻有A、B窄缝,彼此错开1/4节距,使得A、B两相在转动过程中,输出的电信号相位错开90°。如下图所示:

网上程序错误解析:
程序算法是A/B中的其中一项接外部中断(以A接中断、上升沿触发举例),当A上升沿触发中断时,读取B相的电位,如果B是高电位,则判定为正转,角度加1;如果B是低电位,则判定为反转,转角减1。
利用这种算法经常出现角度跳变,或者圈数转多之后出现积累误差。下面举个例子来解释一下这种算法错误的地方。
在编码器转动过程中,尤其在启动/转向/停止过程中,会出现编码器正好在一个上升沿中断处反复震荡的情况,如下图所示,在震荡过程中:
从a到b的过程,A相上升沿触发中断,此时B相为低电位,角度减去一个单位;
从b到c的过程,A相下降沿,无任何动作;
从c到d的过程,A相上升沿触发中断,此时B相为低电位,角度减去一个单位;
从d到e的过程,A相下降沿,无任何动作;
从e到f的过程,A相上升沿触发中断,此时B相为低电位,角度减去一个单位;
……
编码器实际角度一直停留在蓝虚线处,也就是实际角度其实是没有变化的。但在反复震荡的过程当中,程序会判定角度在一直在减少,导致实际角度与程序计算的角度产生偏差。这就是程序造成的光栅编码器丢失角度的原因。

本程序算法:
硬件清单:
1、单片机最小系统一个(ATmega16芯片)
2、4位数码管一只(595芯片模块)
3、光栅编码器一只(360线)
实现功能:转动编码器,读取编码器转动角度,并显示在数码管上

原理图:

实物连线图:

程序算法介绍:
光栅编码器A相连接单片机外部中断0,B相连接外部中断1。中断触发方式均为任意电平变化触发中断。那么在一个周期内会触发4次中断,如图所示。

以编码器是360线举例,那么每次中断转动的角度是360/360/4=0.25°,即360线编码器分辨率可以达到0.25°,以此类推720线编码器分辨率是360/720/4=0.125°……。
每次中断触发后,判断另一相电位,如上图蓝色虚线所示:
a处触发中断 A相1,B相0
b处触发中断 A相1,B相1
c处触发中断 A相0,B相1
d处触发中断 A相0,B相0
e处触发中断 与a处相同,进入下一个循环

把A/B相看作是一个二进制数,那么:
a处,(AB)10=2
b处,(AB)11=3
c处,(AB)01=1
d处,(AB)00=0
e处,……

可以看出,正转对应的是2310……2310……,反转对应的是2013……2013……。
在程序中保存前一中断位置数值,在本次中断中进行对比。符合正转数值排序,则角度加0.25°,反之减去0.25°。该方法测试下来非常准确,解决了之前老是丢步的问题。

核心部分程序如下:

unsigned char encoder_A;//encoder_A需要初始化 encoder_A=(PIND&0x0c)/4;
unsigned angle;//编码器角度变量
void encoder(unsigned int X)//X为编码器线数。编码器AB值判断函数
{unsigned char B;CLI();B=encoder_A;//保存上一次中断数值encoder_A=(PIND&0x0c)/4;//读取本次中断数值if((B==0 && encoder_A==1)||(B==1 && encoder_A==3)||(B==3 && encoder_A==2)||(B==2 && encoder_A==0)) //正方向判断{angle=angle+9000/X;//角度加一个分辨率if(angle==36000)angle=0;//角度超过360°则变为0°}else if ((B==0 && encoder_A==2)||(B==2 && encoder_A==3)||(B==3 && encoder_A==1)||(B==1 && encoder_A==0)) //反方向判断{if(angle==0)angle=36000; //角度小于0°则变为360°angle=angle-9000/X; //角度减一个分辨率}else ;SEI();
}#pragma interrupt_handler int0_isr:iv_INT0//中断0服务程序
void int0_isr(void)
{encoder(360);
}#pragma interrupt_handler int1_isr:iv_INT1//中断1服务程序
void int1_isr(void)
{encoder(360);
}

程序源码下载地址:https://download.csdn.net/download/ludantongxue/11287703

光电旋转编码器使用方法及稳定的单片机程序相关推荐

  1. 旋钮编码器c代码_非常稳定的旋转编码器解码程序(C51源代码)

    在网上下载过很多种编码器解码程序,使用后感觉都不够稳定,特别是旋转速度稍快时,经常会出现错误解码.为此,经过分析编码器输出波形特点,结合其它解码程序的优点,编写如下代码,不用中断,也可以不用定时器.经 ...

  2. 旋转编码器的原理和使用方法

    一.基本原理 旋转编码器是一种机电装置,可将轴的角运动,转换为A/B两相相位偏差90°的脉冲信号,其中C是A/B信号的参考地 [1]根据A/B信号的相位关系可以获取正反转方向. [2]通过脉冲的计数可 ...

  3. 欧姆龙旋转编码器接入单片机(STM32为例)的方法

    欧姆龙编码器接入单片机实现脉冲计数 前言 一.OMRON E6B2-CWZ6C 二.接入过程 1.编码器线序定义 2.3D建模 1.编码器支架 2.欧姆龙旋转编码器 3.SW装配体模型 总结(要想快, ...

  4. 11旋转编码器原理_科普小知识:八分钟了解电机编码器!

    获取更多学习资料知识可以扫码加微信进入非标设计学习交流微信群,也可直接加QQ群:834928686看免费非标设备设计直播公开课学习,领取课堂学习礼包! 编码器的工作原理及作用:它是一种将旋转位移转换成 ...

  5. stm32编码器正反转计数程序_编码器接线方法你会吗?

    编码器的作用主要是它是一种将旋转位移转换成一串数字脉冲信号的旋转式传感器,这些脉冲能用来控制角位移,如果编码器与齿轮条或螺旋丝杠结合在一起,也可用于测量直线位移.想知道5线编码器接线方法吗?想了解更多 ...

  6. 11旋转编码器原理_旋转编码器的原理是什么?增量式编码器和绝对式编码器有什么区别?...

    先给出结论,最重要的区别在于:增量式编码器没有记忆,断电重启必须回到参考零位,才能找到需要的位置,而绝对式编码器,有记忆,断电重启不用回到零位,即可知道目标所在的位置. 接下来细说一下,主要包含如下的 ...

  7. 增量式旋转编码器工作原理

    增量式旋转编码器工作原理 增量式旋转编码器通过内部两个光敏接受管转化其角度码盘的时序和相位关系,得到其角度码盘角度位移量增加(正方向)或减少(负方向).在接合数字电路特别是单片机后,增量式旋转编码器在 ...

  8. 旋转编码器:如何在 Arduino 上使用 Keys KY-040 编码器

    旋转编码器是一种输入设备,您可以在任一方向连续旋转.当您转动设备时,它会生成数字脉冲,以使用两个相控输出信号显示旋转方向.这两个输出还指示单个位置运动,因此您可以在控制面板中使用它们来增加或减少参数. ...

  9. Arduino使用旋转编码器

    这次介绍的是我买的37款传感器套件中的旋转编码器.首先是实物图. 通过查阅资料,旋转编码器既可以左右旋转,又能当成按钮按下.首先测试一下按下的功能,该功能对应的输出引脚是SW. 测试代码如下:  in ...

最新文章

  1. 拍牌神器是怎样炼成的(三)---注册全局热键
  2. 感知机模型[神经网络入门]
  3. mybatis传set参数
  4. 惠普omen测试软件,双GTX1080奢华魔方PC 惠普OMEN X评测
  5. 动态列排序_Excel表格利用函数制作排序器(可依据不同字段、升降序排序)
  6. 计算机软件技术职业工作规划,软件技术职业规划书.docx
  7. 详细介绍如何从零开始制作51单片机控制的智能小车(一)———让小车动起来
  8. GOP图像组和组中3类不同的图像帧IBP
  9. android渠道首发规则,酷传推广手册Android渠道首发规则.doc
  10. raid5硬盘插到计算机读取,【哭着写下这篇文章】win2008软raid5变成2个磁盘组的数据恢复...
  11. hadoop学习之路(2)
  12. 电商平台促销方式汇总
  13. word文档中的毕业论文的页眉与页脚设置
  14. python 对数收益率_用python进行风险调整后的收益
  15. 关于Windows10的dll文件缺失报错---解决方法
  16. jquery datatables-1.8.2服务器端分页不支持IE6,IE7 UBG修改。
  17. Python 邮件发送之嵌套图片发送附件
  18. session 超时时间设置
  19. 编写Java程序,判断一个email地址是否合法
  20. Linux command | network

热门文章

  1. python文件操作学习心得
  2. 使用Hadoop同步Neo4j数据(亿级)
  3. Keysight|是德E5063A矢量网络分析仪18G网分出售
  4. JNI简介及语法介绍
  5. Windows环境下Kerberos的配置
  6. mysql数据库concat拼接字符串乱码问题
  7. RM文件解析之RM文件格式
  8. 分享一个工作日 今天是周六
  9. JavaWeb(11) 快速爬取别人的网站页面(Ctrl+A,Ctrl+C,Ctrl+V一分钟搞定)
  10. python递归函数1到n求和_python递归法求解累加和