news 2026/5/3 6:08:38

从光栅盘到数字信号:手把手拆解增量式编码器,并用Arduino做个转速计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从光栅盘到数字信号:手把手拆解增量式编码器,并用Arduino做个转速计

从光栅盘到数字信号:手把手拆解增量式编码器,并用Arduino做个转速计

在工业自动化和机器人控制领域,编码器如同设备的"眼睛",将机械运动转化为电子系统能理解的数字信号。增量式编码器因其结构简单、成本低廉且性能可靠,成为DIY爱好者和工程师最常接触的传感器类型之一。本文将带您深入理解这种精巧装置的工作原理,并完成一个实用的Arduino转速测量项目。

1. 增量式编码器的机械解剖

拆开一个典型的欧姆龙E6B2系列编码器外壳,内部结构主要由三部分组成:光栅盘光电耦合器组信号处理电路。光栅盘通常由玻璃或聚碳酸酯制成,上面刻有精确等距的透光条纹。以E6B2-CWZ6C为例,其光栅盘刻有360个条纹,意味着每转可产生360个脉冲。

光电检测装置包含至少两组红外LED和光敏晶体管,它们以特定角度排列:

[LED] → [光栅盘] → [光敏晶体管A] ↘ [光敏晶体管B]

当光栅盘旋转时,光线被周期性遮挡,产生两路相位差90°的方波信号。这种设计巧妙之处在于:

  • A相和B相的相位关系决定了旋转方向
  • 脉冲频率直接对应转速信息
  • Z相(零位信号)提供绝对位置参考

2. 电气接口与信号解读

常见增量式编码器采用5V或24V供电,输出信号通常有三种接口形式:

接口类型信号特点传输距离典型应用场景
TTL5V电平,A/B/Z三路≤5米实验室环境
HTL24V电平,抗干扰更强≤100米工业现场
差分驱动RS422标准,A+/A-等对称≤300米高噪声环境

使用示波器观察旋转时的输出信号,可以看到:

A相: _|‾|_|‾|_|‾|_|‾ B相: _|‾|_|‾|_|‾|_|‾ ↑ A相领先表示顺时针旋转 ↓ B相领先表示逆时针旋转

方向判断逻辑

  • 当A相上升沿时检测B相电平:高→正转,低→反转
  • 或使用XOR门电路:A⊕B=正转脉冲,A⊕B'=反转脉冲

3. Arduino硬件连接实战

准备材料清单:

  • Arduino Uno开发板
  • E6B2-CWZ6C编码器(5V供电)
  • 10kΩ上拉电阻×3
  • 0.1μF去耦电容
  • 面包板和跳线

接线示意图:

编码器 Arduino ----------------- V+ → 5V GND → GND A → D2(外部中断0) B → D3(外部中断1) Z → D4(可选)

注意:工业编码器输出通常是开集电极形式,需加上拉电阻。若使用带推挽输出的编码器模块,则可省略上拉电阻。

消抖电路设计建议:

A相 → 10kΩ → Arduino ↑ 100nF → GND

4. 转速测量算法实现

转速计算的核心公式:

RPM = (脉冲数 × 60) / (编码器线数 × 采样周期)

Arduino代码框架:

volatile long pulseCount = 0; unsigned long lastTime = 0; const int PPR = 360; // 每转脉冲数 void setup() { Serial.begin(115200); attachInterrupt(0, countPulse, RISING); // D2接A相 } void loop() { if(millis() - lastTime > 100) { // 每100ms计算一次 noInterrupts(); long currentCount = pulseCount; pulseCount = 0; interrupts(); float rpm = (currentCount * 60.0) / (PPR * 0.1); Serial.print("RPM: "); Serial.println(rpm); lastTime = millis(); } } void countPulse() { if(digitalRead(3)) pulseCount++; // B相高电平 else pulseCount--; // B相低电平 }

性能优化技巧

  1. 使用硬件中断而非轮询,确保不丢失脉冲
  2. 采用环形缓冲区存储多次测量结果进行滑动平均
  3. 对于高速测量,启用输入捕获功能精确记录边沿时间
  4. 启用Arduino的输入去抖功能:EICRA |= (1 << ISC00)

5. 进阶功能扩展

5.1 零位校准系统

利用Z相实现自动校准:

