AB相编码器电机入门指南:从原理到嵌入式开发实战

1次阅读
没有评论

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

image.webp

正交编码原理图解

嵌入式开发中常用增量式编码器通过两路正交信号(A 相和 B 相)来检测电机运动状态。这两路信号具有以下特点:

AB 相编码器电机入门指南:从原理到嵌入式开发实战

  • 相位差固定为 90 度
  • 每转产生固定数量的脉冲(如 500 线编码器每转产生 500 个脉冲)
  • 通过检测边沿变化可以实现 4 倍频计数

图示说明(文字描述):

 A 相: __|¯¯|____|¯¯|____
B 相: ____|¯¯|____|¯¯|__
       ↑    ↑    ↑    ↑
       4 个计数点 / 周期 

数学依据:

  1. 单个脉冲周期 T 内可检测 4 次边沿变化(A 相上升沿、A 相下降沿、B 相上升沿、B 相下降沿)
  2. 分辨率提升公式:实际分辨率 = 编码器线数 × 4
  3. 以 500 线编码器为例,理论分辨率可达 2000 脉冲 / 转

STM32 硬件接口方案对比

方案一:专用编码器接口模式

优势:

  • 硬件自动处理正交编码
  • 不占用 CPU 资源
  • 支持最高 10MHz 的计数频率

配置示例(TIM3 寄存器):

// 定时器编码器模式配置
TIM_Encoder_InitTypeDef encoderConfig = {
    .EncoderMode = TIM_ENCODERMODE_TI12, // 双通道计数模式
    .IC1Polarity = TIM_ICPOLARITY_RISING,
    .IC2Polarity = TIM_ICPOLARITY_RISING,
    .IC1Selection = TIM_ICSELECTION_DIRECTTI,
    .IC2Selection = TIM_ICSELECTION_DIRECTTI
};
HAL_TIM_Encoder_Init(&htim3, &encoderConfig);

方案二:GPIO+ 外部中断方案

适用场景:

  • 需要自定义解码逻辑
  • 定时器资源紧张时

硬件连接要求:

  • 两个 GPIO 配置为输入模式
  • 开启双边沿触发中断

带滤波算法的代码实现

核心数据结构

typedef struct {
    volatile int32_t rawCount;    // 原始计数值
    volatile float rpm;          // 转速值 (RPM)
    volatile float angle;        // 当前角度 (0-360°)
    KalmanFilter kf;             // 卡尔曼滤波器实例
} EncoderData;

边沿检测与方向判断

// 在 GPIO 中断回调函数中实现
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    static uint8_t lastState = 0;
    uint8_t currentState = (HAL_GPIO_ReadPin(GPIOA, A_PIN) << 1) 
                         | HAL_GPIO_ReadPin(GPIOA, B_PIN);

    // 状态机实现方向判断
    switch(lastState) {
        case 0b00:
            if(currentState == 0b01) encoder.rawCount++;
            else if(currentState == 0b10) encoder.rawCount--;
            break;
        // 其他状态转换...
    }
    lastState = currentState;
}

转速计算(1ms 定时器中断)

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    static int32_t lastCount = 0;
    int32_t delta = encoder.rawCount - lastCount;

    // RPM 计算公式:(Δcount × 60) / (脉冲数每转 × 采样周期秒)
    encoder.rpm = (delta * 60.0f) / (2000.0f * 0.001f);

    // 卡尔曼滤波
    encoder.rpm = Kalman_Update(&encoder.kf, encoder.rpm);

    lastCount = encoder.rawCount;
}

常见问题解决方案

1. 高速旋转脉冲丢失

症状:实测转速低于预期

解决方法:

  • 改用硬件编码器接口模式
  • 降低输入滤波时间(修改 TIMx_CCMR 寄存器)
  • 检查线缆长度(建议 <0.5m)

2. 电源噪声干扰

典型表现:静止时计数值漂移

应对措施:

  • 在 AB 相线上加 100Ω 电阻和 100nF 电容滤波
  • 使用差分信号传输(如 RS422 接口)
  • 软件端增加移动平均滤波

3. 零位校准

操作步骤:

  1. 电机转动到机械零点位置
  2. 短接 Z 相信号到中断引脚
  3. 在中断服务程序中重置计数器
  4. 保存偏移量到 Flash

调试技巧

逻辑分析仪连接方式:

  • 通道 1 接 A 相
  • 通道 2 接 B 相
  • 设置触发模式为「序列触发」

关键测量参数:

  1. 相位差是否稳定在 90°±10%
  2. 脉冲宽度是否符合预期(转速×分辨率)
  3. 检查毛刺脉冲宽度(应 <100ns)

动手实验

任务目标:

使用 STM32F103 开发板 + 带编码器的直流电机,实现以下功能:

  1. 实时显示电机角度(精度±5°)
  2. 通过串口输出转速值
  3. 实现位置闭环控制(P 控制即可)

所需材料:

  • 带 AB 相输出的编码器电机(如 JGA25-370)
  • STM32 最小系统板
  • 逻辑分析仪(可选)
  • 杜邦线若干

通过本文介绍的核心技术点,相信您已经掌握了 AB 相编码器电机的基础开发方法。在实际项目中,建议先用示波器验证信号质量,再逐步实现软件功能。遇到问题时,可以重点检查硬件连接和定时器配置这两个最容易出错的环节。

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