AB相增量式霍尔编码器原理与嵌入式系统应用实战

1次阅读
没有评论

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

image.webp

背景痛点

在工业现场应用中,AB 相增量式霍尔编码器经常面临信号抖动和计数丢失的问题。这些问题尤其在电机控制系统中表现得尤为突出,导致位置检测不准确,影响整个系统的控制精度。

AB 相增量式霍尔编码器原理与嵌入式系统应用实战

  • 信号抖动:由于电磁干扰或机械振动,编码器输出的 AB 相信号可能出现毛刺,导致误计数。
  • 计数丢失:高速旋转时,信号边沿过于密集,如果处理不及时,可能导致部分脉冲未被捕获。

这些问题直接影响伺服控制和机器人定位的精度,因此需要从硬件和软件层面加以解决。

技术对比:霍尔编码器 vs. 光电编码器

霍尔编码器和光电编码器是两种常见的增量式编码器,各有优缺点。

  • 霍尔编码器
  • 优点:抗污染能力强,适合粉尘、油污等恶劣环境;结构简单,成本较低;耐振动。
  • 缺点:分辨率通常低于光电编码器。
  • 光电编码器
  • 优点:分辨率高,信号质量好。
  • 缺点:对污染敏感,机械振动可能导致码盘错位。

在工业环境中,霍尔编码器因其鲁棒性成为更优选择。

硬件设计:STM32 接口配置与滤波电路

STM32 定时器编码器模式配置

STM32 的定时器支持编码器接口模式,可直接读取 AB 相信号并自动计算脉冲数和方向。

  1. GPIO 配置
  2. 将 AB 相引脚配置为输入模式,并使能内部上拉电阻。
  3. 设置输入滤波时间(如设置 GPIOx->PUPDRGPIOx->OTYPER寄存器)。

  4. 定时器编码器模式

  5. 选择编码器模式(如 TIM_EncoderInterfaceConfig 函数)。
  6. 设置计数方向(通常为TIM_EncoderMode_TI12,支持 4 倍频计数)。

滤波电路设计

为减少信号噪声,可在 AB 相输入引脚前添加 RC 低通滤波电路:

  • 推荐参数:R=1kΩ,C=100nF,截止频率约 1.6kHz。
  • 示意图
     A 相 ——[1kΩ]——+—— STM32_GPIO
                 |
                [100nF]
                 |
                GND

核心算法:信号解码与方向判定

正交信号解码(4 倍频计数)

利用 STM32 的硬件编码器接口可直接实现 4 倍频计数,无需软件干预。若需软件解码,可参考以下逻辑:

// AB 相状态变化表(4 倍频计数)const int16_t encoder_states[] = {0, -1, 1, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 1, -1, 0};

void EXTI_IRQHandler(void) {
    static uint8_t prev_state = 0;
    uint8_t current_state = (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) << 1) | GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1);
    uint8_t state_change = (prev_state << 2) | current_state;
    position += encoder_states[state_change];
    prev_state = current_state;
}

方向判定状态机

方向可通过 AB 相的相位关系判断:

  • A 相上升沿时,若 B 相为低电平,则为正向;若 B 相为高电平,则为反向。
  • 类似逻辑适用于其他边沿。

抗干扰措施

软件消抖算法

在中断服务程序中添加时间窗口滤波:

#define DEBOUNCE_TIME_MS 20

void EXTI_IRQHandler(void) {
    static uint32_t last_time = 0;
    uint32_t current_time = HAL_GetTick();
    if (current_time - last_time < DEBOUNCE_TIME_MS) {return; // 忽略短时间内的多次触发}
    last_time = current_time;
    // 正常处理逻辑
}

异常脉冲过滤

设置最小脉冲宽度阈值,忽略过窄的脉冲(可能是噪声):

#define MIN_PULSE_WIDTH_US 50

// 在捕获中断中检查脉冲宽度
if (pulse_width < MIN_PULSE_WIDTH_US) {return; // 忽略异常脉冲}

生产实践

计数准确性测试

在不同转速下测试计数准确性,记录数据:

转速 (RPM) 理论脉冲数 实际脉冲数 误差率
100 4000 3998 0.05%
500 20000 19990 0.05%
1000 40000 39950 0.125%

累计误差补偿

长期运行可能导致误差累积,可通过以下方法补偿:

  • 定期校准(如通过外部参考信号)。
  • 使用高精度时钟源减少时间测量误差。

避坑指南

中断服务程序优化

  1. 减少中断服务程序中的计算量:仅记录事件,主循环中处理数据。
  2. 使用 DMA 传输:若支持,用 DMA 自动读取定时器计数值。
  3. 优先级管理:确保编码器中断优先级高于非实时任务。

电源噪声解决方案

  • 添加 LC 滤波电路到编码器电源。
  • 使用线性稳压器(如 LDO)而非开关电源供电。

延伸思考

  1. 移植到 ESP32:ESP32 的 PCNT 模块可直接用于编码器计数,但需注意其最高计数频率限制。
  2. 多编码器同步采集:使用多定时器或 FPGA 实现多路编码器数据的同步读取。

总结

霍尔编码器在恶劣环境下表现优异,通过合理的硬件设计和软件处理,可显著提升信号质量。本文提供的方案已在工业伺服系统中验证,读者可根据实际需求调整参数,并尝试扩展到其他平台。

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