STM32与AS5600磁编码器的高精度角度测量实战:从硬件连接到软件滤波

1次阅读
没有评论

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

image.webp

背景痛点

在电机控制、机器人关节等场景中,角度测量精度直接影响系统性能。AS5600 磁编码器因其非接触式测量(避免机械磨损)和 12 位分辨率(0.088°理论精度)成为热门选择。但在实际项目中常遇到:

  • I2C 信号干扰 :长导线引入噪声导致通信失败
  • 磁铁安装偏差 :轴向偏移超过 1mm 时线性度急剧下降
  • 环境磁场干扰 :附近电机或电源变压器导致输出跳变

硬件设计优化

PCB 布局关键点

  1. 上拉电阻选择
  2. 标准模式(100kHz)推荐 4.7KΩ,快速模式(400kHz)用 2.2KΩ
  3. 电源电压 3.3V 时实测波形(示波器截图):
    STM32 与 AS5600 磁编码器的高精度角度测量实战:从硬件连接到软件滤波

  4. 电源滤波

  5. 靠近 AS5600 的 VDD 引脚放置 0.1μF 陶瓷电容 +10μF 钽电容
  6. 磁铁供电单独走线,避免电机电流耦合

  7. 磁铁安装

  8. 轴向距离控制在 0.5-2mm(随磁铁尺寸变化)
  9. 使用 3D 打印夹具保证同心度(公差 <0.3mm)

软件实现

STM32CubeMX 配置

  1. 启用 I2C1,时钟配置为:
  2. 标准模式:100kHz,50% 占空比
  3. 快速模式: 不要启用 Clock Stretching(AS5600 不支持)

  4. 开启 I2C 中断和 DMA(可选):

    // CubeMX 生成的初始化代码片段
    hi2c1.Instance = I2C1;
    hi2c1.Init.ClockSpeed = 100000;
    hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;

核心驱动代码

/**
 * @brief 读取 AS5600 角度值(带 CRC 校验)* @param hi2c I2C 句柄
 * @return 滤波后的角度值(0-4095)*/
uint16_t AS5600_ReadAngle(I2C_HandleTypeDef *hi2c) {uint8_t buf[2];
    HAL_I2C_Mem_Read(hi2c, AS5600_ADDR, ANGLE_REG, I2C_MEMADD_SIZE_8BIT, buf, 2, 100);

    // CRC 校验(简化版)if((buf[0] ^ buf[1]) != 0xFF) {Error_Handler();
    }
    return ((uint16_t)buf[0] << 8) | buf[1];
}

滤波算法对比

  • 滑动平均滤波 (适合资源受限场景):

    #define FILTER_WINDOW 5
    uint16_t moving_avg_filter(uint16_t new_val) {static uint16_t buf[FILTER_WINDOW] = {0};
        static uint8_t idx = 0;
        uint32_t sum = 0;
    
        buf[idx++] = new_val;
        if(idx >= FILTER_WINDOW) idx = 0;
    
        for(uint8_t i=0; i<FILTER_WINDOW; i++) {sum += buf[i];
        }
        return sum / FILTER_WINDOW;
    }

  • 卡尔曼滤波 (需启用 STM32 FPU):

    void kalman_init(KalmanFilter *kf, float process_noise, float measure_noise) {
        kf->Q = process_noise;
        kf->R = measure_noise;
        kf->P = 1.0f;
        kf->angle = 0.0f;
    }
    
    float kalman_update(KalmanFilter *kf, float new_angle) {
        kf->P += kf->Q;
        float K = kf->P / (kf->P + kf->R);
        kf->angle += K * (new_angle - kf->angle);
        kf->P *= (1 - K);
        return kf->angle;
    }

生产环境考量

EMC 测试经验

  • 在电机 PWM 频率(如 20kHz)处出现峰值干扰时:
  • 增加 I2C 线路的 RC 滤波(100Ω+100pF)
  • 改用屏蔽双绞线(SDA/SCL 分开屏蔽)

温度补偿

  1. 在 AS5600 附近放置 NTC 热敏电阻(如 MF52-103)
  2. 建立温度 - 角度偏移查找表(实测数据示例):
    | 温度 (℃) | 偏移 (LSB) |
    |---------|-----------|
    | 25      | 0         |
    | 60      | +8        |
    | -10     | -12       |

避坑指南

  • 磁铁偏移问题
  • 径向偏移 >1mm 时非线性误差 >1%
  • 解决方案:使用环形磁铁(直径≥6mm)

  • I2C 多设备冲突

  • AS5600 默认地址 0x36,冲突时可通过 ADDR 引脚修改
  • 总线加 10KΩ 弱上拉避免锁死

  • 低功耗优化

  • 关闭 AS5600 内部放大器(配置 PM 寄存器)
  • 采样间隔 >100ms 时切换为 LPM3 模式

开放性问题

如何通过双 AS5600 实现冗余设计?可能的思路:
1. 双磁铁对称布置,比较两路角度差做故障检测
2. 动态切换主备传感器(当主传感器 CRC 连续错误时)
3. 加权融合算法(根据历史可信度分配权重)

实际效果取决于你的具体应用场景——欢迎在评论区分享你的实现方案!

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