ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

告别上电回零噩梦!ADI ADMT4000 真上电多圈传感器深度解析|机器人 / 伺服编码器方案

告别上电回零噩梦!ADI ADMT4000 真上电多圈传感器深度解析|机器人 / 伺服编码器方案 开篇机器人最头疼的 “掉电归零” 到底有多痛不知道做机器人、伺服、执行器开发的朋友们有没有遇到过这种崩溃现场设备正在正常运行突然断电、急停、跳闸。等再次上电机器人关节、丝杆执行器直接 “失忆”完全不知道自己身处哪个位置。 ✅ 传统处理方式必须执行回零操作机械机构跑到原点找基准。带来的现实代价生产停机流水线、协作机器人断电重启回零占用宝贵工时工厂产能直接受损安全风险人形机器人、起重设备、医疗设备如果掉电后被外力拨动关节上电直接会发生误动作有碰撞损坏风险硬件妥协为了记住圈数要么加装笨重的齿轮多圈编码器要么外挂备用电池要么使用韦根德能量收集模块体积、寿命、维护都是大坑Analog Dev...。多圈掉电记忆不是加分项是高端机器人的刚需如果断电之后哪怕外部外力转动关节芯片依然默默记录一共转了多少圈上电直接读出绝对位置不需要回零、不需要电池、不需要齿轮这会是什么体验ADI 的 ADMT4000 就是这样一颗颠覆性单芯片多圈绝对位置传感器。传统多圈方案大盘点各有各的短板在 ADMT4000 出现之前行业主要是 3 套主流多圈解决方案我们简单对比一下表格方案实现原理核心痛点机械齿轮多圈编码器齿轮组机械记录圈数体积巨大、齿轮磨损、抗冲击差、成本高不适合小型关节电池备份多圈单圈传感器 锂电池断电电池供电保存圈数电池寿命有限需要定期维护更换低温环境电池性能衰减有爆炸风险增加布线空间韦根德Wiegand能量收集转轴转动发电写入 FRAM 存储圈数转轴必须转动才能发电记录断电静止被外力转动无法记录圈数容易丢圈出错以上方案都没办法完美实现完全无源断电无论转轴是否转动都可以记录旋转圈数这就是 ADMT4000 瞄准的市场空白Analog Dev...。主角登场ADMT4000什么叫 True Power‑On 真上电多圈ADMT4000 是 ADI 推出的单芯片磁性多圈绝对位置传感器封装是 24 引脚 TSSOP小小的一颗芯片就集成完整多圈检测链路不需要外接齿轮不需要备用电池Analog Dev...。✨核心硬核参数来自官方 datasheet最大测量圈数46 圈总角度 16560°16k°角度精度±0.25°采样速率100kSPS工作磁场窗口16‑31mT搭配普通钕铁硼磁铁即可工作供电 VDD3.3V数字接口 VDRIVE1.7V‑5.5V兼容绝大多数 MCU 电平温度范围结温‑40℃~150℃满足严苛工业环境通信接口标准 SPI Mode0内置温度传感器、过压欠压故障诊断支持片内谐波校准修正磁铁、机械安装带来的误差。️内部三套传感器协同工作芯片内部集成 3 套磁传感单元分工明确GMR 巨磁阻多圈计数传感器【核心黑科技】基于磁性纳米螺旋导线依靠磁畴壁物理位置记录旋转圈数。关键点这个记录过程完全不需要供电断电之后外部磁铁旋转内部磁畴壁跟随移动物理状态永久保存不用电维持。上电直接读取畴壁位置就能知道断电期间一共转了多少圈这就是 True Power‑On 真上电多圈的来源。GMR 象限检测传感器用来把 AMR 的 180° 输出拓展到完整 0‑360° 全周角度。AMR 各向异性磁阻角度传感器负责高精度单圈角度测量输出 sin/cos 原始信号芯片内部 ADC 运算输出经过补偿校准后的角度数据。三者数据融合上电一瞬间直接输出【总圈数 当前单圈角度】完整绝对位置不需要回零不需要外部运算。⚠️关键使用边界开发务必看无源掉电记录有效区间0‑46 圈。断电时如果磁铁旋转超过 46 圈范围圈数会出错无故障标志位输出机械设计要控制行程在此区间内。可以软件读取 FAULT 故障寄存器监控磁场异常、圈数校验异常、电源异常等问题。GMR 计数传感器在装配完成之后需要执行一次磁复位可以用 315° 方向 60mT 外磁场或者顺时针旋转磁铁 46 圈完成复位操作。不止读角度这些实用功能设计工程师要知道片内硬件谐波校准机械安装偏移、磁铁倾斜、磁铁磁化偏差都会引入 1/2/3/8 次谐波误差。ADMT4000 内部提供对应寄存器采集多圈数据做 FFT 之后直接把谐波系数写入芯片硬件实时补偿不用 MCU 做复杂校正运算大幅降低主控负担。IIR 角度滤波内置一阶 IIR 低通滤波器公式Out[n]Out[n‑1](In[n]‑Out[n‑1])/16开启后角度噪声可以从 0.25°RMS 降低到 0.03°RMS注意单次 One‑shot 采样模式不推荐开启滤波容易引入误差。滤波带来约 135μs 的固定延迟高速旋转场景需要评估延迟带来的附加误差。丰富诊断与保护FAULT 寄存器汇总各类故障磁场半径异常、GMR 圈数校验不匹配、NVM 存储器 ECC 错误、VDD/VDRIVE 过压欠压SPI 通讯附带 CRC5 校验保障工业环境通讯可靠性。两种采样模式连续转换模式芯片持续自动采样更新角度One‑shot 单次触发模式CNV 引脚外部信号触发一次采样适合低功耗场景需要时才采集位置数据。多路 GPIO 复用引脚BUSY、ACALC、CNV 触发、BOOTLOAD 启动状态硬件引脚可以同步提示测量状态不用频繁轮询 SPI 寄存器。真实落地场景它改变了什么协作机器人 / 人形机器人关节小型关节内部空间寸土寸金。传统方案齿轮编码器体积大电池方案要预留电池仓和维护。ADMT4000 一颗 TSSOP 芯片PCB 贴装磁铁放转轴末端。断电后哪怕外力掰动关节上电直接读取关节绝对位置省去回零流程提升设备安全性和开机效率。线性执行器、丝杆模组丝杆伸出缩回对应多圈旋转。以往需要额外外置线性位移传感器现在只靠 ADMT4000 读取旋转圈数换算行程节省一个传感器 BOM 成本。断电丝杆被外力推动重启依然知道实际位置。起重、卷扬机、拉线编码器吊具断电后重物可能带动卷筒转动。传统设备上电必须回原点ADMT4000 掉电记录圈数上电直接获取吊具高度极大提升设备安全。汽车执行器、医疗设备不允许上电回零的安全关键设备零维护需求避免电池老化带来的失效风险。硬件小提示PCB 设计VDD、DV18、VDRIVE 电源引脚必须就近放置 X8R 材质去耦电容不用的 GPIO 引脚需要通过 100kΩ 电阻下拉 / 上拉参考 datasheet 典型应用电路。总结ADMT4000 的价值到底是什么很多人只看到参数 ±0.25° 精度、46 圈量程真正的核心价值是技术范式改变 ✅ 抛弃机械齿轮抛弃备用电池抛弃韦根德能量收集模块 ✅ 真正无源物理存储圈数断电期间转轴无论动或者不动都记录旋转信息 ✅ 单芯片集成 ADC、校准、故障诊断MCU 只需要简单 SPI 读取绝对角度 ✅ 工业宽温片内谐波补偿降低整机机械装配公差要求。当然它不是万能最大有效掉电记忆 46 圈机械行程设计要控制在该区间装配后必须做 GMR 磁复位磁铁选型要保证全温度范围磁场落在 16‑31mT 窗口内。对于机器人、自动化设备开发者如果你正在被 “掉电回零、电池维护、编码器体积大” 折磨ADMT4000 这套 True Power‑On 技术值得放进方案选型清单。附录 AADMT4000 开发踩坑清单硬件 固件必看以下内容均来自官方 datasheet Rev.A 的逐条核对建议开发前打印贴在工位上。A.1 硬件设计踩坑表格序号踩坑点正确做法来源1电源去耦随便放VDD、DV18、VDRIVE 引脚就近放置 X7R/X8R 去耦电容参考 datasheet 典型应用电路Pin 配置章节2未用 GPIO 悬空所有未使用的 GPIO 引脚必须通过100kΩ 电阻上拉或下拉禁止悬空Pin 功能描述3RESET 引脚误解Pin22 的 RESET 只复位数字和模拟电路不复位 GMR 圈数传感器GMR 需要单独磁复位Pin22 描述4磁铁磁场不做温度校核工作磁场窗口 16~31mT必须在全温度范围内校核磁铁剩磁衰减低温 / 高温都不能越界电气特性表5SPI 时钟极性配错ADMT4000 使用SPI Mode0CPOL0, CPHA0数据在 SCLK 上升沿采样、下降沿输出SPI 时序章节A.2 上电初始化踩坑表格序号踩坑点正确做法1上电立刻读角度上电后需等待BOOTLOAD (Pin4) 变低典型启动时间 10msNVM 加载完成后再操作 SPI2忽略 FAULT 寄存器上电值FAULT 寄存器上电复位值为0xFFFF必须先读一次确认所有位可置 1再写 0x0000 清零3忘记 GMR 磁复位装配完成后必须执行一次 GMR 圈数传感器复位否则圈数可能不准复位方式见 A.44直接读 ABSANGLE 当有效第一次转换序列完成前 ABSANGLE 为复位值 0xDB00需等待 BUSY 变低或转换计数器递增后再读A.3 多圈量程与掉电记忆踩坑最关键表格序号踩坑点正确做法1以为 46 圈是 AMR 量程True Power-On 掉电记忆只有 0~46 圈有效GMR 传感器AMR 推导圈数 - 9~54 圈仅用于校准不能用于正常掉电记忆2掉电超 46 圈以为会报故障断电状态下旋转超过 46 圈上电后角度可能错误且不会置 FAULT 标志位机械设计必须硬限制行程在 0~46 圈内3忽略圈数交叉校验FAULT 寄存器D13 位是 GMR 圈数与 AMR 圈数交叉校验位差值超过 0.5 圈会置位固件必须轮询此位4以为 D9 位是普通故障FAULT 寄存器D9 位表示 GMR 圈数传感器检测到假状态非法畴壁位置出现后必须执行 GMR 磁复位A.4 GMR 磁复位操作必做装配完成后或 FAULT D9/D13 置位时必须复位 GMR 圈数传感器二选一方式一外磁场复位推荐量产用在315° 方向施加60mT外磁场保持≥10μs注意如果应用磁铁已安装合成磁场应用磁铁 复位磁场需 60mT方式二机械旋转复位调试用将系统磁铁顺时针连续旋转 46 圈以上复位完成后中止当前转换序列CNVPAGE bits [15:14] 写 0b11重新启动转换序列CNVPAGE bits [15:14] 写 0b00此时圈数显示为 45 实际复位角度属正常现象A.5 IIR 滤波器使用踩坑表格序号踩坑点正确做法1以为滤波默认关闭GENERAL 寄存器默认值0x1230bit12(ANGLFILT)1滤波默认开启2One-Shot 模式开滤波官方明确建议One-Shot 单次采样模式不要开启 IIR 滤波有效采样数不足会引入误差3忽略滤波延迟IIR 滤波覆盖当前 前 15 次测量引入约15×9μs135μs 固定延迟高速旋转场景需评估附加误差4极端圈数时滤波异常圈数 53.5 圈或 -8.5 圈时滤波自动旁路角度数据正确但未滤波属正常保护机制A.6 谐波校准踩坑表格序号踩坑点正确做法1以为只有 1/2/3 次谐波支持1/2/3/8 次谐波校准8 次谐波默认用工厂值可通过 GENERAL bit10 (H8CNTRL)1 切换为用户值2校准时不开启 CNVSYNC官方建议校准时设置 GENERAL bits14:130b11用外部 CNV 信号同步 SINE/COSINE 采样减小相位误差3校准后不复位 GMRAMR 角度校准完成后强烈建议再做一次 GMR 磁复位确保整体处于已知良好状态附录 BSPI 读写伪代码示例可直接移植B.1 SPI 帧格式回顾ADMT4000 使用32 位 SPI 帧访问 16 位寄存器SPI Mode0CPOL0, CPHA0MSB 先传。读操作帧结构32 位Bit31 : 忽略位任意值 Bit30 : R/W位 0读 Bit29-24: 6位寄存器地址 A5~A0 Bit23-8 : 芯片输出16位寄存器数据MSB first Bit7 : 固定为1生命计数器位 Bit6-5 : 2位转换计数器 C1~C0每次转换序列完成递增 Bit4-0 : 5位CRC多项式 x^5x^21种子0x1F写操作帧结构32 位Bit31 : 忽略位 Bit30 : R/W位 1写 Bit29-24: 6位寄存器地址 A5~A0 Bit23-8 : 主机输入16位寄存器数据MSB first Bit7-5 : 未指定任意值 Bit4-0 : 5位CRCB.2 CRC-5 计算函数/** * brief 计算ADMT4000 SPI帧的CRC-5校验值 * param data 26位数据读R/WAddrDataFaultConvCnt写R/WAddrData3bit填充 * retval 5位CRC值 * note 多项式 x^5x^21种子0x1F与datasheet伪代码一致 */ uint8_t admt4000_crc5(uint32_t data) { uint8_t shft[5] {1, 1, 1, 1, 1}; // 种子 0x1F uint8_t xor_0; for (int8_t i 30; i 5; i--) { xor_0 ((data i) 0x01) ^ shft[4]; shft[4] shft[3]; shft[3] shft[2]; shft[2] shft[1] ^ xor_0; shft[1] shft[0]; shft[0] xor_0; } return (shft[4] 4) | (shft[3] 3) | (shft[2] 2) | (shft[1] 1) | shft[0]; }B.3 寄存器读函数/** * brief 读取ADMT4000寄存器 * param addr 6位寄存器地址 (0x00~0x3F) * param pData 输出16位寄存器值 * retval 0成功-1CRC校验失败 */ int8_t admt4000_read_reg(uint8_t addr, uint16_t *pData) { uint32_t tx_frame 0; uint32_t rx_frame 0; uint8_t crc_calc, crc_rx; // 构造发送帧bit300(读), bit29-24地址 tx_frame ((uint32_t)(addr 0x3F)) 24; // SPI收发32位CS拉低→传输→CS拉高 // 假设底层SPI函数spi_xfer(tx_frame, rx_frame, 32) spi_xfer(tx_frame, rx_frame, 32); // 解析接收帧bit23-816位数据 *pData (uint16_t)((rx_frame 8) 0xFFFF); // CRC校验对bit30~bit5共26位计算CRC crc_calc admt4000_crc5(rx_frame 0x7FFFFFFE); // bit30~bit5 crc_rx (uint8_t)(rx_frame 0x1F); // bit4~bit0 if (crc_calc ! crc_rx) { return -1; // CRC错误数据不可信 } return 0; }B.4 寄存器写函数/** * brief 写入ADMT4000寄存器 * param addr 6位寄存器地址 * param data 16位待写入数据 */ void admt4000_write_reg(uint8_t addr, uint16_t data) { uint32_t tx_frame 0; uint8_t crc; // 构造发送帧bit301(写), bit29-24地址, bit23-8数据 tx_frame ((uint32_t)1 30) | ((uint32_t)(addr 0x3F) 24) | ((uint32_t)data 8); // 计算CRC对bit30~bit5共26位 crc admt4000_crc5(tx_frame 0x7FFFFFFE); tx_frame | crc; // bit4~bit0填入CRC // SPI发送32位 uint32_t dummy; spi_xfer(tx_frame, dummy, 32); }B.5 初始化流程完整上电序列/** * brief ADMT4000完整上电初始化 * retval 0成功0失败 */ int8_t admt4000_init(void) { uint16_t val; uint32_t timeout 0; // 1. 等待BOOTLOAD(Pin4)变低NVM加载完成典型10ms while (GPIO_ReadBootload() GPIO_PIN_SET) { if (timeout 10000) return -1; // 超时 delay_us(1); } delay_ms(2); // 额外等待内部状态稳定 // 2. 读取FAULT寄存器验证上电值为0xFFFF功能自检 if (admt4000_read_reg(0x06, val) ! 0) return -2; if (val ! 0xFFFF) return -3; // FAULT寄存器上电应为0xFFFF // 3. 清零FAULT寄存器 admt4000_write_reg(0x06, 0x0000); // 4. 可选配置GENERAL寄存器 // 默认0x1230已开启IIR滤波、连续转换模式 // 如需关闭滤波val ~(112); 如需One-Shotval | (10) // 注意bit9必须保持1bits[5:4]必须保持0b11 // admt4000_write_reg(0x01, 0x0002); // 先切到Page 0x02 // admt4000_write_reg(0x10, 0x1230); // 写GENERAL // 5. 启动连续转换序列默认已启动显式触发一次确保 admt4000_write_reg(0x01, 0x0000); // CNVPAGE bits[15:14]0b00 启动 // 6. 等待第一次转换完成BUSY变低 timeout 0; while (GPIO_ReadBusy() GPIO_PIN_SET) { if (timeout 10000) return -4; delay_us(1); } // 7. 读取FAULT确认无故障 admt4000_read_reg(0x06, val); if (val ! 0x0000) return -5; // 存在故障 return 0; }B.6 读取绝对角度含圈数/** * brief 读取绝对角度圈数单圈角度 * param pTurns 输出整圈数 (0~45有效范围) * param pAngle 输出单圈角度单位度 (0~360) * param pAbsDeg 输出总绝对角度单位度 (0~16560) * retval 0成功-1CRC错误-2无效圈数 */ int8_t admt4000_read_absolute(uint16_t *pTurns, float *pAngle, float *pAbsDeg) { uint16_t raw; uint16_t turns_raw; uint16_t angle_raw; // ABSANGLE寄存器地址0x03Page Agnostic无需切页 if (admt4000_read_reg(0x03, raw) ! 0) return -1; // 解析bit15~bit10 整圈数6位 turns_raw (raw 10) 0x3F; // 检查无效圈数编码 0b110110 54 if (turns_raw 0x36) return -2; // 无效圈数 // 负数圈数twos complement0b110111~0b111111 对应 -9~-1 // 正常工作范围0~45此处简单处理 *pTurns turns_raw; // 解析bit9~bit0 角度分辨率 360/1024 ≈ 0.3516° angle_raw raw 0x03FF; *pAngle (float)angle_raw * 360.0f / 1024.0f; // 总绝对角度 *pAbsDeg (float)(*pTurns) * 360.0f (*pAngle); return 0; }B.7 读取高精度单圈角度ANGLE 寄存器/** * brief 读取高精度单圈角度已应用偏移/增益/相位/谐波校准 * param pAngle 输出角度单位度 (0~360) * retval 0成功-1CRC错误 * note ANGLE寄存器分辨率 360/4096 ≈ 0.0879°比ABSANGLE的0.351°更高 */ int8_t admt4000_read_angle(float *pAngle) { uint16_t raw; // ANGLE寄存器地址0x05Page Agnostic if (admt4000_read_reg(0x05, raw) ! 0) return -1; // bit15~bit4 12位角度值分辨率 360/4096 uint16_t angle_raw (raw 4) 0x0FFF; *pAngle (float)angle_raw * 360.0f / 4096.0f; return 0; }B.8 读取内部温度/** * brief 读取芯片内部温度 * param pTemp 输出温度单位℃ * retval 0成功-1CRC错误 * note 公式T(℃) (TMP_reg - 1168) / 15.66 */ int8_t admt4000_read_temp(float *pTemp) { uint16_t raw; // TMP寄存器在Page 0x00地址0x20需先切页 admt4000_write_reg(0x01, 0x0000); // CNVPAGE切到Page 0x00 if (admt4000_read_reg(0x20, raw) ! 0) return -1; // bit15~bit4 12位温度值 uint16_t tmp_raw (raw 4) 0x0FFF; *pTemp ((float)tmp_raw - 1168.0f) / 15.66f; return 0; }B.9 故障轮询函数/** * brief 读取并解析FAULT寄存器 * retval 故障位掩码0无故障 * note 调用后自动清零FAULT寄存器 */ uint16_t admt4000_poll_fault(void) { uint16_t fault; admt4000_read_reg(0x06, fault); if (fault ! 0x0000) { // 解析关键故障位 if (fault (1 14)) { /* AMR角度传感器半径异常磁场过强/过弱 */ } if (fault (1 13)) { /* 圈数交叉校验错误需GMR复位 */ } if (fault (1 9)) { /* GMR假状态检测需GMR复位 */ } if (fault (1 7)) { /* NVM ECC双bit错误芯片可能损坏 */ } if (fault (1 5)) { /* NVM CRC错误 */ } // 清零故障寄存器 admt4000_write_reg(0x06, 0x0000); } return fault; }附录 C关键寄存器速查表表格寄存器名地址所在页复位值读写用途CNVPAGE0x01Agnostic0x0000R/W转换启动控制 寄存器页选择ABSANGLE0x03Agnostic0xDB00R绝对角度圈数 角度0~16560°DIGIO0x04Agnostic0x0000R/WGPIO 引脚状态读写ANGLE0x05Agnostic0x8000R高精度单圈角度12 位0.0879° 分辨率FAULT0x06Agnostic0xFFFFR/W故障状态汇总上电需清零SINE0x100x000x0000R正弦原始测量值2s complementCOSINE0x110x000x0000R余弦原始测量值RADIUS0x180x000x0000R角度向量模长磁场强度诊断TMP0x200x000x0000R内部温度传感器GENERAL0x100x020x1230R/W全局配置转换模式 / 滤波 / 谐波源等DIGIOEN0x120x020x201FR/WGPIO 功能选择与输出使能CNVCNT0x140x020x0000R转换计数器H1MAG/H1PH0x15/0x160x020x0000R/W1 次谐波误差幅值 / 相位H2MAG/H2PH0x17/0x180x020x0000R/W2 次谐波误差幅值 / 相位H3MAG/H3PH0x19/0x1A0x020x0000R/W3 次谐波误差幅值 / 相位H8MAG/H8PH0x1B/0x1C0x02工厂值R/W8 次谐波误差幅值 / 相位UNIQID0~30x1E~0x210x02—R芯片唯一 ID 产品 / 电压 / 版本信息GENERAL 寄存器 bit 位速记默认 0x1230bit0 CNVMDE0 连续转换1One-Shotbits [5:4]必须保持 0b11保留位bit9必须保持 1保留位bit10 H8CNTRL0 工厂 8 次谐波值1 用户值bit12 ANGLFILT0 关滤波1 开滤波默认开启bits [14:13] CNVSYNC00 内部时序11 外部 CNV 同步以上附录内容全部基于 ADI 官方 datasheet Rev.A 逐条核对可以直接追加到你的 CSDN 博文中。如果还需要补充谐波校准 FFT 算法示例、STM32 HAL 完整驱动代码或者Python 上位机读取脚本随时告诉我。思考互动你们项目里多圈掉电记忆遇到过哪些坑欢迎评论区聊聊
返回列表