当前位置: 首页 > news >正文

【案例】旋转编码器高精度防抖驱动设计文档


一、文档信息

  • 项目平台:RV1126/RV1109 Linux 嵌入式平台

  • 驱动对象:机械式旋转编码器(A/B 两相输出)

  • 核心方案:高精度定时器(hrtimer)+ 双级中断屏蔽

  • 解决目标:消除毛刺干扰、固定时序采样、杜绝方向误判

  • 稳定程度:工业级量产可用


二、问题背景(硬件真实特性)

2.1 硬件结构

机械式旋转编码器通过 A、B 两相相位差判断旋转方向,由机械触点导通 / 断开产生电平变化。

2.2 硬件真实波形(关键约束)

  1. 旋转动作 → A 相首先发生电平跳变

  2. A 相跳变瞬间,机械触点会产生连续毛刺短时间内出现多次边沿跳变 → 产生大量毛刺中断

  3. B 相电平翻转速度非常快A 相跳变后,最快约 1.5ms 左右 B 相就会完成翻转

  4. B 相一旦翻转,相位关系立即改变若读取时机晚于 1ms,会直接读到错误相位,导致方向判反

2.3 硬件时序总结(硬性约束)

  • A 跳变后 0~1ms:B 保持原值 → 正确采样窗口

  • A 跳变后 ≥1.5ms:B 已翻转 → 错误采样窗口

  • 必须在 1ms 内完成 B 相电平读取,否则必然误判


三、问题现象(原始驱动表现)

3.1 现象 1:A 相毛刺导致频繁误触发

  • 旋转一格,触发多次事件

  • 静止时偶尔自动触发

  • 触发次数不可控

  • 根本原因:机械抖动 → 连续中断触发

3.2 现象 2:B 相读取时机过晚 → 方向反跳

  • 顺时针旋转 → 上报逆时针

  • 逆时针旋转 → 上报顺时针

  • 快速旋转时完全混乱

  • 根本原因:B 相在 1.5ms 内已翻转,驱动读取时机 >1ms,读到错误电平

3.3 现象 3:传统工作队列(system_wq)延时不可控

  • 配置延时 1~2ms

  • 实际延时 10ms~30ms

  • 完全错过正确采样窗口

  • 根本原因:共享工作队列受内核调度、系统负载影响,无法保证微秒 / 毫秒级精准延时

3.4 现象 4:快速旋转时逻辑错乱

  • 连续中断互相覆盖

  • 状态机异常

  • 方向随机跳变

  • 根本原因:无有效中断屏蔽机制,毛刺与有效信号无法区分


四、问题根源分析(核心总结)

4.1 根源 1:机械特性不可避免

A 相跳变必然伴随毛刺,必须通过软件屏蔽。

4.2 根源 2:B 相翻转极快

B 相最快 1.5ms 就会翻转, →必须在 1ms 内完成读取,否则相位失效。

4.3 根源 3:通用延时机制无法满足精度要求

  • work_queue

  • msleep

  • delayed_work均无法保证1ms 内准时执行

4.4 根源 4:缺少分级屏蔽策略

  • 无毛刺屏蔽

  • 无干扰屏蔽

  • 无快速旋转保护 导致中断泛滥、状态混乱。


五、解决方案推导(严格围绕硬件约束)

5.1 必须满足:A 跳变 → 1ms 内读取 B

唯一方案:高精度定时器 hrtimer

  • 不受系统调度影响

  • 精度可达微秒级

  • 保证 1ms 内准时读取

5.2 必须屏蔽:A 相跳变后的毛刺

启动定时器后,1ms 内所有新中断直接丢弃保证:一次旋转 → 一次有效采样

5.3 必须杜绝:读取时间超过 1ms

hrtimer 设定为1ms 执行, 确保永远落在正确采样窗口

5.4 必须增加:上报后屏蔽期

机械回弹、线路干扰、快速旋转都可能产生无效中断 设置10ms 屏蔽期,人手无法超过该速度,完全安全。


六、最终驱动逻辑(工业级稳定版)

