51单片机编码器测转速:从硬件连接到软件滤波的实战指南

1次阅读
没有评论

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

image.webp

背景痛点

在电机控制项目中,使用 51 单片机测量转速时,开发者常遇到两个典型问题:

  • 信号抖动问题:编码器输出的方波信号在边沿处会产生高频振荡,导致单片机误判脉冲数量。这种抖动在低速时尤为明显,可能造成±5% 以上的计数误差。

  • 低速分辨率不足:当电机转速低于 100RPM 时,单位时间内捕获的脉冲数过少,常规的定时采样法会产生较大量化误差。例如,100PPR 编码器在 50RPM 时,每秒仅能捕获 83 个脉冲。

硬件设计

1. 接口电路设计

增量式编码器输出通常需要以下处理:

  1. 上拉电阻配置:A/ B 相各接 10kΩ 上拉电阻至 VCC,确保信号线在悬空时有确定电平
  2. 光耦隔离电路(推荐型号 TLP521-4):
  3. 在工业环境或大功率电机应用中必须添加
  4. 可有效阻断地环路干扰和高压串扰
  5. 施密特触发器整形(如 74HC14):
  6. 对输入信号进行迟滞比较
  7. 典型阈值设置: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

中断优化技巧

  1. 使用 static 变量存储临时数据,减少栈操作
  2. 避免在中断内进行浮点运算
  3. 标志位检查法替代长耗时操作:
    if(newDataFlag) {
        newDataFlag = 0;
        // 移至主循环处理
    }

避坑指南

电磁干扰防护三要素

  1. 编码器电缆使用双绞屏蔽线,屏蔽层单端接地
  2. 电源走线宽度≥0.3mm,必要时开窗加锡
  3. 模拟地与数字地通过 0Ω 电阻单点连接

PPR 参数校准方法

  1. 标记电机轴位置
  2. 手动旋转电机完整一圈
  3. 记录脉冲计数器值即为实际 PPR
  4. 重复 3 次取平均值

延伸思考

双向测量实现

通过判断 A / B 相信号相位差:

if(ENCODER_A == 0 && ENCODER_B == 1) {forwardCount++;} else if(ENCODER_A == 0 && ENCODER_B == 0) {reverseCount++;}

超高速解决方案

当转速超过单片机中断响应能力时:

  1. 改用硬件计数器模式(如 STC15 系列的 PCA 模块)
  2. 增加分频电路降低输入脉冲频率
  3. 选用带正交解码功能的增强型 51 内核(如 STC8H 系列)

实测数据

51 单片机编码器测转速:从硬件连接到软件滤波的实战指南

上图为 1000RPM 时的实测波形,可见经过滤波后的转速波动控制在±1.5% 以内。

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

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