void setup() { pinMode(4, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(4), zeroCalibrate, FALLING); } void zeroCalibrate() { pulseCount = 0; // 重置计数器 Serial.println("Zero position detected"); }

5.2 四倍频技术提升分辨率

通过检测A、B相的上升沿和下降沿,将分辨率提高4倍:

void countPulse() { static byte lastAB = 0; byte currentAB = (digitalRead(2) << 1) | digitalRead(3); switch(lastAB << 2 | currentAB) { case 0b0001: case 0b0111: case 0b1110: case 0b1000: pulseCount++; break; case 0b0010: case 0b1011: case 0b1101: case 0b0100: pulseCount--; break; } lastAB = currentAB; }

5.3 通过I2C LCD显示实时数据

连接1602 LCD显示屏显示测量结果:

#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); void setup() { lcd.init(); lcd.backlight(); } void loop() { lcd.setCursor(0,0); lcd.print("Speed:"); lcd.setCursor(7,0); lcd.print(rpm); lcd.setCursor(12,0); lcd.print("RPM"); }

6. 常见问题排查指南

当遇到信号不稳定或计数不准时,可按以下步骤诊断:

  1. 电源检查

    • 测量编码器供电电压应在4.75-5.25V范围
    • 示波器观察电源纹波应<50mV
  2. 信号完整性测试

    # 使用Arduino作为简易逻辑分析仪 void setup() { Serial.begin(250000); } void loop() { Serial.write(PIND); // 直接读取D0-D7状态 delayMicroseconds(10); }

    将输出数据导入串口绘图工具观察波形

  3. 机械安装问题

    • 检查联轴器是否同心,径向偏差应<0.1mm
    • 确保轴系无轴向窜动
    • 过大的振动会导致脉冲抖动
  4. 软件滤波方案

    // 移动平均滤波实现 #define FILTER_SIZE 5 float rpmBuffer[FILTER_SIZE]; byte filterIndex = 0; float filteredRPM(float newRPM) { rpmBuffer[filterIndex] = newRPM; filterIndex = (filterIndex + 1) % FILTER_SIZE; float sum = 0; for(byte i=0; i<FILTER_SIZE; i++) { sum += rpmBuffer[i]; } return sum / FILTER_SIZE; }

在实际项目中,我曾遇到一个棘手案例:当电机启动瞬间,转速显示会出现剧烈波动。后来发现是电源地线环路导致,通过在编码器电源端增加磁珠滤波,并将信号地单点接入系统,问题得到完美解决。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 6:05:35

AI辅助开发时代的安全基线模板:从零构建生产就绪的代码仓库

1. 项目概述&#xff1a;一个为AI辅助开发时代量身定制的安全基线模板 如果你是一名独立开发者、创业团队的早期成员&#xff0c;或者正在利用AI工具&#xff08;比如Claude Code、Cursor、Copilot&#xff09;来加速你的编码过程&#xff0c;那么你一定遇到过这样的困境&…

作者头像 李华
网站建设 2026/5/3 6:04:30

Arm虚拟化VGIC架构与调试实战指南

1. VGIC组件架构与调试价值虚拟通用中断控制器(Virtual Generic Interrupt Controller, VGIC)是Arm架构中实现硬件辅助虚拟化的关键模块。在典型的虚拟化场景中&#xff0c;物理中断需要经过两次路由&#xff1a;首先由Host系统的物理GIC处理&#xff0c;然后由VGIC完成虚拟机的…

作者头像 李华
网站建设 2026/5/3 5:49:51

QueryExcel:10分钟搞定100个Excel文件,批量查询神器让效率提升10倍

QueryExcel&#xff1a;10分钟搞定100个Excel文件&#xff0c;批量查询神器让效率提升10倍 【免费下载链接】QueryExcel 多Excel文件内容查询工具。 项目地址: https://gitcode.com/gh_mirrors/qu/QueryExcel 在数据驱动的现代办公中&#xff0c;Excel文件已成为信息存储…

作者头像 李华
网站建设 2026/5/3 5:48:49

2026届最火的五大AI科研网站实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 被作为人工智能技术关键应用的AI写作软件&#xff0c;业已大范围融入内容创作范畴&#xff0…

作者头像 李华
网站建设 2026/5/3 5:47:13

PatchTST模型调参保姆级指南:从Exchange数据集到你的业务数据

PatchTST模型调参保姆级指南&#xff1a;从Exchange数据集到你的业务数据 当你在深夜盯着屏幕上跳动的预测曲线&#xff0c;反复调整参数却始终无法突破某个准确率阈值时&#xff0c;是否想过那些论文里光鲜的基准结果究竟是如何复现的&#xff1f;作为算法工程师&#xff0c;我…

作者头像 李华