共计 1895 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
在电机控制项目中,使用 51 单片机测量转速时,开发者常遇到两个典型问题:
-
信号抖动问题:编码器输出的方波信号在边沿处会产生高频振荡,导致单片机误判脉冲数量。这种抖动在低速时尤为明显,可能造成±5% 以上的计数误差。
-
低速分辨率不足:当电机转速低于 100RPM 时,单位时间内捕获的脉冲数过少,常规的定时采样法会产生较大量化误差。例如,100PPR 编码器在 50RPM 时,每秒仅能捕获 83 个脉冲。
硬件设计
1. 接口电路设计
增量式编码器输出通常需要以下处理:
- 上拉电阻配置:A/ B 相各接 10kΩ 上拉电阻至 VCC,确保信号线在悬空时有确定电平
- 光耦隔离电路(推荐型号 TLP521-4):
- 在工业环境或大功率电机应用中必须添加
- 可有效阻断地环路干扰和高压串扰
- 施密特触发器整形(如 74HC14):
- 对输入信号进行迟滞比较
- 典型阈值设置:VCC=5V 时,正向阈值 2.9V,负向阈值 2.1V
2. PCB 布局要点
- 将编码器接口电路靠近单片机引脚放置
- 信号线走等长差分对(A/ B 相长度差 <5mm)
- 在电源入口处并联 100nF+10μF 去耦电容组合
软件实现
1. 中断服务程序
// Timer1 配置为 16 位自动重装模式
TMOD |= 0x10; // 设置 T1 为模式 1
TH1 = 0xFC; // 1ms 定时初值(12MHz 晶振)
TL1 = 0x18;
ET1 = 1; // 使能定时器中断
TR1 = 1; // 启动定时器
// 外部中断 0 配置为下降沿触发
IT0 = 1;
EX0 = 1;
EA = 1;
volatile unsigned long pulseCount = 0;
void EX0_ISR() interrupt 0 {pulseCount++; // 每个下降沿计数}
2. 移动平均滤波算法
#define FILTER_WINDOW 10
unsigned int speedBuffer[FILTER_WINDOW];
unsigned char bufIndex = 0;
unsigned int getFilteredSpeed() {
static unsigned int lastSpeed = 0;
unsigned int sum = 0;
// 计算最新速度值(脉冲数 / 时间)unsigned int currentSpeed = (pulseCount * 60000) / (encoderPPR * sampleTimeMs);
pulseCount = 0;
// 更新滑动窗口
speedBuffer[bufIndex] = currentSpeed;
bufIndex = (bufIndex + 1) % FILTER_WINDOW;
// 计算窗口平均值
for(unsigned char i=0; i<FILTER_WINDOW; i++) {sum += speedBuffer[i];
}
return sum / FILTER_WINDOW;
}
3. 转速计算公式推导
对于 PPR(每转脉冲数)为 N 的编码器:
RPM = (脉冲数 × 60000) / (N × 采样时间 ms)
例如:
– 100PPR 编码器
– 1 秒内捕获 2000 个脉冲
– 转速 = (2000×60000)/(100×1000) = 1200RPM
性能优化
窗口大小选择经验
| 转速范围(RPM) | 推荐窗口大小 | 响应延迟(ms) |
|---|---|---|
| <100 | 15-20 | 300-400 |
| 100-1000 | 8-12 | 100-150 |
| >1000 | 5-6 | 50-60 |
中断优化技巧
- 使用
static变量存储临时数据,减少栈操作 - 避免在中断内进行浮点运算
- 标志位检查法替代长耗时操作:
if(newDataFlag) { newDataFlag = 0; // 移至主循环处理 }
避坑指南
电磁干扰防护三要素
- 编码器电缆使用双绞屏蔽线,屏蔽层单端接地
- 电源走线宽度≥0.3mm,必要时开窗加锡
- 模拟地与数字地通过 0Ω 电阻单点连接
PPR 参数校准方法
- 标记电机轴位置
- 手动旋转电机完整一圈
- 记录脉冲计数器值即为实际 PPR
- 重复 3 次取平均值
延伸思考
双向测量实现
通过判断 A / B 相信号相位差:
if(ENCODER_A == 0 && ENCODER_B == 1) {forwardCount++;} else if(ENCODER_A == 0 && ENCODER_B == 0) {reverseCount++;}
超高速解决方案
当转速超过单片机中断响应能力时:
- 改用硬件计数器模式(如 STC15 系列的 PCA 模块)
- 增加分频电路降低输入脉冲频率
- 选用带正交解码功能的增强型 51 内核(如 STC8H 系列)
实测数据

上图为 1000RPM 时的实测波形,可见经过滤波后的转速波动控制在±1.5% 以内。
通过本文介绍的方法,在 12MHz 的 STC89C52 上实现了 30-3000RPM 范围内的稳定测量,满足大多数直流电机控制需求。实际项目中可根据具体编码器类型和电机特性调整滤波参数,在响应速度和稳定性之间取得平衡。
正文完
