FOC篇一、AS5600 磁编码器

AS5600 磁编码器学习笔记

一、AS5600 是什么?

AS5600 是 AMS(现 ams OSRAM)推出的一款 非接触式磁角度传感器,通过检测轴端磁铁的磁场方向直接输出 0–360° 的绝对角度信息,是一种磁性绝对角度传感器。其核心特点是上电即可获知当前位置,不依赖脉冲累积,不会因掉电而丢失位置信息。常见输出方式包括 I²C 数字角度(12 位,4096 分辨率)、PWM 占空比以及模拟电压,适合用于需要明确角度反馈、位置不允许漂移的场合,如舵机角度检测、旋转关节位置反馈等。

AS5600产品手册AS5600-DS000365.pdf

核心特性

  • 分辨率:12 bit(0 ~ 4095)
  • 角度范围:0° ~ 360°
  • 输出方式:
    • I²C(数字)
    • 模拟电压(0~VCC)
    • PWM
  • 供电电压:3.3V / 5V
  • 非接触、无磨损,适合长期运行

二、工作原理(通俗理解)

  • 在 AS5600 正上方放置一颗 径向磁铁
  • 芯片内部霍尔阵列检测磁场方向
  • 内部 CORDIC 算法计算出角度
  • 输出为一个 12 位的角度值

角度映射关系:

0      → 0°
2048   → 180°
4095   → 360°(≈ 0°)

三、磁铁安装要点(非常关键)

磁铁要求

  • 直径:6mm / 8mm 常见

  • 厚度:2~3mm

  • 磁化方式:径向磁化(Radial Magnetization)

    image-20251230141926650

安装位置

  • 磁铁中心 对准 AS5600 中心
  • 距离:1mm ~ 3mm 最佳
  • 偏心或距离不对 → 抖动、非线性、角度跳变

⚠️ FOC 项目里,90% 的“角度不稳”问题都不是代码,而是磁铁问题


四、AS5600 寄存器速览(I²C)

I²C 地址(7 位):

0x36

输出寄存器:

地址 名称 说明
0x0C RAW_ANGLE_H 原始角度高 8 位
0x0D RAW_ANGLE_L 原始角度低 4 位
0x0E ANGLE_H 处理后的角度
0x0F ANGLE_L 处理后的角度

状态寄存器

地址 名称 说明
0x0B STATUS 磁铁状态标志位
0x1A AGC 自动增益控制值
0x1C MAGNITUDE_H 磁场幅值高字节
0x1D MAGNITUDE_L 磁场幅值低字节

1. STATUS 寄存器

该寄存器用于反馈 AS5600 的运行状态,各 bit 高电平对应的状态及实际用途如下:

位名称 高电平时的状态说明 实际用途
MH[bit5 ] 自动增益控制(AGC)最小增益溢出,磁体过强 判定磁体与芯片距离过近,需调整磁体安装位置
ML[bit4 ] AGC 最大增益溢出,磁体过弱 判定磁体与芯片距离过远,或磁体规格不匹配
MD[bit3 ] 检测到磁体 确认磁体是否正常安装(无磁体时该位为低)

正常状态的 STATUS 寄存器特征是:MD=1,MH=0,ML=0,对应 “磁体存在且强度适配” 的工作条件。

STATUS = 0x1A

def read_status():
    return i2c.readfrom_mem(0x36, STATUS, 1)[0]

s = read_status()
md = (s >> 5) & 1
ml = (s >> 4) & 1
mh = (s >> 3) & 1

print("MD:", md, "ML:", ml, "MH:", mh)

启用自检

def as5600_ok():
    s = read_status()
    agc = read_agc()

    md = (s >> 5) & 1
    ml = (s >> 4) & 1
    mh = (s >> 3) & 1

    if not md:
        return False
    if ml or mh:
        return False
    if agc < 50 or agc > 200:
        return False

    return True

2. AGC 寄存器

AS5600 内部为了“看清磁场”,自动调放大倍数,这个放大倍数的“当前值”,就放在 0x1A

  • 核心功能:AS5600 通过闭环自动增益控制,适配磁体磁场强度的动态变化(如温度波动、磁体老化),保障内部信号的稳定性。
  • 工作逻辑:AGC 值反映当前增益水平,理想状态下该值应处于范围中间,以兼顾磁场波动的适配能力。
  • 增益范围:
    • 5V 供电时,AGC 范围为 0-255(8 位精度);
    • 3.3V 供电时,AGC 范围缩减为 0-128(7 位精度)。

3. MAGNITUDE 寄存器

该寄存器输出内部 CORDIC(坐标旋转数字计算机)模块的磁场强度数值,通常与 AGC 寄存器配合使用,更精准地评估磁体与芯片的匹配状态。

五、MicroPython 读取 AS5600(ESP32 示例)

1. 硬件连接

AS5600 ESP32
VCC 3.3V
GND GND
SDA GPIO6
SCL GPIO7

2. 基础读取代码

from machine import I2C, Pin
import time
import math

AS5600_ADDR = 0x36
RAW_ANGLE_H = 0x0C
RAW_ANGLE_L = 0x0D

