文章来源 Cytech Engineer

面向人形机器人的线性关节模组 (中) ——基于 STM32 的 ADMT4000 软件设计:从 SPI 通信到绝对位置读取

在上一篇《面向人形机器人的线性关节模组(上)——直线关节与 ADI ADMT4000 高精度位置记忆方案》中,我们介绍了直线关节模组的结构原理、与旋转关节的差异,以及 ADMT4000 如何利用 GMR 多圈计数和 AMR 角度测量实现断电后的绝对位置记忆。

本文将聚焦 ADMT4000 的软件实现:如何把 Analog Devices 公司 (以下简称 ADI) 官方驱动移植到 STM32 平台,通过 SPI 读取 ABSANGLE 与 ANGLE 寄存器,完成 CRC 校验、故障检查和连续绝对位置合成,并给出可直接参考的 HAL 代码与调试建议,帮助工程师快速完成位置读取功能的开发与验证。

  

一、技术背景

在机器人关节、阀门、工业执行器和伺服系统中,设备重新上电后能否立即获得机械轴的真实位置,是位置检测系统必须解决的问题。

增量式编码器依靠脉冲累积位置,系统断电后计数随之丢失,重新启动时通常需要执行回零。单圈绝对值编码器虽然能够保留一圈内的角度,却无法判断机械轴已经旋转了多少圈。

传统齿轮式多圈编码器可以利用机械传动结构记录圈数,解决断电后的“位置记忆”问题,但它并没有自动解决位置精度和系统校准问题。随着齿轮级数增加,齿隙、偏心、装配公差和传动误差会逐级累积;机构越复杂,对零部件精度和装配工艺的要求越高,产品的一致性、可靠性和生产良率也越难控制。

因此,一个真正可靠的多圈位置系统,不仅要在断电后记住轴转了多少圈,还要准确测量当前角度,并尽量减少机械结构、安装偏差和磁场误差对最终位置的影响。这正是 ADMT4000 值得关注的地方:它采用磁感应方式保存多圈状态,减少了传统机械计圈机构带来的复杂度,同时提供单圈角度测量和软件校准能力,为系统建立连续的绝对位置。

ADI 的 ADMT4000 是一款真正上电即可读取多圈位置的磁传感器。它内部包含 GMR 多圈计数、象限检测和 AMR 精细角度测量,可以在芯片断电时继续记录外部磁场的旋转状态。系统重新上电后,STM32 通过 SPI 就能读取绝对位置,不需要备用电池。

ADI 官方产品页给出的主要特性包括:

参数项

规格说明

圈数

46 圈磁位置测量

角度输出范围

超过 16000° 的数字位置输出

典型角度精度

±0.25°

最高测量更新率

100 kSPS

芯片供电

3.3 V

数字接口

SPI 数字接口,支持 1.8 V~5 V 电平

内置功能

温度、磁场幅值和故障诊断功能

本文不展开所有寄存器,而是说明怎样把 ADI 官方驱动移植到 STM32,并给出一段带详细注释的 HAL 读取代码。

  

二、官方资料对应收藏

ADMT4000 的数据格式、软件配置和标定方法分别放在不同文档中,建议按照下面的顺序阅读:

  1. ADMT4000 官方产品页

产品页集中列出了最新数据手册、用户指南、评估软件和参考设计。ADI 后续更新文档时,应优先从这里进入。

  1. ADMT4000 数据手册 Rev.C

用于确认引脚、电气参数、SPI 时序、寄存器、数据格式和故障位,是硬件设计和底层驱动的主要依据。

介绍 ADMT4000DRV-SRC 软件包的结构、依赖关系和示例工程,是理解官方驱动架构的入口。

用于处理 H1、H2、H3 和 H8 谐波补偿。标定系数关系到最终角度精度,不建议根据经验自行填写。

包含评估板连接、引脚说明和测试方法,适合初次调试时参考。

介绍磁复位条件和实现方式。磁复位属于维护和故障恢复流程,不应在每次正常上电时执行。

ADI 已经在 GitHub 的 no-OS 仓库中提供了正式的 ADMT4000 C 语言驱动:

官方示例工程已经支持 STM32 平台,并包含 sdp-ck1z.ioc、基础采集示例和 IIO 示例。因此,正式产品最稳妥的做法是保留 ADI 驱动的协议层,只把底层 SPI、GPIO 和延时接口替换为 STM32 HAL。

  

三、STM32 需要怎样配置

根据 ADI 当前 no-OS 驱动的初始化配置,SPI 使用 Mode 0:

主机模式:Master
通信方式:Full Duplex
数据宽度:8 bit
时钟极性:CPOL = 0,空闲时为低电平
时钟相位:CPHA = 0,第一个边沿采样
位顺序:MSB First
片选方式:软件 GPIO 控制

在 STM32CubeMX 中,对应配置通常是:

hspi1.Init.Mode              = SPI_MODE_MASTER;

hspi1.Init.Direction         = SPI_DIRECTION_2LINES;

hspi1.Init.DataSize          = SPI_DATASIZE_8BIT;

hspi1.Init.CLKPolarity       = SPI_POLARITY_LOW;

hspi1.Init.CLKPhase          = SPI_PHASE_1EDGE;

hspi1.Init.NSS               = SPI_NSS_SOFT;

hspi1.Init.FirstBit          = SPI_FIRSTBIT_MSB;

图1:STM32CubeMX SPI 配置界面
图1:STM32CubeMX SPI 配置界面

SPI 分频值需要结合 STM32 外设时钟和数据手册规定的最高 SCLK 计算。首次调试可以先把速度降低,确认帧格式、CRC 和返回数据正确后再提高频率。

片选引脚应配置成推挽输出,空闲状态保持高电平。ADI 官方驱动会在一个片选周期内连续读取 ABSANGLE 和 ANGLE 两个寄存器,因此不要让 STM32 在每个字节之间自动释放片选。

图2:时钟配置界面
图2:时钟配置界面

根据系统需要,还可以连接以下引脚:

  • RESET:低电平有效的硬件复位;
  • GPIO0/BUSY:指示转换忙;
  • GPIO1/CNV:外部启动一次转换;
  • GPIO3/ACALC:角度计算状态;
  • GPIO4/FAULT:故障指示。

如果只做最基本的位置读取,SPI、CS 和 RESET 已经可以完成初期调试;进入正式产品阶段时,建议把 FAULT 和 BUSY 一并接入 STM32。

ADMT4000 一次寄存器通信为 4 字节:

第 1 字节:寄存器地址及读写控制

第 2 字节:16 位数据高字节

第 3 字节:16 位数据低字节

第 4 字节:FAULT、生命周期计数和 5 位 CRC

图3:32-Bit Write Operation for 16-Bit Register
图3:32-Bit Write Operation for 16-Bit Register

其中 CRC 使用:

多项式:x⁵ + x² + 1

初始值:0x1F

结果宽度:5 bit

CRC 不能省略。错误的位置数据一旦进入电机闭环,产生的后果可能远比一次通信超时严重。

  

四、带注释的 STM32 HAL 位置读取代码

代码一

下面代码提取了 ADI no-OS 驱动中最核心的读取逻辑,并改写成 STM32 HAL 形式。它只读取测量寄存器,不修改 Page 2 配置寄存器,因此适合先验证硬件通信。

由于篇幅原因,以下仅展示部分代码,完整代码包括状态解析、四分之一圈符号还原、CRC 校验及位置读取函数,已整理为附件,大家可在文末下载。

图4:驱动代码1 (部分代码)
图4:驱动代码1 (部分代码)

代码二

首先实现 ADMT4000 的 5 位 CRC。下面的计算方法与 ADI 官方 admt4000_compute_crc() 保持一致:

图5:驱动代码2
图5:驱动代码2

代码三

接下来检查一个 4 字节返回帧:

图6:驱动代码3
图6:驱动代码3

代码四

真正读取位置时,按照官方驱动方式,在一次 CS 拉低期间发送两个 4 字节子帧。以下为位置读取的部分代码,完整请参阅文末附件。

图7:驱动代码4 (部分代码)
图7:驱动代码4 (部分代码)

代码五

如下图 (图8) 所示,主循环可以这样调用:

图8:驱动代码5
图8:驱动代码5

其中,这段代码有两个值得注意的地方。

