亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 工业技术

Arduino旋转编码器完全指南:原理、类型选型、接线与三大实战项目

旋转编码器:精准运动控制的“数字罗盘”

旋转编码器将机械角位移转换为数字脉冲序列,是CNC机床、机器人关节、3D打印机、仪表调节旋钮、音量控制、电机闭环控制的核心反馈器件。本文系统讲解**增量式/绝对值式原理、四大选型维度、正交解码算法、Arduino/ESP32/STM32实战代码、三大典型项目**,助您从“能转动”进阶到“精准控制”。

核心分类:增量式 vs 绝对值式

维度增量式绝对值式
输出信号A/B两路正交方波(90°相位差) + 可选Z相零位多位并行/串行(SSI/BiSS/EnDat) Gray码/二进制码
掉电记忆❌ 丢失位置,上电需回零✅ 保持绝对位置,无需回零
分辨率每转脉冲数(PPR):100-10000+位数:10-23位 (单圈/多圈)
速度测量✅ 天然适合(频率=速度)需差分计算或专用寄存器
抗干扰/可靠性脉冲丢失导致累计误差单次读取即得真值,抗干扰强
成本/接口低/简单(3-5线)高/复杂(串行总线/并行)
典型应用电机闭环、手轮、旋钮、传送带测速机器人关节、CNC主轴、航天航海、医疗手术机械

Maker/教学/中小项目 90%场景选增量式(EC11、PEC11、600P/R光电式)**;高可靠、多圈、免回零选绝对值式。

增量式编码器核心参数与选型指南

参数说明选型建议
PPR (Pulses Per Revolution)每转输出脉冲数。倍频后分辨率 = PPR × 4 (四倍频)手调旋钮: 20-30 PPR;电机闭环: 100-2500 PPR;高精密: 5000+ PPR
输出类型开集电极(OC/NPN/PNP)、推挽(TTL/HTL)、线驱动(RS422/RS485)MCU直驱选推挽/OC+上拉;长距离/抗干扰选线驱动
供电电压5V / 12-24V / 宽压5-30V匹配系统电压,OC输出需外部上拉至MCU VCC
最大响应频率fmax = (RPMmax/60) × PPR × 4 (四倍频)选型留余量2倍:fmax > 2 × 计算值。典型: 100kHz-1MHz
轴型式实心轴(Φ4/6/8/10mm)、空心轴(Φ6/8/10/12mm, 套轴)直连电机轴选实心;穿轴/中空电机选空心
防护等级IP40/IP50/IP52/IP64/IP67含油/水/粉尘环境选IP64+;洁净室IP40可
启动扭矩机械阻尼,影响手感/低速启动手调旋钮选<5mN·m;电机直连<20mN·m

正交解码算法:从脉冲到位置/速度/方向

A/B相位关系与状态机


顺时针 (CW) :  A相超前B相90°
  A: ┌───┐   ┌───┐   ┌───┐
  B:     ┌───┐   ┌───┐   ┌───
状态序列: 00 → 10 → 11 → 01 → 00 (每周期4状态, 计数+1)

逆时针 (CCW): B相超前A相90°
状态序列: 00 → 01 → 11 → 10 → 00 (每周期4状态, 计数-1)

四种解码实现方式 (性能递增)

  1. 轮询单边沿 (最简,易丢脉冲): 仅检测A相上升沿,读B相电平判方向。仅适用极低速/手动旋钮。
  2. 中断双边沿 (2倍频): A相上升/下降沿触发中断,读B相。适合中低速(~5kHz)。
  3. 双通道中断四倍频 (推荐): A/B相均接中断引脚,**任意边沿触发**,查表法/状态机更新计数,**零丢脉冲、最高分辨率**。
  4. 硬件编码器接口 (STM32/ESP32/高端AVR): 专用定时器模式(Encoder Mode),**零CPU占用、硬件级抗干扰、支持索引复位**,工业级首选。

