AB相旋转编码器AD接法详解:从信号采集到抗干扰设计

1次阅读
没有评论

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

image.webp

背景与痛点

AB 相旋转编码器是伺服控制系统中至关重要的反馈元件,它通过两路相位差 90°的方波信号(A 相和 B 相)来精确检测电机转子的位置和速度。在工业自动化、机器人、CNC 机床等领域,AB 相编码器的稳定性和精度直接决定了整个系统的控制性能。

AB 相旋转编码器 AD 接法详解:从信号采集到抗干扰设计

然而,在实际工业现场应用中,我们经常会遇到以下典型问题:

  • 长线传输干扰:编码器与控制器之间距离较远时,信号容易受到电磁干扰(EMI)影响
  • 电源噪声:工业现场电源波动大,可能导致信号畸变或基准电平偏移
  • 机械振动:电机运行时产生的振动会引起编码器信号相位抖动
  • 接地环路:不合理的接地方式会引入共模噪声

硬件设计

差分接收 vs 单端接法

AB 相编码器的信号传输主要有两种方式:

  1. 差分接收(推荐):使用 AM26LS32 等差分接收器芯片,通过双绞线传输差分信号
  2. 优点:抗干扰能力强,适合长距离传输(可达 15 米)
  3. 缺点:需要额外芯片,成本略高

  4. 单端接法:直接连接编码器输出到 MCU

  5. 优点:电路简单,成本低
  6. 缺点:抗干扰能力弱,传输距离短(通常 <1 米)

带 ESD 保护的典型电路

以下是一个经过生产验证的硬件电路设计(以 A 相信号为例):

 编码器 A + —— 120Ω ——+—— 100nF —— GND
            |        |
           47pF     100Ω —— AM26LS32 —— STM32
            |        |
编码器 A - —— 120Ω ——+—— 100nF —— GND

关键参数说明:

  • 120Ω 终端电阻:匹配电缆特性阻抗(通常双绞线阻抗为 120Ω)
  • 100nF 电容:低通滤波,截止频率 f =1/(2πRC)≈13kHz
  • 47pF 电容:高频噪声抑制
  • 100Ω 电阻:限流保护

线缆与接地

  • 必须使用屏蔽双绞线,屏蔽层单端接地(控制器侧)
  • 信号地与电源地通过 0Ω 电阻或磁珠隔离
  • 避免形成接地环路

软件处理

STM32 定时器正交解码配置

以下是使用 STM32 HAL 库配置定时器正交解码模式的示例代码:

// 定时器初始化
TIM_Encoder_InitTypeDef encoderConfig = {0};
encoderConfig.EncoderMode = TIM_ENCODERMODE_TI12; // AB 相正交模式
encoderConfig.IC1Polarity = TIM_ICPOLARITY_RISING; // A 相上升沿有效
encoderConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI; // A 相直接输入
encoderConfig.IC1Prescaler = TIM_ICPSC_DIV1; // 无分频
encoderConfig.IC1Filter = 0x0F; // 数字滤波 (16 个时钟周期)

// B 相配置 (同上)
encoderConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
encoderConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
encoderConfig.IC2Prescaler = TIM_ICPSC_DIV1;
encoderConfig.IC2Filter = 0x0F;

HAL_TIM_Encoder_Init(&htim3, &encoderConfig);
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);

四倍频计数算法

通过检测 AB 相的边沿变化,可以实现 4 倍频计数(每个周期 4 个计数点),显著提高分辨率。以下是状态机实现:

 状态转换表:当前状态 | A 相边沿 | B 相边沿 | 动作       | 新状态
---------|--------|--------|-----------|-------
S0       | ↑      | -      | 计数 +1    | S1
S0       | -      | ↑      | 计数 -1    | S3
S1       | -      | ↑      | 计数 +1    | S2
S1       | ↓      | -      | 计数 -1    | S0
...(完整状态机省略)

数字滤波算法

结合移动平均和异常值剔除,可以有效滤除信号抖动:

#define FILTER_WINDOW 5

int32_t filterEncoderValue(int32_t rawValue) {static int32_t buffer[FILTER_WINDOW] = {0};
    static uint8_t index = 0;
    static int32_t sum = 0;

    // 移除最旧数据
    sum -= buffer[index];

    // 异常值检测(变化量超过阈值视为异常)if(abs(rawValue - buffer[(index+FILTER_WINDOW-1)%FILTER_WINDOW]) > MAX_DELTA) {rawValue = buffer[(index+FILTER_WINDOW-1)%FILTER_WINDOW];
    }

    // 添加新数据
    buffer[index] = rawValue;
    sum += rawValue;
    index = (index + 1) % FILTER_WINDOW;

    return sum / FILTER_WINDOW;
}

避坑指南

接地隔离方案

  • 使用磁珠或 0Ω 电阻隔离编码器电源地与数字地
  • 屏蔽层接机壳地,不要接信号地

上电延迟设计

为避免上电瞬间信号不稳定导致误计数,建议添加硬件互锁:

MCU_IO —— 10kΩ ——+—— 100μF —— GND
                 |
                NPN —— 继电器控制编码器电源 

500ms 延迟计算公式:t=R×C=10kΩ×100μF=1s(实际约 500ms 达到导通阈值)

相位差补偿

当 AB 相信号相位差偏离 90°时,可通过软件补偿:

// 测量 A 相上升沿到 B 相边沿的时间差
float phaseError = measurePhaseError(); 

// 在速度计算时补偿
float speed = (counts + phaseError*0.25) / timeInterval;

验证环节

波形对比

使用逻辑分析仪捕获的典型波形:

  • 正常信号:AB 相严格正交,边沿清晰
  • 干扰信号:可见明显的抖动和毛刺

误差率测试

在某 CNC 机床上的实测数据:

转速 (RPM) 无滤波误差率 有滤波误差率
500 0.12% 0.02%
3000 0.45% 0.08%
5000 1.2% 0.15%

开放性问题

在 10 米以上长线传输场景中,RS422 和 LVDS 接口该如何选择?考虑因素包括:

  • 传输距离需求
  • 抗干扰能力
  • 功耗限制
  • 成本预算
  • 系统升级扩展性

期待大家在评论区分享实际项目经验!

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