具有停顿点的旋转编码器的编码方法
2025-05-12 来源:eepw
旋转编码器,在旋转时可以产生相位相差九十度的两路数字脉冲信号,两路脉冲信号相位的先后关系,可以代表旋转方向,如图1 所示。(a)代表顺时针方向旋转时,A 路脉冲领先于B 路脉冲,A 路脉冲的上升沿对应B 路脉冲的低电平;(b)显示逆时针方向旋转时,B 路脉冲领先于A 路脉冲,A 路脉冲的上升沿对应B路脉冲的高电平。
![]() | ![]() |
| (a)顺时针方向旋转 | (b)逆时针方向旋转 |
图1 两路脉冲相位关系
通常将一个旋转编码器等同于两个按键,利用CPU(中央处理器)或FPGA(现场可编程逻辑门阵列)扫描按键状态的变化。在被扫描按键的一端施加低电平,从按键的另一端回读电平高低,电平变化了,代表按键状态发生了变化,使用者操作了按键;旋转编码器对应的两个按键的组合状态发生了变化,则表示操作了旋转编码器,新的组合状态与之前的组合状态共同指示了旋转方向。对旋转编码器的转动操作进行编码的关键就是旋转方向的判决。
旋转编码器每转一周, 两路信号A、B 包含固定数目的脉冲周期,下面论述中将其中一路数字脉冲信号的相邻两个上升沿之间的部分称为一个脉冲周期。在图1 中, 一个脉冲周期内, 顺时针方向旋转时,对应两路脉冲信号A、B 电平的组合编码依次为10 → 11 → 01 → 00 → 10, 逆时针方向旋转时, 对应两路脉冲信号电平的组合编码依次为11 → 10 → 00 → 01 → 11。当组合状态发生了10 到11的变化,可知发生了顺时针方向的旋转,当组合状态发生了11 到10 的变化,可知发生了逆时针方向的旋转。两路脉冲信号配合,利用相互之间的相位关系,在一个脉冲周期内最多可以在00、01、10、11 这4 个状态位置产生扫描计数。
1 带停顿点的旋转编码器
有的旋转编码器,为增强操作的手感或可控性,在一个脉冲周期内等间隔设置1、2 或4 个机械停顿点。图2 是顺时针方向旋转时,在一个脉冲周期中具有不同停顿点的四种情况示意,(a)表示无停顿点、(b)表示一个脉冲一个停顿点、(c)表示一个脉冲两个停顿点、(d)表示一个脉冲四个停顿点;虚竖线处为停顿点稳定位置。
在具体应用中,一般只在停顿点稳定位置处产生有效计数。在(a)、(d)两种情况下,在一个脉冲周期中产生四个扫描计数;(b)、(c)情况下,在一个脉冲周期中分别产生一个和两个有效的扫描计数。有些种类的数字化仪器或装置,会同时使用这四种旋转编码器中的两种或多种。具有停顿点的旋转编码器,一般用于参数档位的单步距增减;没有停顿点的旋转编码器,由于旋转阻力很小,旋转速度可以很快,一般用于需要连续快速调整的参数。
![]() | ![]() |
| (a)无停顿点 | (b)每周期一个停顿点 |
![]() | ![]() |
| (c)每周期两个停顿点 | (d)每周期四个停顿点 |
图2 停顿点位置
2 旋转编码器扫描编码的实现
旋转编码器旋转时两路脉冲信号的4 种组合状态,刚好是所有4 个两比特组合数00、01、10、11,所以可以设计一个矩阵式编码表格,根据前言中所述两个旋转方向下的状态转移规律,通过查表方式判决旋转方向:表格行地址为两路脉冲信号AB 的当前状态码,表格列地址为两路脉冲信号的前一状态码;表格中的数据,‘0’代表逆时针旋转,‘1’代表顺时针旋转,其他任一数据如‘-1’代表无操作,如表1 所示。