Arduino软件四倍频查表法 (通用、高效)


// 状态查表: 旧状态<<2 | 新状态 → 增量 (-1,0,+1)
const int8_t ENC_TABLE[16] = {
  0, -1, 1, 0,   // 00→00,01,10,11
  1, 0, 0, -1,   // 01→00,01,10,11
  -1, 0, 0, 1,   // 10→00,01,10,11
  0, 1, -1, 0    // 11→00,01,10,11
};

volatile long encCount = 0;
uint8_t encPrevState = 0;

void encoderISR() {
  uint8_t cur = (digitalRead(PIN_A) << 1) | digitalRead(PIN_B);
  encCount += ENC_TABLE[(encPrevState << 2) | cur];
  encPrevState = cur;
}

void setup() {
  pinMode(PIN_A, INPUT_PULLUP);
  pinMode(PIN_B, INPUT_PULLUP);
  encPrevState = (digitalRead(PIN_A) << 1) | digitalRead(PIN_B);
  attachInterrupt(digitalPinToInterrupt(PIN_A), encoderISR, CHANGE);
  attachInterrupt(digitalPinToInterrupt(PIN_B), encoderISR, CHANGE);
}

Arduino常见编码器模组接线

模组类型引脚Arduino Uno接法备注
EC11机械增量式 (带按键)CLK, DT, SW, +, GNDCLK→D2(中断), DT→D3(中断), SW→D4(上拉), +→5V, GND→GND需软件/硬件消抖(10ms/0.1μF)
光电增量式 (600PPR+)A, B, Z, VCC, GNDA→D2, B→D3, Z→D4(零位), VCC→5V, GND→GND推挽输出直驱,无需上拉
磁编码器 AS5600 (绝对值, I2C)SDA, SCL, VCC, GND, DIRI2C总线(0x36), DIR悬空/接GND12位分辨率(4096/圈), 无需中断
磁编码器 AS5048A (绝对值, SPI)CS, CLK, MISO, MOSI, VCC, GNDSPI模式0, 14位分辨率(16384/圈)高速、抗磁、适合电机FOC

三大实战项目完整教程

项目一:旋钮菜单控制器 (EC11 + OLED + 蜂鸣器)

功能: 旋转浏览菜单项,按下进入/确认,长按返回,蜂鸣器反馈。
核心逻辑: 编码器计数映射菜单索引,按键状态机(短按/长按/双击)。


#include 
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);

const char* menu[] = {"LED亮度", "风扇转速", "定时关机", "系统设置", "关于"};
uint8_t menuIdx = 0, itemCount = 5;
bool inEdit = false;
int editValue = 0;

void drawMenu() {
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_ncenB08_tr);
  for (int i=0; i ");
    u8g2.drawStr(12, 12+i*12, menu[i]);
    if (inEdit && i==menuIdx) { u8g2.setCursor(80, 12+i*12); u8g2.print(editValue); }
  }
  u8g2.sendBuffer();
}

void loop() {
  // 编码器处理 (见前文ISR, encCount变化)
  static long lastCount = 0;
  if (encCount != lastCount) {
    if (inEdit) editValue += (encCount - lastCount) * 5;
    else menuIdx = (menuIdx + (encCount - lastCount) + itemCount) % itemCount;
    lastCount = encCount;
    drawMenu();
  }
  // 按键处理 (消抖+状态机略)
}

项目二:步进电机闭环位置控制 (光电编码器 + A4988/TMC2209)

架构: Arduino/ESP32 发脉冲驱动驱动器 → 电机转动 → 编码器反馈位置 → PID计算误差 → 修正脉冲频率/方向 → 闭环跟踪。
关键点: 编码器分辨率 ≥ 电机步距×细分(如200步×16细分=3200/圈);PID周期≥1kHz;防抖/滤波。

项目三:舵机/机械臂关节精准定位 (AS5600磁编码器 + STM32/ESP32)

