STM32与AS5600磁编码器实战指南:从硬件连接到角度测量

1次阅读
没有评论

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

image.webp

背景痛点:为什么我们需要磁编码器?

在电机控制、机器人关节定位等场景中,传统电位器易磨损、光电编码器怕灰尘,而 AS5600 这类磁编码器通过非接触式测量完美解决了这些问题。但新手常遇到:

STM32 与 AS5600 磁编码器实战指南:从硬件连接到角度测量

  • I2C 通信时好时坏,逻辑分析仪显示波形畸变
  • 角度输出突然跳变 30°,电机控制直接翻车
  • 原始数据转换公式看不懂,网上例程寄存器配置不全

硬件设计:这样接线就稳了

先看关键连接(假设使用 STM32F103C8T6):

  1. 电源部分
  2. AS5600 的 VDD 接 3.3V(绝对不要超 3.6V)
  3. 建议用 LDO 单独供电,避免电机干扰

  4. I2C 线路

  5. SDA/SCL 必须接 4.7kΩ 上拉电阻(开发板自带的不够用)
  6. 线路长度超过 10cm 时改用屏蔽双绞线

  7. 抗干扰技巧

  8. 磁铁背面贴 3M 导电胶带接地
  9. I2C 线路并联 100pF 电容到地

核心实现:从寄存器配置到角度换算

1. 寄存器配置三件套

AS5600 有这几个必设寄存器(地址均为 16 进制):

  • CONF(0x07)

    // 设置滤波强度 + 输出位数(示例配置)uint8_t conf_data[2] = {0x01, 0x08}; // 4x 滤波 +12bit 输出
    HAL_I2C_Mem_Write(&hi2c1, 0x36, 0x07, I2C_MEMADD_SIZE_8BIT, conf_data, 2, 100);

  • ZPOS/MPOS(0x01/0x03)

    // 零位校准(磁铁安装后执行一次)uint8_t zpos_data[2] = {0x00, 0x00};
    HAL_I2C_Mem_Write(&hi2c1, 0x36, 0x01, I2C_MEMADD_SIZE_8BIT, zpos_data, 2, 100);

2. 带 CRC 校验的 I2C 读取

AS5600 的 I2C 读操作需要 CRC 校验,完整流程:

  1. 发送设备地址 + 寄存器地址(写模式)
  2. 重新发送起始条件
  3. 发送设备地址(读模式)
  4. 读取 2 字节数据 + 1 字节 CRC

示例代码:

/**
 * @brief 带 CRC 校验的 AS5600 读取
 * @param reg 寄存器地址
 * @param data 存放读取结果的数组(2 字节)* @retval HAL 状态
 */
HAL_StatusTypeDef AS5600_ReadWithCRC(uint8_t reg, uint8_t *data) {uint8_t crc, rx_buf[3];

  // 步骤 1 -3:先写寄存器地址再切读模式
  if(HAL_I2C_Master_Transmit(&hi2c1, 0x36, &reg, 1, 100) != HAL_OK)
    return HAL_ERROR;

  // 步骤 4:读取数据 +CRC  
  if(HAL_I2C_Master_Receive(&hi2c1, 0x36, rx_buf, 3, 100) != HAL_OK)
    return HAL_ERROR;

  // 校验 CRC(多项式 0x07)crc = 0x36 ^ reg;
  crc ^= rx_buf[0]; crc ^= rx_buf[1];
  if(crc != rx_buf[2]) {return HAL_ERROR; // CRC 校验失败}

  data[0] = rx_buf[0]; data[1] = rx_buf[1];
  return HAL_OK;
}

3. 原始数据转角度

AS5600 的 12 位输出(0~4095)转换公式:

// 获取角度(0-360 度)float AS5600_GetAngle(void) {uint8_t raw[2];
  uint16_t raw_angle;

  if(AS5600_ReadWithCRC(0x0C, raw) == HAL_OK) {raw_angle = (raw[0] << 8) | raw[1];
    return (raw_angle / 4096.0f) * 360.0f;
  }
  return -1.0f; // 错误值
}

避坑指南:血泪经验总结

磁铁安装的黄金距离

  • 轴向距离:AS5600 表面到磁铁 2mm 最佳(±0.5mm)
  • 径向偏移:不超过磁铁半径的 20%
  • 验证方法:缓慢旋转时观察 RAW_ANGLE 寄存器是否线性变化

I2C 总线速率选择

线长 推荐速率
<10cm 400kHz
10-30cm 100kHz
>30cm 改用 SPI

温度补偿实战

AS5600 在 -40℃~+125℃时会有±3°误差,补偿方法:

  1. 在 25℃室温下记录零位值(ZPOS)
  2. 用 NTC 测温贴在磁编码器附近
  3. 根据温度查表补偿(示例):
    float temp_compensation(float angle, float temp) {
      // 每升高 1℃补偿 0.03°
      return angle + (temp - 25.0f) * 0.03f; 
    }

性能验证:示波器不说谎

用逻辑分析仪捕获的 I2C 时序(100kHz 速率):

  • 正常波形 :SCL 高电平期间 SDA 稳定
  • 异常情况
  • 上升沿有振铃 → 减小上拉电阻
  • 低电平被抬高 → 检查总线冲突

不同滤波参数下的角度抖动对比:

滤波强度 抖动范围 (°) 响应延迟 (ms)
±0.5 0
4x ±0.1 2
16x ±0.05 8

开放性问题

当系统需要同时处理电机控制 +PID 计算时,如何利用 STM32 的硬件定时器实现 AS5600 的无阻塞轮询?

(提示:考虑 DMA+ 定时器触发 I2C 的硬件自动传输)

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