针对上述旋转编码器一个脉冲周期中具有不同停顿点的四种情况,图2(a)、图2(d)两种情况在四个位置产生扫描计数,直接使用表1。对于图2(b)、图2(c),只在当前状态为停顿点位置时产生有效的扫描编码。对于图2(b),停顿点状态为“00”,所以仅保留表1 中当前状态码为“00”的状态有效,得到表2;对于图2(c),停顿点状态为“00”、“11”,仅保留当前状态码为“00”和“11”的状态有效,得到表3。这相当于将表1 中非停顿点处的旋转方向编码设置为代表无操作的码‘-1’,从而将停顿点处理功能与旋转方向判决功能合并到同一个查询表中。

下面以具有4 个旋转编码器的一个项目为例简要说明基于本文方法的旋转编码器扫描编码的具体程序实现。
4 个旋转编码器,其中两个每脉冲周期具有两个停顿点,另两个无停顿点;根据前面论述,对应的编码表分别为表3 和表1。据此可以编制查询表rotCode 及编码器类型定义表typeID。旋转编码器的扫描程序主要流程为:①上电获取初始状态作为前一状态statHistAll(4 个旋转编码器,共占用8 位);②扫描旋转编码器状态变化;③延迟去抖,得到当前状态statCurrAll(4 个旋转编码器,共占用8 位);④查表判决旋转方向;⑤计算编码值;⑥将前一状态的值替换为当前状态的值。
关键数据结构及4 个旋转编码器扫描编码的程序段如下。


当经过除抖动后确认状态发生了变化,即使在查表时发现是无效的旋转位置,也要将前一状态缓存中的状态值更新为当前状态值,以保证查表逻辑的有效性。
一次查表实现旋转方向解码及是否计数的指示,避免针对具有不同机械停顿点设置的旋转编码器编制繁杂的程序以判决旋转方向及是否进行计数。
3 结论
根据旋转编码器两路脉冲信号状态在两个旋转方向上的不同变化顺序,以及停顿点位置,编制旋转编码器扫描解码查询表格,能够同时适用于具有不同机械停顿点设置的旋转编码器,具有逻辑灵活统一、编码简洁高效的特点。
下一篇:基于单相SVPWM的可变死区算法
- 嵌入式的风向变了:2026纽伦堡嵌入式展透露这些趋势
- 高通确认不在GDC 2026发布新款骁龙G系列掌机处理器SoC
- 行业评论 从工具到平台:如何化解跨架构时代的工程开发和管理难题
- 阿里达摩院发布玄铁C950,打破全球RISC-V CPU性能纪录
- 面向嵌入式部署的神经网络优化:模型压缩深度解析
- Mujoco中添加Apriltag标签并实现相机识别教程
- 摩尔线程MTT S5000全面适配Qwen3.5三款新模型
- 英飞凌与宝马集团携手合作,基于Neue Klasse架构塑造软件定义汽车的未来
- 物理AI仿真新突破:摩尔线程与五一视界共建全栈国产化生态
- 爆火的OpenClaw! 告别云端,米尔RK3576开发板本地部署
- 中国芯片研发重要成果!中科院发布香山、如意系统
- Miniconda环境隔离教程:解决Python版本冲突的完整指南
- Jetson GPU Burn烤机测试与PTX编程详解
- LabelImg安装使用教程:YOLOv12训练数据标注完整指南
- 根据题意,水位上升记为正,下降记为负。汛期水位上升3分米(即0.3米)记作+3分米,此时达到最高水位12.5米,因此基准水位(记作0时的水位)为: 12.5米 - 0.3米 = 12.2米。 汛期过后水位下降4分米(即0.4米),是从最高水位下降,故实际水位为: 12.5米 - 0.4米 = 12.1米。 实际水位相对于基准水位的变化量为: 12.1米 - 12.2米 = -0
- YOLOv12训练实战:train.py常用参数详解
- Altera 与 Arm 深化合作,共筑 AI 数据中心高效可编程新方案
- 莱迪思加入英伟达 Halos生态系统,通过Holoscan传感器桥接技术提升物理人工智能安全性
- 芯科科技闪耀2026嵌入式世界展 以Connected Intelligence赋能,构建边缘智能网联新生态










