FOC篇一、AS5600 磁编码器
- 嵌入式开发
- 2025-12-29
- 356热度
- 0评论
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)

安装位置
- 磁铁中心 对准 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 | 中 | 高 | 工业 |
| 编码盘光电 | 高 | 很高 | 精密控制 |