i2c = I2C(
    0,
    scl=Pin(7),
    sda=Pin(6),
    freq=100000
)

def read_raw_angle():
    high = i2c.readfrom_mem(AS5600_ADDR, RAW_ANGLE_H, 1)[0]
    low  = i2c.readfrom_mem(AS5600_ADDR, RAW_ANGLE_L, 1)[0]
    angle = ((high << 8) | low) & 0x0FFF
    return angle

def read_angle_deg():
    raw = read_raw_angle()
    return raw * 360.0 / 4096.0

while True:
    print("Angle:", read_angle_deg())
    time.sleep(0.1)

六、角度展开(多圈角度,FOC 必备)

AS5600 是一种磁性绝对角度传感器,能够直接测量轴的单圈绝对角度,输出范围为θ∈[0,2π)AS5600 本身不提供多圈信息,即无法直接知道轴一共转过多少圈。
因此,在需要位置累计或多圈角度的应用中,通常通过软件方式对角度进行扩展。

基本思想

通过比较相邻两次采样的角度变化,判断是否发生了 0 / 2π 的回绕(溢出),从而在软件中累计完整转数。

当轴连续旋转时,AS5600 的角度输出会在 2π → 0(或 0 → 2π)处产生跳变,该跳变可作为“转过一整圈”的判据。

原理

  • 记录上一次角度

  • 判断是否跨过 0°/360°

  • 累加圈数
    d_angle = val - angle_prev;
    正常情况下:|d_angle| << 2π
    发生回绕时:|d_angle| ≈ 2π
    回绕判断条件if (abs(d_angle) > 0.8f * 2π)
    说明:

  • 0.8 × 2π 是一个工程经验阈值

  • 用于区分:

    • 正常角度变化
    • 跨越 0 / 2π 边界的回绕事件
  • 隐含前提:
    单次采样周期内,轴转动角度小于 0.8 圈

last_angle = 0
turns = 0

def read_angle_continuous():
    global last_angle, turns
    angle = read_angle_deg()

    delta = angle - last_angle
    if delta > 180:
        turns -= 1
    elif delta < -180:
        turns += 1

    last_angle = angle
    return angle + turns * 360

使用 180° 阈值的隐含前提:

|真实转角变化| < 180°

解释:

如果两次采样之间,转子实际旋转小于半圈:

  • delta > 180° 只可能发生在逆向跨零(360° → 0°)
  • delta < -180° 只可能发生在正向跨零(0° → 360°)

在这个前提下:

  • delta > 180°turns -= 1 (逆时针跨零)
  • delta < -180°turns += 1 (顺时针跨零)

误判不会发生。

也就是说:

  • 以上代码使用 180° 默认了一个关键前提:每次采样旋转 < 180°
  • 如果采样快或转速慢 → 180°(半圈) 安全、简单、直观
  • 如果采样慢或转速快 → 必须用 288° (0.8*360° 0.8圈)判定,防止误判

七、AS5600 在 BLDC FOC 中的作用

FOC(磁场定向控制)算法的核心是精确、实时地知道转子的电角度θ。AS5600 正是用来提供这个关键的转子位置信息的传感器。控制器根据这个角度信息,通过 Clarke/Park 变换等一系列算法,计算出施加到电机定子上的最佳电压矢量,从而实现电机的平滑、高效、静音控制。

FOC 核心需要的是转子电角度 θₑ,AS5600 提供的是 机械角度 θₘ


1. 机械角度 → 电角度

θₑ = θₘ × 极对数
即电角度 = 机械角度 × 电机极对数

例如:

  • 电机极对数 = 7
  • AS5600 测得角度 = 30°
θₑ = 30 × 7 = 210°

代码示例:

POLE_PAIRS = 7

def get_electrical_angle():
    mech_angle = read_angle_continuous()
    elec = mech_angle * POLE_PAIRS
    return elec % 360

2. 在 FOC 控制环中的位置

AS5600 → θ
        ↓
   Clarke 变换
        ↓
   Park 变换
        ↓
   PID(Id, Iq)
        ↓
   反 Park
        ↓
   SVPWM
        ↓
   MOSFET

八、项目级注意事项(经验总结)

1. 抖动与滤波

  • AS5600 本身有微抖
  • 建议:
    • 滑动平均
    • 一阶低通
alpha = 0.2
angle_filt = 0

def lowpass(angle):
    global angle_filt
    angle_filt = angle_filt * (1 - alpha) + angle * alpha
    return angle_filt

2. 启动对齐(Align)

  • FOC 启动时必须:
    • 给定固定电角度
    • 锁定转子
    • 读取 AS5600
    • 建立零点偏移
θ_offset = θ_encoder - θ_command

3. 常见坑

  • 磁铁没对准 → FOC 永远不稳
  • 极对数错 → 电机震动、啸叫
  • I²C 速度太高 → 丢数据
  • 未做多圈 → 速度计算异常

九、AS5600 vs 其他编码器(简述)

类型 成本 精度 适合
AS5600 FOC 入门
MT6701 高性能 FOC
增量式 ABZ 工业
编码盘光电 很高 精密控制