资讯动态

AS5600磁编码器实战:IIC通信、角度读取与闭环控制

发布时间:2026/10/7 6:47:01 来源:尧图企业网站定制
1. 为什么偏偏是AS5600这颗磁编码器搞电机控制或者做云台、旋钮、机械臂关节的朋友大概率都绕不开一个需求精确知道当前转了多少度。光电编码器精度高但怕灰怕油电位器便宜但寿命短、线性度差霍尔方案分辨率又不够看。AS5600这颗芯片之所以在圈子里被反复提起核心就三点12位分辨率、非接触式测量、IIC接口开箱即用。我第一次上手AS5600是在一个闭环步进项目里当时需要给一个旋转平台做位置反馈。选型阶段对比过AS5047P那颗是14位、支持SPI和ABI输出性能确实更强但价格和焊接难度都上了一个台阶。AS5600是12位也就是把一圈360度分成4096份理论分辨率约0.088度对于大多数中低速场景完全够用。更关键的是它出厂就带IIC两根线一接读两个寄存器就能拿到角度值对MCU资源几乎没要求。这颗芯片的本质是一个磁性角度传感器。它内部有一组霍尔阵列检测芯片正上方那颗径向充磁磁铁的磁场方向。磁铁跟着转轴转芯片就能算出绝对角度。注意“绝对”两个字——它不需要像增量式编码器那样找零位上电就知道当前角度这对很多应用来说是刚需。适合读这篇内容的人正在做电机闭环、旋钮交互、机器人关节、云台稳定、或者单纯想玩一下磁编码器的嵌入式开发者。不管你是用STM32、ESP32还是树莓派只要你会用IIC这篇就能直接抄作业。下面我会从硬件设计、IIC通信细节、角度读取代码、校准方法到常见坑一层层拆开讲。2. 硬件设计磁铁、布局和上拉电阻这三件事2.1 磁铁的选型和安装距离AS5600对磁铁的要求比很多人想象中严格。必须用径向充磁的圆柱磁铁直径一般6mm、厚度2.5mm左右最常见。轴向充磁的磁铁装上去读数会乱跳甚至完全不动这是新手最容易踩的第一个坑。安装距离方面数据手册给的推荐值是芯片表面到磁铁底面0.5mm到3mm之间最佳区间在1mm到2mm。太近了磁场饱和太远了信号弱。我实测下来1.5mm左右最稳。你可以用一张A4纸垫着当临时垫片纸的厚度大约0.1mm叠十几张差不多就是1.5mm调试阶段很好用。还有一个容易被忽略的点磁铁的中心必须对准芯片的中心。偏心超过0.5mm角度线性度就会明显变差。如果你做的是旋转关节建议在结构上做一个沉孔来定位磁铁别指望手工粘上去能对准。2.2 芯片布局的注意事项AS5600的封装是SOP-8引脚间距1.27mm手工焊接难度不大。但布局时有几个细节去耦电容必须靠近VCC引脚典型值是100nF加1uF组合。我见过有人省掉这个电容结果IIC通信时不时丢包查了半天以为是代码问题。芯片正下方不要走其他信号线尤其是PWM或电机驱动线。磁场传感器对干扰很敏感电机线从底下穿过会直接污染读数。如果板子上有大电流回路尽量让AS5600远离或者加一层铜箔屏蔽。我在一个BLDC项目里就吃过这个亏电机一转角度就抖后来把编码器板挪远5mm才解决。2.3 IIC上拉电阻到底取多大这是搜索热词里反复出现的问题IIC上拉电阻取多大。标准答案是4.7kΩ但实际要看你的总线和速率。AS5600支持标准模式100kHz和快速模式400kHz。在400kHz下如果总线电容较大比如排线较长4.7kΩ可能导致上升沿变缓通信失败。这时候要降到2.2kΩ甚至1.5kΩ。反过来如果总线很短、只有这一颗从机10kΩ也能跑功耗还更低。我的经验法则是先焊4.7kΩ用示波器看SCL和SDA的上升沿。如果上升时间超过1us就换小一点。没有示波器的话直接上2.2kΩ最保险代价只是多耗一点点电。注意上拉电阻是接在3.3V上的AS5600的VCC也是3.3V别接到5V上去虽然它耐5V但和3.3V的MCU混用会有电平匹配的隐患。3. IIC通信协议从时序到AS5600的寄存器地图3.1 IIC通信原理快速过一遍IIC是两根线SCL时钟线和SDA数据线都是开漏输出靠上拉电阻拉高。通信过程是这样的主机先发起始条件SCL高时SDA从高拉低然后发7位从机地址加1位读写位从机拉低SDA应答接着传数据最后发停止条件SCL高时SDA从低拉高。AS5600的7位地址是0x36。写操作时地址字节是0x361 | 0 0x6C读操作是0x361 | 1 0x6D。这个地址是固定的没法改所以一条IIC总线上只能挂一颗AS5600。如果你需要多个编码器要么用IIC多路复用器要么换SPI接口的型号。3.2 AS5600的寄存器地图AS5600内部有一组寄存器我们最关心的是这几个寄存器地址名称功能读写0x0CRAW_ANGLE_H原始角度高8位读0x0DRAW_ANGLE_L原始角度低4位读0x0EANGLE_H经过校准的角度高8位读0x0FANGLE_L经过校准的角度低4位读0x07CONF配置寄存器读写0x08STATUS状态寄存器读0x0BAGC自动增益控制值读0x01ZPOS_H零位高8位读写0x02ZPOS_L零位低4位读写0x03MPOS_H最大位置高8位读写0x04MPOS_L最大位置低4位读写RAW_ANGLE和ANGLE的区别RAW是芯片直接算出来的原始值ANGLE是经过ZPOS和MPOS映射后的值。如果你不做零位校准两者一样。做校准后ANGLE会把ZPOS对应的位置映射成0度MPOS对应的位置映射成360度。角度值是12位存在两个寄存器里。高8位在0x0C低4位在0x0D的高4位。所以读取时要这样组合uint16_t raw_angle (high_byte 8) | low_byte; raw_angle raw_angle 0x0FFF; // 只保留12位 float degrees raw_angle * 360.0f / 4096.0f;3.3 读取角度的完整IIC时序以STM32 HAL库为例读一次角度的流程是发送起始条件发送从机地址0x36写方向发送寄存器地址0x0C重新发送起始条件Restart发送从机地址0x36读方向读取两个字节第一个是0x0C的值第二个是0x0D的值发送NACK和停止条件用HAL库的代码大概长这样uint8_t buf[2]; HAL_I2C_Mem_Read(hi2c1, 0x361, 0x0C, I2C_MEMADD_SIZE_8BIT, buf, 2, 100); uint16_t angle ((buf[0] 8) | buf[1]) 0x0FFF;注意HAL库的地址参数要左移一位因为库函数内部会自己加读写位。很多人在这里搞错填了0x36结果读不出来就是这个原因。4. 角度读取实战从裸读到闭环4.1 最小可运行代码先给一个ESP32上的完整例子用Arduino框架因为ESP32的IIC用起来最省心#include Wire.h #define AS5600_ADDR 0x36 void setup() { Serial.begin(115200); Wire.begin(21, 22); // SDA21, SCL22 } uint16_t readAngle() { Wire.beginTransmission(AS5600_ADDR); Wire.write(0x0C); Wire.endTransmission(false); Wire.requestFrom(AS5600_ADDR, 2); uint8_t high Wire.read(); uint8_t low Wire.read(); return ((high 8) | low) 0x0FFF; } void loop() { uint16_t raw readAngle(); float deg raw * 360.0 / 4096.0; Serial.println(deg); delay(10); }这段代码跑起来你转动磁铁就能看到角度变化。如果读数不动或者一直是0先检查接线再检查磁铁是不是径向充磁的。4.2 多圈角度怎么算AS5600只能测单圈绝对角度0到360度循环。如果你需要知道转了多少圈得自己软件累加。思路是记录上一次的角度如果这次和上次的差值超过180度就认为过零了圈数加一或减一。int32_t multi_turn 0; uint16_t last_angle 0; void updateMultiTurn(uint16_t current) { int16_t diff current - last_angle; if (diff 2048) { multi_turn--; } else if (diff -2048) { multi_turn; } last_angle current; }这个逻辑在低速下很稳但高速时如果两次采样之间转过的角度超过半圈就会误判。所以采样率要够高或者用定时器中断来保证固定周期读取。4.3 闭环控制中的角度滤波直接把AS5600的原始值丢进PID你会发现输出有轻微抖动。这是因为12位分辨率下最低位跳变对应0.088度加上磁场噪声读数会有正负1到2个LSB的波动。我的做法是加一个一阶低通滤波float filtered 0; float alpha 0.2; // 滤波系数越小越平滑但延迟越大 void updateFilter(float raw) { filtered filtered * (1 - alpha) raw * alpha; }alpha取0.2到0.3之间比较合适。太小了响应慢太大了滤波效果不明显。如果你做的是高速电机控制可以用滑动平均或者卡尔曼滤波但一阶低通在大多数场景下够用了。5. 校准与配置让角度真正准起来5.1 零位校准很多时候我们希望某个机械位置对应0度。AS5600支持通过ZPOS寄存器设置零位。操作步骤是把机械结构转到你想要的零位读取当前RAW_ANGLE值把这个值写入ZPOS_H和ZPOS_L之后读ANGLE寄存器这个位置就是0度写ZPOS的代码void setZeroPosition(uint16_t raw) { Wire.beginTransmission(AS5600_ADDR); Wire.write(0x01); Wire.write((raw 8) 0x0F); Wire.write(raw 0xFF); Wire.endTransmission(); }注意ZPOS是12位高寄存器只用了低4位。写完之后要等一会儿再读芯片内部需要时间更新。5.2 最大角度范围设置MPOS寄存器用来设置角度映射的终点。默认是4095对应360度。如果你只需要测量90度的范围可以把MPOS设成1023这样ANGLE读出来就是0到90度映射到0到360度。这个功能在限位检测里很有用但要注意它只是软件映射RAW_ANGLE还是完整的0到360度。5.3 自动增益控制AGC的妙用STATUS寄存器里有一个AGC值反映的是内部自动增益控制的当前状态。这个值可以帮你判断磁铁距离是否合适AGC在0到128之间磁场偏强磁铁可能太近了AGC在128左右最佳状态AGC大于200磁场偏弱磁铁太远或者磁铁太小调试阶段可以把这个值打印出来边调磁铁距离边看比盲调快得多。6. 常见问题与排查技巧实录6.1 读数一直是0或者4095这是最典型的问题原因通常有三个磁铁没装或者装反了。径向充磁的磁铁有方向性翻个面试试。IIC通信根本没通。用逻辑分析仪抓一下波形看从机有没有应答。如果没有应答检查地址是不是0x36上拉电阻有没有焊。供电不对。AS5600的VCC范围是3.3V到5V但如果你用3.3V MCU建议统一用3.3V。6.2 角度跳变或者线性度差磁铁偏心。重新对中偏心超过0.5mm就会明显影响线性度。磁铁距离不对。看AGC值调到128附近。附近有铁磁材料。螺丝、轴承、电机外壳都会干扰磁场。尽量用铜或铝做结构件或者让磁铁远离这些东西。6.3 IIC通信不稳定上拉电阻太大。换2.2kΩ试试。总线太长。IIC设计上适合板内通信超过20cm就要考虑降低速率或者加缓冲器。电源噪声。在VCC引脚旁边加一个10uF的钽电容和100nF的陶瓷电容并联。6.4 高速下角度滞后AS5600的内部采样率是有限的数据手册标称最高约1kHz。如果你需要更高的更新率只能换AS5047P或者AS5070这类支持更高带宽的型号。在AS5600上把IIC速率提到400kHz然后尽量缩短读取周期能压到1ms左右一次。7. 进阶玩法从单圈到闭环系统7.1 配合电机做位置闭环把AS5600装在电机轴尾读出的角度作为位置反馈配合PID就能做位置闭环。我做过一个步进电机的位置闭环用AS5600替代传统的限位开关效果很好。关键点是角度要做多圈累加否则过零的时候PID会疯掉。7.2 做旋钮交互AS5600做旋钮比传统电位器舒服太多没有磨损寿命无限。配合一个带RGB灯的MCU可以做出很有质感的交互设备。注意旋钮的磁铁要装在旋转中心用轴承保证同心度。7.3 和OLED搭配做实时显示搜索热词里出现了“iic通信协议 oled”这确实是个常见组合。AS5600和OLED都是IIC设备可以挂在同一条总线上只要地址不冲突。AS5600是0x36OLED一般是0x3C或0x3D完全不冲突。这样你只需要两根线就能同时读角度和显示角度做原型特别方便。8. 我踩过的那些坑第一个坑是磁铁充磁方向。我一开始买了轴向充磁的磁铁装上去读数完全没规律换了径向充磁的才正常。买的时候一定要看清规格书。第二个坑是上拉电阻。我用4.7kΩ跑400kHz在面包板上能通焊到板子上就不行了。后来换成2.2kΩ解决。面包板的寄生电容和PCB不一样调试阶段能通不代表最终能通。第三个坑是电源干扰。在一个电机项目里AS5600和电机驱动共用一路电源电机一转角度就乱跳。后来给AS5600单独加了一个LDO问题消失。磁编码器对电源质量比普通数字芯片敏感得多。第四个坑是ZPOS写入后没生效。写完之后要重新上电或者等至少100ms再读芯片内部有更新周期。我一开始写完立刻读发现没变化以为写错了其实是时序问题。9. 选型对比AS5600和AS5047P怎么选特性AS5600AS5047P分辨率12位14位接口IICSPI/ABI/PWM最高转速较低更高价格便宜较贵焊接难度SOP-8容易TSSOP-14较难适用场景中低速、成本敏感高速、高精度如果你的应用转速不超过几千RPM精度要求0.1度级别AS5600完全够用。如果需要更高精度或者更高转速直接上AS5047P别在AS5600上硬撑。10. 最后分享几个实用小技巧调试AS5600的时候我习惯先写一个最简单的读数程序只打印RAW_ANGLE不做任何滤波和映射。确认硬件没问题了再一步步加功能。这样出问题的时候容易定位。另外磁铁的安装深度比很多人想的更重要。磁铁嵌在轴里和贴在轴端磁场分布不一样。如果条件允许尽量让磁铁和芯片之间的空气间隙稳定不要有金属件在中间。还有一点IIC的时钟频率不要一上来就拉满。先用100kHz调通再试400kHz。有些便宜的MCU在400kHz下时序裕量不够会偶发丢包。如果你要做多圈绝对位置可以考虑在AS5600之外加一个减速齿轮加单圈编码器的方案或者直接用带多圈功能的磁编码器。AS5600本身只做单圈多圈必须靠软件或者机械结构来实现。这个芯片我用了快三年从最初的点亮到后来做闭环控制踩的坑基本都写在这里了。它不是什么高深的东西但细节确实多硬件和软件各占一半。把磁铁、上拉电阻、电源这三样搞定了剩下的就是写代码的事。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