优势: 绝对值上电即知角度、免回零、I2C/SPI读取、12/14位分辨率(0.088°/0.022°)、抗震动/油污。
FOC算法集成: SimpleFOC库原生支持AS5600/AS5048A/MT6701,配合BLDC/步进驱动器实现扭矩/速度/位置三环控制。


// SimpleFOC + AS5600 位置闭环示例
#include 
MagneticSensorI2C sensor = MagneticSensorI2C(AS5600_I2C);
BLDCMotor motor = BLDCMotor(7); // 7极对数
BLDCDriver3PWM driver = BLDCDriver3PWM(9, 5, 6, 8); // PWM引脚

void setup() {
  sensor.init();
  motor.linkSensor(&sensor);
  driver.voltage_power_supply = 12;
  driver.init();
  motor.linkDriver(&driver);
  motor.controller = MotionControlType::angle;
  motor.P_velocity = 0.2; motor.I_velocity = 2; motor.D_velocity = 0;
  motor.P_angle = 20; motor.velocity_limit = 50;
  motor.init(); motor.initFOC();
}

void loop() {
  motor.loopFOC();
  motor.move(3.14); // 目标位置: 180° (rad)
}

常见问题与调试技巧

现象排查方向
计数抖动/倒退1.机械编码器消抖(硬件RC/软件10ms) 2.上拉电阻缺失/过大 3.线路干扰(屏蔽线/差分) 4.中断优先级过低被打断
高速丢脉冲1.超出MCU中断响应极限(换硬件编码器接口/更高主频) 2.编码器最大响应频率不足 3.软件查表法未原子操作(关中断保护)
方向判断反1.A/B相接反 2.查表符号错 3.机械安装方向相反
零位Z相不准1.Z相宽度窄(需硬件锁存/高速中断) 2.机械装配同心度差 3.每圈多个Z相(检查规格书)
绝对值编码器读数跳变1.I2C/SPI通信错误(校验和/重试) 2.磁场干扰(屏蔽/距离) 3.供电纹波大 4.未等待转换完成读取

进阶:从增量式到绝对值式的架构升级

当项目出现以下信号时,考虑升级绝对值编码器:

推荐升级路径:EC11机械 → 光电增量式(600-2500PPR) → AS5600磁式绝对值(单圈) → AS5048A/MA732/MT6701高精磁式/光电绝对值 → 工业级多圈绝对值(如海德汉、倍加福、倍加福)。

结语

旋转编码器是运动控制的“眼睛”。**增量式靠积分,绝对值靠读取**;**软件解码靠中断,硬件解码靠外设**;**机械式靠消抖,光电/磁式靠物理特性**。选对类型、接对引脚、写对解码、调对PID、装对机械,您的电机、机械臂、CNC、旋钮才能实现“所想即所得”的精准控制。如需编码器选型计算表、SimpleFOC参数整定指南、工业级绝对值编码器接线手册,欢迎联系我们运动控制技术团队。

工业技术

  1. 编码器维修减少停机的6大专业技巧
  2. Arduino Nano飞行模拟2020控制面板——LCD与CDI显示
  3. Arduino 飞行模拟器 2020 实体开关面板
  4. Arduino Mega 按键 PWM 调光:三阶段渐变 LED 实战教程
  5. 基于 Arduino 与 Python 的可靠 RFID 考勤系统
  6. 自制高精度测距轮:Arduino Nano + 旋转编码器 + 1602 LCD
  7. MAX30100脉搏血氧传感器与Arduino接入指南:获取PPG波形与SpO2
  8. 分步指南:将 YL-39/YL-69 土壤湿度传感器连接到 Arduino UNO
  9. DIY Arduino 蟑螂控制系统 —— 30 美元以内自制指南
  10. 选择合适编码器:通信协议与应用考量深度解析
  11. 海德汉高精度旋转编码器助力机器人精度提升 80%
  12. 优化机箱散热:冲孔钣金实现高效通风的经济之选