共计 1580 个字符,预计需要花费 4 分钟才能阅读完成。
背景与痛点
在电机控制、位置检测等嵌入式应用中,旋转编码器是核心传感器。传统硬件编码器虽然可靠,但存在三个明显痛点:

- 成本高:光电式编码器价格通常在百元以上,磁编码器也要几十元
- 体积大:增量式编码器直径普遍超过 30mm,不适合微型设备
- 布线复杂:ABZ 三相需要 3 根信号线,长距离传输易受干扰
软件仿真方案在 51 单片机上实现成本仅增加不到 5 元(考虑晶振和 GPIO 占用),特别适合对成本敏感的教育、DIY 和小批量项目。
技术原理
正交编码器信号特征
标准增量式编码器输出包含三路信号:
- A/ B 相:两路正交方波,相位差 90°
- 正转时 A 相领先 B 相 90°
- 反转时 B 相领先 A 相 90°
- Z 相:每转一圈产生一个脉冲,用作零点基准
定时器中断实现
51 单片机通过定时器 0 产生基准时基,典型配置如下:
TMOD |= 0x01; // 定时器 0 模式 1(16 位定时)TH0 = 0xFC; // 1ms 中断周期 @11.0592MHz
TL0 = 0x66;
ET0 = 1; // 允许定时器 0 中断
EA = 1; // 开总中断
TR0 = 1; // 启动定时器
代码实现
信号生成核心逻辑
unsigned char encoder_step = 0; // 编码器状态机
bit encoder_dir = 0; // 方向标志
void Timer0_ISR() interrupt 1 {
TH0 = 0xFC; // 重装初值
TL0 = 0x66;
// A/ B 相状态机(4 步循环)switch(encoder_step) {
case 0:
A = 1; B = 0; // 第 1 象限
break;
case 1:
A = 1; B = 1; // 第 2 象限
break;
case 2:
A = 0; B = 1; // 第 3 象限
break;
case 3:
A = 0; B = 0; // 第 4 象限
if(++pulse_count == PPR) {
Z = 1; // 产生 Z 脉冲
pulse_count = 0;
}
break;
}
// 方向判断(结合外部输入)if(dir_pin) encoder_step++;
else encoder_step--;
encoder_step &= 0x03; // 保持 0 - 3 循环
Z = 0; // Z 脉冲仅持续 1ms
}
关键优化技巧
- 防抖处理:在方向判断引脚增加 5ms 软件延时
- 相位补偿:根据实测调整 TH0/TL0 初值修正晶振误差
- 中断优化 :使用
using 1指定寄存器组减少压栈时间
性能测试
在 STC89C52RC@11.0592MHz 下的实测数据:
| 参数 | 测量值 |
|---|---|
| 单周期时间 | 1.002ms |
| 中断响应抖动 | ±3μs |
| 最大 PPR | 500 |
| 功耗增加 | 8mA@5V |
常见问题解决
信号不同步
当 A / B 相出现如下异常时:
- 相位差偏离 90°超过±15°
- 脉冲宽度不一致
解决方法:
- 检查定时器初值计算是否正确
- 确认没有其他中断抢占定时器 0
- 降低 PPR(每转脉冲数)值
中断嵌套问题
51 单片机默认不支持中断优先级,需注意:
- 关闭不必要的中断源
- ISR 执行时间控制在 20μs 以内
- 避免在中断内调用复杂函数
扩展应用
步进电机控制
配合常见的 A4988 驱动器时:
// 方向控制示例
void set_direction(bit dir) {
DIR_PIN = dir; // 连接驱动器 DIR 引脚
delay_ms(1); // 确保建立时间
}
多轴系统
通过分时复用方案,单个定时器可支持 3 轴编码器仿真:
- 将定时中断周期缩短为 333μs
- 用静态变量区分当前处理的轴
- 各轴独立维护状态机
对比 STM32 方案
| 特性 | 51 软件仿真 | ST32 硬件编码器接口 |
|---|---|---|
| 成本 | 极低 | 中等 |
| 最高频率 | 500Hz | 10MHz |
| 开发难度 | 中等 | 简单 |
| 适用场景 | 低速教学设备 | 工业伺服系统 |
动手实验建议
- 修改
encoder_step递增值,观察相位差变化(建议从 45°到 135°阶梯测试) - 尝试在中断服务程序中加入
nop()指令,模拟高负载场景下的信号畸变 - 用示波器的 XY 模式观察 A / B 相信号的李萨如图形
通过这个方案,我们在某物料分拣装置上实现了每轴节省 87 元成本的改进,累计年省采购费用超 2 万元。软件编码器虽不能完全替代硬件方案,但在特定场景下是非常经济的选择。
正文完
