共计 1815 个字符,预计需要花费 5 分钟才能阅读完成。
为什么需要编码器测速
在智能小车、机械臂控制等项目中,精准测量电机转速是实现闭环控制的基础。比如当我们需要让小车保持恒定速度爬坡时,就必须实时获取轮子实际转速,再通过 PID 算法调整 PWM 输出。而霍尔编码器作为性价比最高的转速传感器,成为 Arduino 项目的首选方案。

三种测速方法对比
- 脉冲计数法:
- 优点:实现简单,只需在 loop()中累加脉冲数
-
缺点:会因循环延迟丢失高频脉冲
-
定时器法:
- 优点:利用硬件定时器自动记录时间间隔
-
缺点:需要占用特定定时器资源
-
中断法(推荐方案):
- 优点:实时响应每个脉冲,精度可达±1 RPM
- 缺点:频繁中断可能影响主程序运行
硬件连接指南
以常见的 L298N 驱动板 + 霍尔编码器电机为例:
- 电机电源:L298N 的 12V 和 GND 接电机
- 编码器供电:Arduino 的 5V 和 GND 接编码器
- 信号线:编码器 A 相→D2(外部中断 0),B 相可悬空或接 D3
- 驱动信号:L298N 的 IN1/IN2 接 Arduino PWM 引脚
注:务必给电机电源加装 100μF 电容,防止电火花干扰编码器信号
中断法核心代码实现
// 参数配置
#define ENCODER_PPR 11 // 编码器每转脉冲数
#define WHEEL_DIAMETER 65 // 轮子直径(mm)
volatile long pulseCount = 0;
unsigned long lastTime = 0;
void setup() {Serial.begin(115200);
attachInterrupt(0, countPulse, RISING); // 上升沿触发
}
// 中断服务函数
void countPulse() {
static unsigned long lastIntTime = 0;
// 软件去抖动(间隔 >1ms 才计数)if (micros() - lastIntTime > 1000) {
pulseCount++;
lastIntTime = micros();}
}
void loop() {
// 每 200ms 计算一次转速
if (millis() - lastTime > 200) {noInterrupts(); // 暂停中断防止数据冲突
long currentPulse = pulseCount;
pulseCount = 0; // 重置计数器
interrupts();
// 转速计算(RPM 转 / 分钟)float rpm = (currentPulse * 60.0) / (ENCODER_PPR * 0.2);
// 线速度计算(mm/s)float speed = rpm * 3.14 * WHEEL_DIAMETER / 60;
Serial.print("RPM:");
Serial.print(rpm);
Serial.print("Speed:");
Serial.println(speed);
lastTime = millis();}
}
关键点说明:
volatile关键字确保中断中修改的变量被正确读取- 通过
micros()实现软件去抖动,比硬件滤波电容更灵活 - 转速公式推导:RPM = (脉冲数 × 60) / (PPR × 采样时间秒数)
精度优化实战技巧
采样周期选择
- 高速场景(>100RPM):建议 50-100ms 采样,避免脉冲溢出
- 低速场景(<10RPM):需延长到 500ms-1s,减少量化误差
典型异常波形处理
- 毛刺干扰:示波器会观察到非对称方波,添加 0.1μF 电容到信号线
- 脉冲丢失:检查编码器供电电压是否低于 4.5V
- 周期抖动:通常是机械偏心导致,重新校准电机安装位置
新手常见问题解决方案
- 电源噪声问题:
- 现象:电机启动时计数突然暴增
-
解决:驱动板与 Arduino 共地,编码器电源单独走线
-
机械安装误差:
- 现象:正反转读数不一致
-
解决:使用联轴器代替直接安装,确保同心度
-
中断冲突:
- 现象:舵机控制导致转速读数异常
- 解决:避免在中断函数内调用
delay()或Servo库
进阶扩展方向
完成基础测速后,可以尝试:
- PID 速度闭环 :用
PID_v1库实现自动调速 - 双编码器差速 :结合
Encoder库实现精准转向控制 - 无线传输:通过 HC-05 蓝牙模块上传转速到手机 APP
小技巧:用 Excel 记录转速 -PWM 曲线,能找到电机最高效的工作区间
实测效果验证
使用 200RPM 的测试平台对比:
- 中断法误差:±2RPM
- 脉冲计数法误差:±15RPM(低速时达±30RPM)
当需要更高精度时,推荐使用 STM32 的编码器接口模式,可自动处理 4 倍频计数。
希望这篇指南能帮你避开那些让我熬夜 debug 的坑!如果遇到奇怪现象,记得先用示波器抓信号——这往往是最高效的排查方式。
正文完
