ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AS5600磁编码器从选型到FOC闭环的实战避坑指南

AS5600磁编码器从选型到FOC闭环的实战避坑指南 1. 为什么磁编码器值得花时间折腾如果你正在做云台、无刷电机FOC控制、机械臂关节或者任何需要精确知道轴转到哪儿了的项目那AS5600这个名字你大概率已经见过不止一次了。它是一颗12位分辨率的磁性旋转位置传感器输出0到4095对应0到360度通过IIC接口跟主控通信SSOP-8封装价格亲民外围电路简单到令人发指——一颗芯片加一颗径向充磁的磁铁基本就能跑起来。但能跑起来和跑得稳、读得准、不丢数据之间隔着不少坑。我见过太多人第一次用AS5600的时候IIC扫不到地址、读出来的角度一直在跳、磁铁位置稍微偏一点数据就废了。这些问题不是芯片的锅而是磁编码器这个品类本身对机械安装、IIC时序、寄存器配置都有比较具体的要求而大部分教程只告诉你接上SDA/SCL就能读剩下的全靠自己踩。这篇内容面向的是已经有一定单片机基础、准备把AS5600真正用进项目里的开发者。不管你是用STM32、ESP32还是树莓派不管你是用硬件IIC还是软件模拟下面这些从选型、接线、寄存器操作到数据滤波的完整流程都是我实际项目中反复验证过的。读完你至少能少走两三个晚上的弯路。2. AS5600核心原理与IIC通信基础拆解2.1 磁编码器到底在测什么先把这个东西的物理原理说清楚不然后面调参你都不知道在调什么。AS5600内部有四个霍尔传感器呈90度排列在芯片中心周围。当你把一颗径向充磁的磁铁放在芯片正上方并且磁铁中心对准芯片中心时磁铁的旋转会在四个霍尔传感器上产生相位差90度的正弦信号。芯片内部的DSP把这些模拟信号做反正切运算算出一个绝对角度值再量化成12位数字量存到寄存器里。这里有几个关键点直接决定了你的使用效果。第一磁铁必须是径向充磁的也就是磁铁的N极和S极在圆柱的侧面各占一半而不是像普通磁铁那样上下两面是N和S。你拿一个普通的圆片磁铁放上去读出来的数据基本是废的。第二磁铁和芯片之间的气隙有讲究典型值是0.5到3毫米太近了磁场饱和太远了信号太弱都会导致角度跳变。第三磁铁的中心必须尽量对准芯片中心偏移超过1毫米精度就会明显下降。我一般推荐用直径6毫米、厚度2.5毫米的径向充磁钕铁硼磁铁这个尺寸跟AS5600的推荐匹配度最好。买的时候一定要跟卖家确认径向充磁四个字很多卖家默认发的是轴向充磁拿到手你装上去发现数据不对再回头换货就耽误时间了。2.2 IIC通信协议在AS5600上的具体表现AS5600的IIC地址是固定的0x367位地址这个地址不可更改所以你在一条IIC总线上只能挂一颗AS5600。如果你需要多个关节角度检测要么用IIC多路复用器要么换用SPI接口的型号比如AS5047P。IIC的通信速率方面AS5600支持标准模式100kHz和快速模式400kHz。实测下来400kHz完全稳定再高就不建议了因为AS5600的内部寄存器读取需要一定的处理时间。这里有个细节AS5600在收到读命令后内部需要大概150微秒来准备数据如果你用400kHz的时钟频率连续读取中间不加延时可能会读到重复的旧数据。我的做法是在每次读取之间加一个200微秒左右的短延时或者直接以100Hz到200Hz的频率读取角度这个速率对绝大多数控制场景已经绰绰有余。IIC总线的上拉电阻取值是个老生常谈的问题。在3.3V系统下4.7kΩ是最常用的值总线电容小的时候也可以用2.2kΩ来提高上升沿速度。但如果你总线上挂了多个设备或者走线比较长电容大了之后上拉电阻太小会导致低电平灌电流过大这时候反而要加大到10kΩ。我的经验是先焊4.7kΩ用示波器看SCL和SDA的上升沿如果上升时间超过1微秒就适当减小电阻如果低电平下不去0.3V以下就加大电阻。2.3 寄存器映射你需要关心的只有这几个AS5600的寄存器表在数据手册里有完整列出但实际使用中你真正需要操作的只有几个。我把它整理成下面这个表方便你直接对照寄存器地址名称功能常用值0x0CRAW_ANGLE_H原始角度高8位只读0x0DRAW_ANGLE_L原始角度低4位只读0x0EANGLE_H经过ZPOS/MPOS处理的角度高8位只读0x0FANGLE_L经过ZPOS/MPOS处理的角度低4位只读0x07CONF_H配置寄存器高位0x000x08CONF_L配置寄存器低位0x000x01ZPOS_H零位设置高位按需0x02ZPOS_L零位设置低位按需0x03MPOS_H最大位置设置高位按需0x04MPOS_L最大位置设置低位按需0x0BSTATUS磁铁状态只读0x1AAGC自动增益控制值只读RAW_ANGLE和ANGLE的区别在于RAW_ANGLE是芯片直接算出来的绝对角度范围0到4095ANGLE是经过ZPOS和MPOS映射之后的角度。如果你不需要设置零位和量程直接用RAW_ANGLE就行省去配置步骤。STATUS寄存器值得特别关注。它的bit5是MDMagnet Detectedbit4是MLMagnet Too Weakbit3是MHMagnet Too Strong。读取角度之前先检查这三个位如果MD为0说明磁铁没检测到ML为1说明磁场太弱MH为1说明磁场太强。这个自检功能非常实用可以在初始化阶段就发现安装问题不用等到读数据发现跳变再回头查。AGC值反映的是内部自动增益控制的当前状态。磁铁位置合适的时候AGC值通常在0到255的中间范围大概在100到150之间。如果AGC接近0或者接近255说明磁场太强或太弱需要调整气隙。我习惯在初始化时把AGC值打印出来作为安装质量的参考指标。3. 硬件连接与初始化配置实操3.1 最小系统接线方案先把硬件跑通再谈软件。AS5600的最小系统只需要以下几根线VCC接3.3V注意AS5600不支持5V供电虽然有些模块板载了稳压但芯片本身是3.3V的GND接地SDA接主控的IIC数据线同时通过4.7kΩ上拉到3.3VSCL接主控的IIC时钟线同时通过4.7kΩ上拉到3.3VDIR接地或接VCC决定角度增加的方向DIR引脚很多人忽略但它决定了你读到的角度是顺时针增加还是逆时针增加。DIR接地时从芯片正面看有字的那面朝上磁铁顺时针旋转角度增加DIR接VCC时方向相反。如果你发现角度变化方向和实际旋转方向反了不用改代码直接把DIR引脚的电平换一下就行。另外AS5600的OUT引脚是模拟/PWM输出如果你只用IIC这个引脚可以悬空。PGO引脚是编程使能正常使用时接地。3.2 用STM32CubeMX配置IIC的完整流程如果你用STM32CubeMX可以省掉很多初始化代码。打开CubeMX之后在Pinout视图里找到IIC外设选择IIC模式。以IIC1为例PB6自动分配为SCLPB7自动分配为SDA。在Configuration标签页里把IIC Speed Mode设为Fast ModeClock Speed设为400000Hz。这里有个容易踩的坑CubeMX默认的IIC时钟配置有时候会导致实际速率偏差较大。你需要在Clock Configuration页面确认IIC外设的时钟源频率然后回到IIC配置页面看实际的SCL频率。如果偏差超过10%手动调整一下分频系数。生成代码之后HAL库的IIC读写函数直接用HAL_IIC_Mem_Read和HAL_IIC_Mem_Write就行。AS5600的寄存器是8位的所以MemAddressSize用IIC_MEMADD_SIZE_8BIT。下面是一个读取原始角度的函数示例#define AS5600_ADDR 0x36 1 // HAL库需要左移一位 uint16_t AS5600_ReadRawAngle(void) { uint8_t buf[2]; HAL_IIC_Mem_Read(hiic1, AS5600_ADDR, 0x0C, IIC_MEMADD_SIZE_8BIT, buf, 2, 100); return ((uint16_t)(buf[0] 0x0F) 8) | buf[1]; }注意RAW_ANGLE_H的高4位是无效的只有低4位是有效数据所以要和0x0F做与运算。这个细节数据手册里有写但很容易看漏。3.3 ESP32下的IIC配置差异ESP32的IIC外设叫IIC在Arduino环境下用Wire库最方便。初始化代码如下#include Wire.h #define AS5600_ADDR 0x36 void setup() { Serial.begin(115200); Wire.begin(21, 22); // SDA21, SCL22 Wire.setClock(400000); } uint16_t readRawAngle() { 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 ((uint16_t)(high 0x0F) 8) | low; }ESP32的IIC引脚可以任意映射但默认的21和22是最常用的组合。如果你用的是ESP32-S3或者其他型号引脚号可能不同查一下对应的数据手册就行。ESP32有个需要注意的地方它的IIC内部上拉比较弱如果你没有外接上拉电阻在400kHz下可能通信不稳定。我建议无论如何都在SDA和SCL上各焊一个4.7kΩ的上拉电阻不要依赖内部上拉。4. 角度数据读取与滤波处理4.1 原始数据读取与角度换算读到了12位原始数据之后换算成角度很简单float angle_deg raw_angle * 360.0f / 4096.0f;但实际使用中我建议你保留原始整数值做后续处理只在最终显示或上报的时候才转成浮点角度。原因是浮点运算在中断或者高频循环里开销比较大而整数比较和差值计算要快得多。还有一个细节12位分辨率意味着最小角度分辨率是360/4096约等于0.088度。这个精度对于大多数云台和电机控制已经够了但如果你需要更高精度可以考虑AS5047P它是14位的分辨率提高到0.022度。不过AS5047P是SPI接口接线和代码都要改选型的时候要提前想清楚。4.2 多圈角度累计的实现方法单圈角度只能告诉你轴在0到360度之间的位置但很多应用需要知道轴转了多少圈。比如一个丝杆滑台电机转10圈对应滑台移动一定距离你就需要累计圈数。实现思路是每次读取新角度和上一次的角度做差如果差值超过2048也就是半圈就认为发生了一次过零圈数加一或减一。代码大概长这样int32_t getMultiTurnAngle(uint16_t new_raw) { static uint16_t last_raw 0; static int32_t turns 0; int16_t diff (int16_t)(new_raw - last_raw); if (diff 2048) { turns--; } else if (diff -2048) { turns; } last_raw new_raw; return turns * 4096 new_raw; }这里用int16_t做差值运算很关键它自动处理了无符号整数的回绕问题。如果你用int32_t做差再判断代码会多好几行还容易出错。这个方法的精度取决于你的读取频率。如果轴转得很快两次读取之间角度变化超过半圈就会丢圈。假设你以1kHz的频率读取轴转速不能超过500圈/秒这个上限对绝大多数应用都够用。但如果你的读取频率只有100Hz上限就降到50圈/秒高速场景下就要注意了。4.3 滑动平均与卡尔曼滤波的取舍AS5600的原始数据本身已经比较干净了但在电机驱动场景下PWM开关噪声会耦合到IIC线上导致偶尔出现跳变。我一般用两种滤波方式第一种是滑动平均简单粗暴。维护一个长度为8的环形缓冲区每次读取新值放进去输出8个值的平均。这个方法对随机噪声效果好但会引入大约4个采样周期的延迟。如果你的控制周期是1ms延迟就是4ms对大多数云台够用但对高速FOC控制可能偏大。第二种是一阶低通滤波公式是output alpha * new (1-alpha) * output。alpha取0.2到0.5之间根据你的噪声情况调。这个方法延迟小但滤波效果不如滑动平均。我通常先用示波器看原始数据的噪声幅度如果跳变在正负5个LSB以内用一阶低通就够了如果跳变超过20个LSB说明硬件上可能有干扰先查硬件再谈滤波。注意任何滤波都会引入延迟在闭环控制系统中延迟直接影响相位裕度。如果你发现加了滤波之后系统开始振荡先把滤波去掉确认是控制参数的问题还是滤波延迟的问题。5. 常见问题排查与实战避坑经验5.1 IIC扫不到地址的排查顺序这是新手遇到最多的问题。我的排查顺序是这样的第一步确认供电。用万用表量AS5600的VCC引脚必须是3.3V。有些模块板载了5V转3.3V的LDO你给它供5V也能工作但如果你直接给芯片供5V它可能已经烧了。第二步确认上拉电阻。用万用表量SDA和SCL对VCC的电阻应该是4.7kΩ左右。如果量出来是无穷大说明上拉电阻没焊或者虚焊。第三步确认地址。AS5600的7位地址是0x36但很多IIC扫描程序输出的是8位地址也就是0x6C。如果你用0x36去扫扫不到试试0x6C。第四步用示波器看波形。如果SDA和SCL都有波形但就是没有应答检查一下时序参数。AS5600对IIC的建立时间和保持时间有要求如果你的主控IIC速率太快或者上升沿太慢可能导致通信失败。把速率降到100kHz试试。第五步检查DIR和PGO引脚。DIR悬空的时候状态不确定可能影响通信。PGO如果接高电平芯片会进入编程模式IIC可能不响应。把这两个引脚都明确接地。5.2 角度跳变的硬件排查清单角度数据偶尔跳变九成以上是硬件问题不是软件问题。按下面这个清单逐项检查现象可能原因排查方法角度偶尔跳到0或4095磁铁偏心或气隙过大读AGC值正常应在100-150角度周期性波动电机PWM干扰示波器看VCC纹波加100nF去耦电容角度单向漂移磁铁温度漂移检查磁铁温度系数必要时换低温漂磁铁角度完全不动IIC通信失败读STATUS寄存器检查MD位角度跳变幅度固定某一位数据错误检查IIC上拉和走线缩短线长我遇到过一次很隐蔽的问题AS5600的VCC和电机驱动共用一条电源线电机加速的时候角度数据就会跳。后来在AS5600的VCC引脚旁边加了一个100nF的陶瓷电容和一个10uF的钽电容问题就解决了。磁编码器对电源纹波很敏感去耦电容不能省。5.3 磁铁安装的实操心得磁铁安装看起来简单实际上是最容易出问题的地方。我总结了几条经验磁铁和芯片之间的气隙先用3mm左右的非磁性垫片垫着读AGC值然后逐渐减小气隙观察AGC值的变化。AGC值在100到150之间对应的气隙就是合适的。如果AGC值一直很低说明磁铁磁场太弱换更强的磁铁或者减小气隙。磁铁的中心对准可以用一个简单的办法在芯片上方放一张白纸把磁铁放在纸上慢慢移动同时观察RAW_ANGLE的值。当磁铁中心对准芯片中心时旋转磁铁一圈RAW_ANGLE的变化应该是均匀的。如果某个角度范围内变化特别快或者特别慢说明磁铁偏心或者磁铁本身的磁场不均匀。磁铁的固定方式也很重要。用胶水粘的时候胶水固化过程中的收缩可能会让磁铁偏移。我一般用UV胶点上去之后先用紫外灯预固化几秒确认位置没动再完全固化。热熔胶也可以但温度高了会软化不适合高温环境。5.4 从单圈到闭环AS5600在FOC中的实际表现很多人用AS5600做无刷电机的FOC控制这里说几个实际数据。AS5600的12位分辨率对应0.088度对于极对数为7的电机电角度分辨率是0.088乘以7等于0.616度。这个精度对于低速平稳运行够用但在高速下由于IIC读取速率限制角度更新率可能跟不上。我实测过用STM32F103以400kHz IIC读取AS5600读取一次完整角度发地址、发寄存器地址、读两个字节大概需要80微秒加上处理时间实际角度更新率可以做到5kHz左右。对于转速在3000RPM以下的电机这个更新率足够。但如果你的电机转速超过5000RPM建议换用SPI接口的AS5047P它的读取速率可以轻松做到10kHz以上。另外AS5600的绝对角度输出意味着你不需要像霍尔传感器那样做启动对齐。上电之后直接读到的就是绝对位置FOC算法可以直接用。这是磁编码器相比霍尔的一大优势省掉了启动时的抖动和对齐过程。6. 进阶应用与扩展思路6.1 用AS5600做旋钮编码器除了电机控制AS5600也很适合做高精度旋钮。相比传统的机械编码器磁编码器没有磨损、寿命长、分辨率高。你只需要在旋钮轴上装一颗径向充磁磁铁下面放AS5600就能得到一个12位的绝对角度旋钮。做旋钮的时候我建议加上吸附效果也就是在软件里把角度量化到固定档位。比如每15度一个档位总共24个档位。实现方法是把角度除以15取整再乘以15。这样旋钮转动的时候会有段落感手感更好。6.2 多AS5600组网方案前面说过AS5600的IIC地址固定一条总线上只能挂一颗。如果你需要多个关节角度检测有两个方案方案一用IIC多路复用器比如TCA9548A它可以把一条IIC总线扩展成8条每条挂一颗AS5600。TCA9548A本身也是IIC设备地址可以通过A0/A1/A2引脚配置最多可以级联8片理论上支持64颗AS5600。方案二用主控的多个IIC外设。STM32F4系列一般有3个IICESP32有2个IIC可以同时挂多颗。如果还不够可以用软件模拟IIC理论上任意GPIO都可以做IIC。方案三换用SPI接口的AS5047P。SPI的片选机制天然支持多设备而且速率更高。如果项目对成本不敏感我推荐直接用AS5047P省去多路复用器的麻烦。6.3 磁编码器选型对比AS5600 vs AS5047P参数AS5600AS5047P分辨率12位14位接口IICSPI最大速率400kHz10MHz供电3.3V3.3V/5V封装SSOP-8TSSOP-14价格较低中等适用场景低速云台、旋钮高速FOC、机械臂选型建议如果你的应用对角度更新率要求不高低于1kHzAS5600完全够用而且接线简单、代码量少。如果需要高速读取或者多设备组网直接上AS5047P省去后面升级的麻烦。6.4 温度漂移与长期稳定性磁编码器的角度输出会受温度影响主要来源是磁铁的剩磁随温度变化。钕铁硼磁铁的剩磁温度系数大约是-0.12%/°C也就是说温度每升高1度磁场强度下降0.12%。AS5600内部的AGC会自动补偿一部分但在温度变化剧烈的场景下角度输出还是会有漂移。如果你的应用对温度稳定性要求高两个办法一是选用钐钴磁铁它的温度系数是-0.03%/°C比钕铁硼好很多但价格更贵二是在软件里做温度补偿用一颗温度传感器监测环境温度根据温度值对角度做修正。修正系数需要你实际标定不同磁铁、不同气隙的系数都不一样。我在一个户外云台项目里遇到过温度漂移问题夏天中午和晚上读到的零位差了大约0.5度。后来换了钐钴磁铁漂移降到0.1度以内满足了项目要求。7. 我的实操体会AS5600这颗芯片硬件设计简单软件配置也不复杂但真正用好它功夫在细节上。磁铁的选型和安装、IIC总线的上拉和走线、电源的去耦、数据的滤波每一个环节都影响最终的角度质量。我自己的习惯是拿到新的AS5600模块之后先不急着写代码而是用USB转IIC工具接上电脑用上位机软件把RAW_ANGLE、AGC、STATUS这几个寄存器都读出来看一遍。确认磁铁安装没问题、AGC值在合理范围、STATUS没有报错再开始写单片机代码。这个前置检查花不了十分钟但能帮你排除掉大部分硬件问题。另外如果你在做闭环控制建议在代码里加一个角度数据有效性的判断。每次读取角度之前先读STATUS寄存器如果MD位为0或者ML/MH位为1就把这次数据丢弃用上一次的有效值代替。这个简单的保护逻辑可以避免磁铁松动或者干扰导致的控制异常。最后分享一个小技巧AS5600的OUT引脚可以配置成PWM输出如果你不想用IIC也可以用PWM读取角度。虽然精度和速率都不如IIC但在某些IIC资源紧张的场景下这是一个可用的备选方案。配置方法是通过IIC写CONF寄存器把OUT引脚的功能从模拟输出改成PWM输出然后就可以用定时器捕获PWM占空比来换算角度了。
返回列表