X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
NXP MCU
[原创] 旋转编码器解码
zhaojun_xf
2013-8-28 09:59
楼主
随着电子技术的发展,旋转编码器的应用越来越广泛。下面我们谈谈对旋转编码器的解码。
旋转编码器是用来测量转速的装置,光电式旋转编码器通过光电转换,可将输出轴的角位移、角速度等机械量转换成相应的电
脉冲
以数字量输出(REP)。它分为
单路
输出和双路输出两种。技术参数主要有每转脉冲数(几十个到几千个都有),和供电电压等。单路输出是指旋转编码器的输出是一组脉冲,而双路输出的旋转编码器输出两组A/B相位差90度的脉冲,通过这两组脉冲不仅可以测量转速,还可以判断旋转的方向。
我的博客
点赞
(1)
回复评论 (11)
沙发
zhaojun_xf
编码器的种类比较多,下面我们谈谈两路输出脉冲的编码器解码:
从上面的波形不难看出,左转时,A比B的波形快一些出现;而右转时,A比B的波形晚一些出现,其输出电平状态为:
左转: A - 0 1 1 0 0 1 1 0 0
B - 0 0 1 1 0 0 1 1 0
右转: A - 0 0 1 1 0 0 1 1 0
B - 0 1 1 0 0 1 1 0 0
左转 : 当A和B的值组合(A<<1 | B)时,获取值为:-2-3-2-0
右转 : 当A和B的值组合(A<<1 | B)时,获取值为:-1-3-2-0
我的博客
点赞
2013-8-28 10:15
板凳
zhaojun_xf
从上面的二进制可以看出,左转和右转的数据排列组合是不一样的。我们可以通过转换状态的变化只获取转换方向,并记录脉冲获取旋转幅度。
所以,可以通过获取之前状态和当前状态,来解码编码器的旋转。
例如: 之前状态为0,当前状态为2,则为左转开始;如果之前状态为0,当前状态为1,则是右转开始。
我的博客
点赞
2013-8-28 10:20
4楼
zhaojun_xf
理解了上面的内容,下面解码就非常方便了。我们知道,两路输出有4总状态,而之前状态和当前状态组合就可能出现4x4 = 16种状态,但是,从上面的帖子可以看出,一种状态只可能转化到另外两种状态,而其他两种状态是不会出现的,即使出现,也是乱码或干扰,不被采用。
/**************************************************************************************
* FunctionName : KEY_ReadRotaryVal()
* Description : 旋转编码器解码(定时1ms中断调用,不会漏掉脉冲)
* EntryParameter : None
* ReturnValue : None
**************************************************************************************/
u8 KEY_ReadRotaryVal(void)
{
u8 curSta;
static u8 preSta = 0;
static u8 tmpL = 0;
static u8 tmpR = 0;
u8 keyL, keyR, key = KEY_VAL_NO;
keyL = GPIO_ReadInputDataBit(KEY_CL_PORT, KEY_CL_PIN);
keyR = GPIO_ReadInputDataBit(KEY_CR_PORT, KEY_CR_PIN);
curSta = (0x01 << keyL) | keyR;
if (preSta != curSta)
{
switch ((preSta<<4) | curSta) // 前一状态+当前状态
{
case 0x02:
case 0x10:
case 0x23:
case 0x31: // 左转
{
tmpR = 0;
if (++tmpL >= KEY_ROT_TIM)
{
tmpL = 0;
KEYPar.Rotary++;
key = KEY_VAL_CL;
}
break;
}
case 0x01:
case 0x13:
case 0x20:
case 0x32: // 右转
{
tmpL = 0;
if (++tmpR >= KEY_ROT_TIM)
{
tmpR = 0;
KEYPar.Rotary++;
key = KEY_VAL_CR;
}
break;
}
default: tmpL = 0; tmpR = 0; KEYPar.Rotary = 0; break;
}
preSta = curSta;
}
return key;
}
[
本帖最后由 zhaojun_xf 于 2013-8-28 10:41 编辑
]
我的博客
点赞
2013-8-28 10:24
5楼
zhaojun_xf
解码函数的返回值为转动方向,而全局变量KEYPar.Rotary中存放的是旋转脉冲个数,为滤波,还进行了4次计一出来,保证快速转动时,保证不会出现多余值。当然这个函数可以采用定时扫描,也可以采用中断读取。
为了保证不遗漏脉冲,建议每ms读取一次编码器。我们可以采用定时中断调用。
我的博客
点赞
2013-8-28 10:34
6楼
zhaojun_xf
本解码方法非常简单易懂,特别是之前状态与当前状态的组合方法非常容易理解,特别直观。网友可以根据自己使用的编码器进行适当的修改获取自己需要的代码。
我的博客
点赞
2013-8-28 10:38
7楼
季夏木槿
回复 6楼zhaojun_xf 的帖子
不错啊
点赞
2013-8-28 11:27
8楼
sacq
占座学习~~~~
http://weibo.com/u/1391449055
点赞
2013-8-28 14:25
9楼
alva.wang
这个和光电可增益编码器差不多吧!
点赞
2013-9-3 18:58
10楼
zwei9
学习
点赞
2013-9-20 07:35
11楼
a474696060
编码器,MARK,马上就要用了
点赞
2015-9-22 08:31
12楼
m8684589
思路简单又实用,最重要的是还有滤波效果,不错
点赞
2021-5-4 22:51
最新活动
报名直播赢【双肩包、京东卡、水杯】| 高可靠性IGBT的新选择——安世半导体650V IGBT
30套RV1106 Linux开发板(带摄像头),邀您动手挑战边缘AI~
安世半导体理想二极管与负载开关,保障物联网应用的稳健高效运行
免费申请 | 上百份MPS MIE模块,免费试用还有礼!
PI 电源小课堂|无 DC-DC 变换实现多路高精度输出反激电源
2024 瑞萨电子MCU/MPU工业技术研讨会——深圳、上海站, 火热报名中
随便看看
阻抗或者导纳特性曲线若干问
十万火急,,我这样把拨码赋程序中为什么老抱错误..用ISE
timer A的捕获模式
(转)学长总结给要参加电子设计竞赛的同学们的意见
请问DC48v降压到5V,不用变压器有什么办法实现么?
哎,感觉公司的硬件从来没有先进过
ICETEK-5100USB的仿真器,
5年保变1年 浅谈希捷硬盘质保变异
看清分清了:串口、COM口、TTL、RS-232和RS-485
我有个关于STM8S的SPI数据接收问题问大家,希望大家帮个忙
做DSP软件开发必看手册二:编译器手册
MSP430的map文件有个疑惑
wince启动加载驱动的顺序问题
2440 wince 5 usb device cable插入/拔出会触发什么中断?
电磁兼容的设计方法介绍(三)
【工程源码】Linux 查看进程和删除进程
TIVA C的学习资料
感谢有你+论坛里的大虾
问有谁熟悉生理传感器的(体温、血压、脉搏等等),介绍几款能用在开发板上的。。。
半夜里溜进小强把主板烧了
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复