第一,ADMT4000 的粗计数单位是四分之一圈,即 90°,并不是普通的整数圈数。如果直接用“四分之一圈计数 + 单圈角度”相加,会重复计算部分角度。代码采用“寻找最接近粗位置的等价精细角度”来恢复连续绝对角度。

第二,CRC 正确也不等于数据完全正常。CRC 只说明通信帧没有被破坏;FAULT、生命周期计数、无效圈数和机械位置合理性仍然需要单独检查。

  

五、初始化、配置和标定应怎样安排

一个适合实际产品的启动流程可以保持得很简单:

图9:ADMT4000 上电与位置有效判定流程
图9:ADMT4000 上电与位置有效判定流程

ADI 官方驱动支持两种转换方式:

  • 连续模式下,传感器持续更新测量值,STM32 定时读取即可,适合周期性位置控制。
  • 单次模式下,STM32 需要通过 CNV 引脚或 CNVPAGE 寄存器启动转换,等待转换完成后再读取数据,适合采样时间需要与其他外设严格同步的系统。

ADMT4000 的 Page 0 主要放置测量数据,例如角度、正弦、余弦、磁场幅值和温度;Page 2 主要用于工作模式、GPIO、滤波和谐波校准配置。Page 2 的部分配置受 ECC 保护。修改这些寄存器时,不能简单地“写完就结束”。官方驱动采用的基本流程是:

图10:ADMT4000 配置寄存器与 ECC 更新流程
图10:ADMT4000 配置寄存器与 ECC 更新流程

这也是不建议从零重写完整驱动的原因。GPIO、滤波或谐波系数只写错一个步骤,就可能触发 NVM CRC、ECC 或配置故障。STM32 项目可以直接复用官方 admt4000.c 和 admt4000.h,把 no_os_spi_write_and_read()、GPIO 和延时函数替换成 HAL 实现。

角度标定则应按照 UG-2323 完成。ADMT4000 支持 H1、H2、H3 和 H8 谐波补偿,主要用于降低磁体偏心、安装误差和磁场非理想性带来的周期角度误差。标定系数应来自实际测量,不应使用文章里的示例数值直接写入产品。

磁复位也不是普通初始化步骤。只有检测到 GMR 参考电阻或圈计数相关故障,或者产品维护流程明确要求重新建立磁状态时,才应按照 AN-2610 执行复位,并在复位后重新配置和确认绝对位置。

实际调试时,可以先做三项测试:

  1. 固定磁体,连续读取角度,观察 CRC 和生命周期计数是否正常;
  2. 缓慢旋转磁体,检查 0°、90°、180°、270°和 360°附近是否连续;
  3. 给 ADMT4000 断电,在断电期间旋转若干圈,再上电检查绝对位置是否恢复正确。

调试日志至少应保存四分之一圈原始值、12 位角度、连续绝对角度、CRC 结果和 FAULT 寄存器。只打印最终角度,一旦发生跳变,很难判断问题来自磁路、SPI、数据解析还是位置合成。

对应开发板演示:

图11:基于 STM32 的 ADMT4000 开发板演示
图11:基于 STM32 的 ADMT4000 开发板演示

  

六、总结

ADMT4000 的软件设计核心并不复杂:STM32 通过 SPI 读取粗位置和精细角度,验证 CRC 与故障状态,再把两者组合成连续绝对位置。真正容易出问题的地方,是把四分之一圈计数误当成整数圈数,或者在写入配置寄存器后没有正确更新 ECC。

ADI 已经提供了数据手册、软件包说明、标定指南、STM32 示例工程和正式 no-OS 驱动。项目开发时,以官方代码为协议依据,用 STM32 HAL 替换底层接口,会比重新猜测寄存器和通信流程可靠得多。

本文依据 ADI 产品页、ADMT4000 数据手册 Rev.C、UG-2271、UG-2323,以及 ADI no-OS GitHub 驱动整理。ADI 可能继续更新数据手册和代码,正式设计时请以产品页上的最新版本为准。

 

欲了解关于更多 ADI 相关方案或技术信息,请与骏龙科技当地的办事处联系或点击下方「联系我们」,提交您的需求,骏龙科技公司愿意为您提供更详细的技术解答。

 

相关阅读

《面向人形机器人的线性关节模组 (上) ——直线关节与 ADI ADMT4000 高精度位置记忆方案》

资源下载

更多信息: