AB相编码器测速原理与实现:从硬件接口到软件滤波全解析

1次阅读
没有评论

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

image.webp

背景痛点

AB 相编码器作为运动控制系统的 ” 眼睛 ”,通过正交脉冲反馈实时位置和速度。但在实际应用中常遇到三大难题:

AB 相编码器测速原理与实现:从硬件接口到软件滤波全解析

  • 信号毛刺 :机械振动或电磁干扰导致脉冲抖动,引发计数器误增 / 误减
  • 高速漏脉冲 :当转速超过中断响应能力时,脉冲被 ” 吞掉 ” 导致速度计算失真
  • 低速方向误判 :在接近零速时,因信号边沿抖动出现错误的转向判断

技术方案对比

硬件计数器模式(推荐)

  1. 优势
  2. 硬件自动处理边沿检测和方向判断
  3. 支持 4 倍频计数(上升沿 + 下降沿均触发)
  4. 不占用 CPU 资源,理论支持更高转速

  5. 局限

  6. 需要特定定时器支持(如 STM32 的 TIM1/TIM2 等)
  7. 无法直接获取速度值,需定期采样计数值

GPIO 中断 + 软件解码

  1. 适用场景
  2. 编码器脉冲频率低于 10kHz
  3. MCU 无专用编码器接口
  4. 需要灵活自定义解码逻辑

  5. 风险点

  6. 高频脉冲导致 CPU 中断风暴
  7. 软件消抖算法增加额外延迟

STM32 硬件实现详解

CubeMX 配置步骤

  1. 打开 TIMx 的 ”Encoder Mode”
  2. 设置 IC1/IC2 映射到对应引脚
  3. 配置滤波器参数(通常 4 - 8 个时钟周期)
  4. 开启计数器溢出中断(可选)

关键配置代码片段:

// TIM2 Encoder Interface Configuration
henc.Instance = TIM2;
henc.Init.Period = 0xFFFF; // 16 位计数器
henc.Init.CounterMode = TIM_COUNTERMODE_UP;
henc.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
HAL_TIM_Encoder_Init(&henc, TIM_ENCODERMODE_TI12); // 双通道模式 

速度计算算法

volatile int32_t g_encoder_count = 0;

// 每 10ms 执行的速度计算任务
void Speed_Calculation(void) {
    static int32_t last_count = 0;
    int32_t delta = g_encoder_count - last_count;
    last_count = g_encoder_count;

    // 公式:速度 (rpm) = (delta*60000)/(ppr* 采样周期 ms)
    float rpm = (delta * 60000.0f) / (ENCODER_PPR * 10);

    // 一阶低通滤波
    static float filtered_rpm = 0;
    filtered_rpm = 0.2f * rpm + 0.8f * filtered_rpm;
}

性能优化关键点

采样周期选择

  • 低速场景 (<100rpm):建议 50-100ms 采样周期
  • 高速场景 (>1000rpm):建议 1 -5ms 采样周期

中断优化

  1. ISR 执行时间应小于脉冲间隔的 1 /3
  2. 避免在中断内进行浮点运算
  3. 关键变量必须加 volatile:
    __attribute__((section(".ramfunc"))) void TIM2_IRQHandler(void) {
        volatile static uint32_t capture;
        // 中断处理代码
    }

常见问题解决方案

信号消抖处理

  • 硬件方案 :在 AB 相线上并联 100pF 电容,串联 100Ω 电阻
  • 软件方案 :连续 3 次采样一致才判定有效边沿

低速方向锁定

// 当速度低于阈值时保持上次方向
if(fabsf(filtered_rpm) < 5.0f) {delta = (last_direction == POSITIVE) ? 1 : -1;
} else {last_direction = (delta > 0) ? POSITIVE : NEGATIVE;
}

中断冲突预防

  1. 编码器中断设为最高优先级
  2. 在速度计算临界区关闭中断:
    __disable_irq();
    // 临界区操作
    __enable_irq();

扩展应用:Z 相零位校准

  1. 配置 Z 相为外部中断
  2. 在中断内重置计数器:
    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {if(GPIO_Pin == Z_PHASE_PIN) {__HAL_TIM_SET_COUNTER(&htim2, 0);
            g_home_position_flag = 1;
        }
    }

实测数据参考

转速 (rpm) 硬件计数误差 软件解码误差
50 ±0.1% ±1.2%
1000 ±0.3% ±5.8%
3000 ±0.5% 脉冲丢失

总结建议

对于大多数工业应用,优先选用硬件编码器接口。当遇到信号质量问题时可结合本文的软硬件抗干扰方案。下一步可研究增量式编码器的动态补偿算法,进一步提升高速场景下的测量精度。

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