51单片机仿真A、B、Z三相编码器的原理与实现

1次阅读
没有评论

共计 1580 个字符,预计需要花费 4 分钟才能阅读完成。

image.webp

背景与痛点

在电机控制、位置检测等嵌入式应用中,旋转编码器是核心传感器。传统硬件编码器虽然可靠,但存在三个明显痛点:

51 单片机仿真 A、B、Z 三相编码器的原理与实现

  • 成本高:光电式编码器价格通常在百元以上,磁编码器也要几十元
  • 体积大:增量式编码器直径普遍超过 30mm,不适合微型设备
  • 布线复杂:ABZ 三相需要 3 根信号线,长距离传输易受干扰

软件仿真方案在 51 单片机上实现成本仅增加不到 5 元(考虑晶振和 GPIO 占用),特别适合对成本敏感的教育、DIY 和小批量项目。

技术原理

正交编码器信号特征

标准增量式编码器输出包含三路信号:

  1. A/ B 相:两路正交方波,相位差 90°
  2. 正转时 A 相领先 B 相 90°
  3. 反转时 B 相领先 A 相 90°
  4. 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
}

关键优化技巧

  1. 防抖处理:在方向判断引脚增加 5ms 软件延时
  2. 相位补偿:根据实测调整 TH0/TL0 初值修正晶振误差
  3. 中断优化 :使用using 1 指定寄存器组减少压栈时间

性能测试

在 STC89C52RC@11.0592MHz 下的实测数据:

参数 测量值
单周期时间 1.002ms
中断响应抖动 ±3μs
最大 PPR 500
功耗增加 8mA@5V

常见问题解决

信号不同步

当 A / B 相出现如下异常时:

  • 相位差偏离 90°超过±15°
  • 脉冲宽度不一致

解决方法:

  1. 检查定时器初值计算是否正确
  2. 确认没有其他中断抢占定时器 0
  3. 降低 PPR(每转脉冲数)值

中断嵌套问题

51 单片机默认不支持中断优先级,需注意:

  • 关闭不必要的中断源
  • ISR 执行时间控制在 20μs 以内
  • 避免在中断内调用复杂函数

扩展应用

步进电机控制

配合常见的 A4988 驱动器时:

// 方向控制示例
void set_direction(bit dir) {
    DIR_PIN = dir;  // 连接驱动器 DIR 引脚
    delay_ms(1);    // 确保建立时间
}

多轴系统

通过分时复用方案,单个定时器可支持 3 轴编码器仿真:

  1. 将定时中断周期缩短为 333μs
  2. 用静态变量区分当前处理的轴
  3. 各轴独立维护状态机

对比 STM32 方案

特性 51 软件仿真 ST32 硬件编码器接口
成本 极低 中等
最高频率 500Hz 10MHz
开发难度 中等 简单
适用场景 低速教学设备 工业伺服系统

动手实验建议

  1. 修改 encoder_step 递增值,观察相位差变化(建议从 45°到 135°阶梯测试)
  2. 尝试在中断服务程序中加入 nop() 指令,模拟高负载场景下的信号畸变
  3. 用示波器的 XY 模式观察 A / B 相信号的李萨如图形

通过这个方案,我们在某物料分拣装置上实现了每轴节省 87 元成本的改进,累计年省采购费用超 2 万元。软件编码器虽不能完全替代硬件方案,但在特定场景下是非常经济的选择。

正文完
 0
评论(没有评论)