6.1 整体执行流程

  1. A 相边沿中断触发

  2. 两级过滤判断:

    1. 定时器正在运行 → 丢弃(毛刺屏蔽)

    2. 距上次上报 <10ms → 丢弃(干扰屏蔽)

  3. 记录当前 A 相状态

  4. 启动 1ms 高精度定时器
    hrtimer_init(&encoder->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
    encoder->hrtimer.function = hrtimer_callback;

    /* Start 1ms high-precision timer */
    t = ktime_set(0, 1000000);
    hrtimer_start(&encoder->hrtimer, t, HRTIMER_MODE_REL);

  5. 定时器到期立即执行:

    1. 读取 B 相电平

    2. 方向判断

    3. 上报 input 事件

    4. 记录上报时间(用于后屏蔽)

  6. 流程结束,等待下一次有效旋转

6.2 双级中断屏蔽(核心稳定机制)

(1)前屏蔽:定时器运行期间(1ms)

作用:彻底滤除 A 相毛刺行为:中断直接丢弃

(2)后屏蔽:上报完成后(10ms)

作用:滤除机械回弹、线路干扰、快速误触行为:中断直接丢弃

6.3 方向判断逻辑(严格匹配硬件时序)

a = gpiod_get_value(encoder->gpios->desc[0]); b = gpiod_get_value(encoder->gpios->desc[1]); if (encoder->last_stable == 0) { dir = (b == 0) ? 1 : -1; } else { dir = (b == 1) ? 1 : -1; }

七、关键技术实现

7.1 高精度定时器(hrtimer)

  • 时钟源:CLOCK_MONOTONIC

  • 定时精度:1ms(1000000ns)

  • 保证:A 跳变 → 1ms 内准时读取 B

7.2 原子状态保护

/* 1. Drop if timer is already running */ if (atomic_read(&encoder->work_scheduled)) { log_ts("IRQ ignored (work in progress)"); return IRQ_HANDLED; } atomic_set(&encoder->work_scheduled, 1);

保证同一时刻只有一个定时器运行,避免重入。

7.3 10ms 后屏蔽机制

/* 2. Drop if within 10ms mask after last report */ diff = ktime_to_us(ktime_sub(ktime_get(), encoder->last_report_time)); if (diff < 10000) { log_ts("IRQ ignored (10ms mask after report)"); return IRQ_HANDLED; }

7.4 毫秒级精准调试日志

可实时观测:

  • 中断触发时间

  • 定时器启动时间

  • 采样执行时间

  • 总延时

  • 屏蔽事件


八、最终解决效果

8.1 毛刺完全消除

  • 一格一触发,无多触发

  • 无自动乱跳

  • 无干扰触发

8.2 方向 100% 正确

  • 永远在 1ms 内读取 B

  • 永远不会读到 1.5ms 后翻转的错误电平

  • 顺时针 / 逆时针完全准确

8.3 延时极低、跟手性极佳

  • 中断 → 上报:≤ 1ms

  • 无系统调度延迟

8.4 高速旋转稳定

  • 不误判

  • 不丢步

  • 不反方向

8.5 工业级稳定性

可直接用于量产产品。


九、问题解决完整历程(项目可归档版)

  1. 现象:编码器乱跳、方向反、快速旋转失灵

  2. 测波形:A 相有毛刺,B 相最快 1.5ms 即翻转

  3. 发现:必须在 1ms 内读取 B 相,传统队列无法满足

  4. 方案:替换为高精度定时器 hrtimer,保证 1ms 内读取

  5. 优化:增加定时器期间屏蔽,滤除 A 相毛刺

  6. 优化:增加上报后 10ms 屏蔽,滤除干扰与回弹

  7. 验证:慢速 / 中速 / 快速旋转均稳定,方向 100% 正确

  8. 结论:驱动达到量产稳定标准


十、文档总结

本驱动围绕机械式旋转编码器硬件时序约束设计:

  • A 相毛刺多

  • B 相翻转快(最快 1.5ms)

  • 必须 1ms 内采样

通过高精度定时器(hrtimer)+ 双级中断屏蔽方案:

  • 解决毛刺干扰

  • 解决时序不准

  • 解决方向误判

  • 解决快速旋转异常

是 Linux 非实时内核下,旋转编码器最稳定、最可靠、最严谨的实现方案。

附件:

按键实测波形图:

http://www.jsqmd.com/news/813021/

相关文章:

  • 如何快速解决C盘空间不足:Windows Cleaner开源磁盘清理工具深度解析
  • Simba MCP Server:用AI助手对话式驱动贝叶斯营销组合模型分析
  • 2026最新AI大模型学习路线:AI大模型学习速成,从入门到高薪就业的完整攻略!
  • 浙江臻万科技有限公司2026全品类充电桩精选:国内品牌推荐/出口源头厂家/充电站运营商优选浙江臻万科技 - 栗子测评
  • 重货塑料托盘哪家好?2026重载托盘厂家推荐:高动载塑料托盘厂家+塑料托盘源头厂家全梳理 - 栗子测评
  • 5个星露谷物语效率提升模组:让你的农场管理更智能
  • OpenArk:Windows系统安全检测的终极完整解决方案指南 [特殊字符]️
  • PyTorch自动微分完全解析:深入理解Autograd机制与实战应用指南 [特殊字符]
  • TVA 与传统工业视觉:技术内核与应用分野(5)
  • PHP 应用等保 2.0 合规实践
  • ARM虚拟化地址转换与VTCR寄存器详解
  • Timoni最佳实践:7个提升Kubernetes应用交付效率的方法 [特殊字符]
  • AHB总线主从多路复用器设计与信号详解
  • TS 报错 TS2349 调用签名不存在如何补充类型?
  • 2026年评价高的自住钢结构别墅可靠服务公司 - 行业平台推荐
  • Battle City碰撞检测算法:精准命中与躲避的核心技术解析
  • 2026重载塑料托盘厂家精选:出口用塑料托盘厂家+冷链塑料托盘厂家+物流塑料托盘厂家汇总 - 栗子测评
  • 使用python快速接入taotoken并调用多模型完成聊天任务
  • Django 零基础入门:为什么选择 Django 而不是 Flask/FastAPI?
  • 7个核心步骤构建企业级osquery监控架构:从基础部署到战略级安全分析
  • VSCode AI编程助手AIDE:代码生成、转换与智能开发实战
  • Tenda BE5100三装Mesh Wi-Fi系统评测:价格实惠、速度快,覆盖大空间!
  • 2026全自动超声波清洗机厂家推荐:工业超声波清洗机源头工厂+半导体超声波清洗机厂家推荐精选 - 栗子测评
  • NeoPixel灯环故障深度修复:从信号完整性到电源设计的嵌入式实践
  • 2026年4月市面上做得好的混凝土厂家推荐,技术好的混凝土推荐分析 - 品牌推荐师
  • GTA5mod整合包下载分享(已汉化+自带修改器)2026最新版本
  • Windows 11终极性能调优指南:一键告别卡顿,重获流畅体验 [特殊字符]
  • AI智能体安全防护实战:Crawdad三层防御体系详解
  • OrgAgent:像经营公司一样组织你的多智能体系统
  • 2026耐用塑料托盘厂家盘点:立体库塑料托盘厂家+仓储塑料托盘厂家+货架塑料托盘厂家合集 - 栗子测评