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

1次阅读
没有评论

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

image.webp

背景痛点

磁编码器在电机控制中越来越受欢迎,主要得益于它的非接触式测量特性和高分辨率。相比于传统的光电编码器,磁编码器没有机械磨损,更适合恶劣环境下的长期使用。AS5600 作为一款常用的磁编码器芯片,具有 12 位分辨率,能够提供 0.088°的角度测量精度,非常适合机器人关节、电机控制等场景。

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

然而,在实际应用中,开发者常常会遇到以下问题:

  • I2C 地址冲突:AS5600 的默认 I2C 地址是 0x36,当系统中有多个 I2C 设备时容易产生冲突。
  • 磁场干扰:外部磁场或电机产生的磁场会影响 AS5600 的测量精度。
  • 机械安装偏差:磁铁与 AS5600 的安装位置和间距不当会导致测量误差。

硬件设计

STM32 与 AS5600 连接电路

AS5600 通过 I2C 接口与 STM32 通信,典型的连接电路如下:

AS5600          STM32
SCL  ---------- PB6 (I2C1_SCL)
SDA  ---------- PB7 (I2C1_SDA)
VCC  ---------- 3.3V
GND  ---------- GND

需要注意的是,I2C 总线需要上拉电阻,建议使用 4.7kΩ 的上拉电阻连接到 3.3V。如果总线较长或设备较多,可以适当减小上拉电阻值以提高信号质量。

磁铁选型与安装

磁铁的选择和安装对 AS5600 的性能至关重要。以下是几点建议:

  • 磁化方向 :优先选择轴向磁化的磁铁(磁场方向垂直于磁铁表面)。
  • 磁铁尺寸 :推荐使用直径 5mm、厚度 3mm 的钕磁铁。
  • 安装间距 :磁铁与 AS5600 的推荐间距为 1 -3mm。间距过大会导致信号弱,间距过小可能导致磁饱和。
  • 安装位置 :磁铁应尽可能对准 AS5600 的中心位置,避免偏心导致的非线性误差。

软件实现

I2C 驱动代码

以下是基于 STM32 HAL 库的 I2C 驱动代码,包含错误重试机制:

#define AS5600_I2C_ADDR 0x36
#define AS5600_ANGLE_REG 0x0C

uint16_t AS5600_ReadAngle(void) {uint8_t buffer[2];
    uint16_t angle = 0;
    HAL_StatusTypeDef status;

    // 尝试读取 3 次
    for (int i = 0; i < 3; i++) {
        status = HAL_I2C_Mem_Read(&hi2c1, AS5600_I2C_ADDR << 1, 
                                 AS5600_ANGLE_REG, I2C_MEMADD_SIZE_8BIT, 
                                 buffer, 2, 100);
        if (status == HAL_OK) {angle = (buffer[0] << 8) | buffer[1];
            break;
        }
        HAL_Delay(1);
    }

    return angle;
}

角度值转换

AS5600 输出的原始角度值是 12 位分辨率(0-4095),需要转换为 0 -360°:

float AS5600_GetAngleDegrees(void) {uint16_t raw = AS5600_ReadAngle();
    return (raw * 360.0f) / 4096.0f;
}

均值滤波实现

为了提高测量稳定性,可以实现一个简单的均值滤波器:

#define FILTER_SAMPLES 5

float AS5600_GetFilteredAngle(void) {static float samples[FILTER_SAMPLES] = {0};
    static int index = 0;
    float sum = 0;

    // 更新样本
    samples[index] = AS5600_GetAngleDegrees();
    index = (index + 1) % FILTER_SAMPLES;

    // 计算平均值
    for (int i = 0; i < FILTER_SAMPLES; i++) {sum += samples[i];
    }

    return sum / FILTER_SAMPLES;
}

校准优化

ZPOS/MPOS 寄存器校准

AS5600 提供了 ZPOS 和 MPOS 寄存器用于校准零点和最大角度位置。校准步骤如下:

  1. 将磁铁旋转到希望设置为零点的位置
  2. 写入 ZPOS 寄存器(地址 0x01),值为当前原始角度值的低 8 位
  3. 将磁铁旋转到希望设置为最大角度的位置
  4. 写入 MPOS 寄存器(地址 0x03),值为当前原始角度值的低 8 位

非线性误差补偿

由于机械安装偏差或磁场不均匀,AS5600 可能会产生非线性误差。可以使用最小二乘法拟合误差曲线并进行补偿。以下是实现步骤:

  1. 在 0 -360°范围内每隔 10°测量一次实际角度与 AS5600 测量值的偏差
  2. 使用最小二乘法拟合二次多项式:error = aθ² + bθ + c
  3. 在软件中对测量结果应用补偿:corrected_angle = raw_angle – error

避坑指南

I2C 总线长度限制

实测表明,I2C 总线在标准模式(100kHz)下可靠工作的最大长度约为 1 米。如果总线更长,建议:

  • 降低通信速率(如 10kHz)
  • 使用更小的上拉电阻(如 2.2kΩ)
  • 考虑使用 I2C 缓冲器

避免磁饱和

AS5600 的磁场强度应在 30-150mT 之间。可以使用高斯计测量磁场强度,或通过以下公式估算:

B = (μ₀ * M) / (2 * π * d³)

其中 μ₀是真空磁导率,M 是磁矩,d 是距离。

多设备地址配置

如果需要使用多个 AS5600,可以通过 AS5600 的 DIR 引脚配置不同的 I2C 地址:

  • DIR 接 GND:地址 0x36
  • DIR 接 VCC:地址 0x37

性能验证

角度误差测试

在实验室条件下,我们对 AS5600 进行了精度测试。使用高精度转台作为参考,测试结果表明:

  • 在 12 位分辨率下,静态测量误差小于 0.2°
  • 经过非线性补偿后,误差可降至 0.1°以下

CPU 占用率对比

测试了不同读取方式下的 CPU 占用率(STM32F103 @72MHz):

  • 轮询模式:约 15% CPU 占用率(100Hz 采样)
  • 中断模式:约 5% CPU 占用率
  • DMA 模式:约 2% CPU 占用率

进阶思考:实现 0.1°精度的动态补偿

要实现 0.1°的测量精度,可以考虑以下方法:

  1. 温度补偿 :AS5600 的输出会受温度影响,可以添加温度传感器进行补偿
  2. 动态滤波 :根据转速自适应调整滤波器参数
  3. 高阶补偿 :使用三次或更高阶多项式进行非线性补偿
  4. 双传感器冗余 :使用两个 AS5600 正交安装,通过数据融合提高精度

总结

通过合理的硬件设计和软件优化,AS5600 磁编码器可以在 STM32 平台上实现高精度的角度测量。关键点包括:正确的磁铁安装、稳定的 I2C 通信、适当的滤波算法和精心的校准。希望本文的内容能帮助开发者快速实现项目需求,并为进一步的性能优化提供思路。

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