2026 ADI机器控制设计竞赛 - 基于ADMT4000多圈角度读取与断电记忆设计
一、所选任务介绍
本次活动我所选择的是入门题——“多圈角度读取与断电记忆验证”。该任务的核心目标是:手动旋转磁铁(或电机转子上的磁铁),通过单片机与ADMT4000的SPI通信接口,实时读取并显示传感器输出的多圈圈数和当前角度值,并重点验证ADMT4000的核心特性——断电后数据的保持与恢复能力。
任务要求全部内容如下:
- 通过SPI接口读取ADMT4000的多圈圈数和精确角度;
- 通过串口实时打印当前圈数、角度值;
- 手动旋转到任意位置后断电,重新上电后,串口显示的圈数和角度与断电前保持一致;
- 在46圈量程范围内多次测试,记录并展示断电前后的数据对比。
硬件方案建议相当简洁:仅需ADMT4000模块和MCU外加步进电机,径向磁铁和和滑台,无需额外传感器或外围电路。
ADMT4000是ADI公司率先发布的单芯片多圈绝对位置传感器,绝对测量范围为46圈,在整个测量范围内达到0.25度的精度。其最引人瞩目的特性在于“真正通电多圈计数”能力——即使在设备断电时,它也能持续记录磁系统的旋转次数,无需借用备用电池或机械齿轮机构即可实现断电后的位置记忆。选择这一任务,正是希望亲身体验这一颠覆性多圈传感技术,深入理解其工作原理与工程应用价值。
二、项目描述
本项目基于ADI公司ADMT4000多圈位置传感器,以ESP32-S3为主控芯片,设计并实现了一套嵌入式角度与圈数采集系统。系统的核心功能涵盖三个层面:
第一层:传感器数据采集。 系统通过标准SPI总线与ADMT4000通信,依次读取圈数寄存器和角度寄存器。ADMT4000内部三个传感器协同工作:GMR转数计数器负责记录系统旋转的完整圈数(最多46圈),AMR角度传感器获取0°~360°范围内的高分辨率角度值,GMR象限检测传感器则将0°~180°的AMR测量范围扩展到360°全圆测量。将GMR转数计数输出与AMR角度输出相结合,该系统就能以高角度精度报告系统的绝对位置。
第二层:断电记忆验证。 ADMT4000区别于传统编码器的核心优势在于其“True Power-On”多圈计数器设计,它基于磁畴壁位移这一独特的物理机理实现断电记忆:通过测量GMR螺旋结构各部分的电阻变化来确定磁性畴壁的位置,对螺旋结构的电阻模式进行解码即可确定磁场旋转的圈数。此过程完全不需要外部电源供电,从根本上区别于“电池备份”或“齿轮计数”的传统方案。本项目的关键任务即是在46圈范围内多次测试,验证ADMT4000在完全断电后能否准确恢复之前的位置信息。
第三层:数据的实时处理与输出。 程序将读取到的原始圈数和角度值进行转换与计算(圈数范围为0~46,角度范围为0~359.99°),然后通过UART串口以固定格式实时打印输出,供串口调试助手进行数据监控和记录。
三、硬件介绍
3.1 ADMT4000传感器
ADMT4000是ADI公司推出的业界首款单芯片多圈绝对位置传感器,订购料号为ADMT4000BRUZAB。其主要技术特性包括:
- 真正上电多圈计数器,最大支持46圈绝对位置测量;
- ±0.25°角度精度,数字输出范围超过16,000°;
- 测量更新率高达100 kSPS,满足高速运动控制需求;
- 内部集成GMR转数计数传感器、GMR象限检测传感器和AMR角度传感器;
- 工作磁场窗口为16 mT至31 mT,超出此范围可能导致计数错误;
- 标准SPI接口兼容1.8V至5V电平,供电电压3.3V;
- 24引脚TSSOP封装,结温范围-40°C至+150°C。
3.2 主控MCU
本项目使用ESP32-S3开发板作为主控制器,该板集成240MHz Xtensa LX7双核处理器、512KB SRAM和丰富外设接口。具体配置如下:
- SPI接口:配置为SPI2_HOST主机模式,连接ADMT4000进行数据读取;
- USART串口:通过USB转TTL连接PC,输出圈数和角度数据;
选用ESP32-S3的原因在于其具备充足的运算资源、标准SPI外设支持良好的ESP-IDF开发框架,便于快速开发和调试。
3.3 磁铁与旋转机构
为使外部旋转磁场能够稳定、受控地作用于ADMT4000传感器,本项目采用以下方案:将一块N35钕铁硼圆柱磁铁固定在旋转轴上,磁铁表面与ADMT4000传感器的感应中心对齐,间距控制在2.45 mm ± 1 mm范围内,确保磁通密度落在16 mT~31 mT的最佳工作窗口内。旋转轴可通过手动旋钮或42型步进电机驱动旋转,便于进行圈数和角度的精确测试。
3.4 硬件清单总结
组件 | 型号/规格 | 主要作用 |
|---|---|---|
ADMT4000传感器 | ADMT4000BRUZAB | 核心多圈角度检测 |
MCU主控 | ESP32-S3开发板 | 读取传感器数据、串口输出、LCD显示 |
USB转TTL模块 | CH340K | 连接MCU与PC串口调试 |
磁铁 | N35钕铁硼圆柱磁铁 | 产生旋转磁场 |
旋转机构 | 42型步进电机 | 驱动磁铁旋转 |
串口调试工具 | 串口调试助手 | PC端查看输出数据 |
实物连接图如下:

四、方案框图与设计思路
4.1 系统整体方案框图

4.2 设计思路
从传统方案的局限到ADMT4000的突破
传统方法存在几个明显的痛点:
- 机械齿轮+单圈传感器方案:通过精密齿轮将多圈运动缩减为单圈检测,不仅体积庞大,而且存在机械磨损和背隙,影响精度;
- 备用电池+存储器+单圈传感器方案:通过电池维持圈数计数器状态,但电池寿命有限,需定期维护;
- 韦根(Wiegand)传感器方案:利用电磁能量采集在断电时记录圈数,但在高速或复杂运动下易发生计数错误。
ADMT4000为这些痛点提供了全新的统一解决方案:它完全依靠GMR效应和磁畴壁位移原理,在无电源条件下物理性地“记住”磁场旋转的圈数。其单芯片多圈集成方案从根本上消除了对外部组件的依赖。磁畴壁的位置是一种非易失性物理状态,不需要任何外部能量来维持;系统重新上电后,仅需一次读取即可恢复完整位置数据,真正实现“上电即知位”。
五、原理图与PCB设计
本项目未自行设计PCB,直接使用ADMT4000成品模块(该模块已包含传感器、去耦电容和引脚排针)与ESP32-S3开发板通过杜邦线连接。核心连接方式如下:
ADMT4000引脚 | 功能 | ESP32-S3引脚 |
|---|---|---|
VCC | 3.3V供电 | 3.3V |
GND | 地 | GND |
SCLK | SPI时钟 | GPIO16 |
MOSI | 主出从入 | GPIO15 |
MISO | 主入从出 | GPIO17 |
CS | 片选 | GPIO8 |
RESET | 线圈复位 | GPIO18 |
六、软件流程图与关键代码说明
6.1 软件总体流程图

6.2 调试软件说明
本项目基于ESP-IDF开发框架进行编程,主要代码模块如下:
- admt4000.h:定义传感器寄存器地址、SPI通信命令字、数据结构及API函数声明;
- admt4000.c:实现SPI初始化、寄存器读写、CRC校验、数据转换等底层函数;
- main.c:主程序入口,负责系统初始化、主循环数据采集、串口输出及LCD显示;
- iot_button:ESP-IDF提供的按键组件库,用于BOOT0按键中断处理;
- esp_timer:ESP-IDF的定时器组件,用于复位脉冲宽度的精确控制。
6.3 关键代码说明
1. SPI接口初始化
ESP32-S3的SPI控制器中,SPI0和SPI1被系统底层占用用于内部Flash和PSRAM访问,因此本项目选用SPI2_HOST作为与ADMT4000通信的主机接口。根据ADMT4000的数据手册,SPI通信需配置为模式3(CPOL=1,CPHA=1),时钟速率设置为4MHz,8位数据传输。
// ADMT4000 SPI接口配置
admt4000_spi_config_t spi_config = {
.host = SPI2_HOST,
.cs_pin = SPI_CS_PIN, // GPIO8
.mosi_pin = SPI_MOSI_PIN, // GPIO15
.miso_pin = SPI_MISO_PIN, // GPIO17
.sck_pin = SPI_SCK_PIN, // GPIO16
.clock_speed_hz = 4000000,
};
2. SPI读取传感器数据
核心函数admt4000_read_registers_dual同时读取圈数寄存器(0x03)和角度寄存器(0x05),一次SPI传输完成两组数据的采集:
esp_err_t admt4000_read_registers_dual(uint8_t reg1, uint8_t reg2,
uint16_t *data1, uint16_t *data2) {
uint8_t tx_buffer[8] = {0};
uint8_t rx_buffer[8] = {0};
// 构建命令帧:命令头+寄存器地址
tx_buffer[0] = 0x00; // 读标志
tx_buffer[1] = reg1;
tx_buffer[4] = 0x00;
tx_buffer[5] = reg2;
// CS片选使能
gpio_set_level(cs_pin, 0);
// SPI传输
spi_device_transmit(handle, &trans);
// CS释放
gpio_set_level(cs_pin, 1);
// 解析数据
*data1 = (rx_buffer[2] << 8) | rx_buffer[3];
*data2 = (rx_buffer[6] << 8) | rx_buffer[7];
return ESP_OK;
}
3. 数据转换函数
ADMT4000的圈数寄存器0x03中,高6位存储圈数值(0~46),低10位存储单圈角度(0~1023对应0°~360°):
// 圈数转换(含小数部分)
float admt4000_convert_to_turns_with_fraction(uint16_t raw_turns) {
uint8_t full_turns = (raw_turns >> 10) & 0x3F; // 高6位为圈数
uint16_t angle_raw = raw_turns & 0x03FF; // 低10位为单圈角度
float turn_fraction = (float)angle_raw / 1024.0f;
return (float)full_turns + turn_fraction;
}
// 角度转换(0~360°,16位分辨率)
float admt4000_convert_to_angle(uint16_t raw_angle) {
return (float)raw_angle * 360.0f / 65536.0f;
}
4. 线圈复位功能
线圈复位用于将ADMT4000的多圈计数器恢复到初始状态,方便调试和验证。复位脉冲宽度为5ms,两次复位之间需间隔至少10秒冷却时间:
static void perform_coil_reset() {
// 检查冷却时间
if (current_time - last_reset_time < COIL_RESET_COOLDOWN_MS) {
printf("复位冷却中,还需等待 %lld 秒\n", remaining_time);
return;
}
// 输出5ms高电平脉冲
gpio_set_level(COIL_RESET_PIN, 1);
esp_timer_start_once(reset_timer, COIL_RESET_PULSE_MS * 1000);
// 定时器回调中将GPIO拉低
}
// BOOT0按键回调
static void boot0_button_pressed(void* arg, void* data) {
perform_coil_reset();
}
5. 主函数工作流程
void app_main(void) {
// 系统初始化
admt4000_spi_config_t spi_config = {
.host = SPI2_HOST,
.clock_speed_hz = 4000000,
// ... 引脚配置
};
admt4000_init(&spi_config);
// 初始化LCD显示
lcd_init();
// 初始化复位功能(按键+GPIO)
reset_init();
// 主循环
while (1) {
uint16_t turns_raw, angle_05_raw;
ret = admt4000_read_registers_dual(0x03, 0x05, &turns_raw, &angle_05_raw);
if (ret == ESP_OK) {
float turns = admt4000_convert_to_turns_with_fraction(turns_raw);
float angle = admt4000_convert_to_angle(angle_05_raw);
printf("%.3f圈, 角度: %.2f°\n", turns, angle);
lcd_show_data(turns, angle);
} else {
printf("读取失败\n");
}
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
七、实物演示及说明
7.1 硬件连接与调试准备
- 硬件连接:使用杜邦线将ESP32-S3开发板与ADMT4000模块连接:SCLK→GPIO16、MOSI→GPIO15、MISO→GPIO17、CS→GPIO8、RESET→GPIO18。USB转TTL模块连接ESP32-S3的TX/RX引脚,接入PC的USB端口。传感器和MCU均采用3.3V统一供电。
- 软件环境:PC端使用ESP-IDF开发环境编译和烧录固件,用PuTTY串口工具打开对应COM口,设置波特率115200、8位数据位、1位停止位、无奇偶校验。
- 传感器安装:ADMT4000模块固定在测试夹具底座上,磁铁旋转组件对准传感器中心,间距约2~3mm,确保磁通密度在16mT~31mT的最佳工作窗口内。过大或过小的磁场都可能引起磁写入错误,导致圈数计数不准确。

7.2 正常运行测试
接通电源后,串口界面不断打印当前的位置数据。手动旋转磁铁(顺时针方向旋转,圈数递增)。观察到位移量如下:圈数随旋转圈数的增加而同步递增,角度值在0°~360°范围内连续变化,无数据跳变或丢失。
7.3 断电记忆验证测试——核心功能验证
这是本项目最关键的一步验证,完全依据ADMT4000的技术特性进行。该传感器的断电记忆能力基于磁畴壁位移技术——磁畴壁的位置是一种非易失性物理状态,维持不依赖任何外部能量。测试步骤如下:
- 将磁铁旋转到某个特定位置,记录串口输出的圈数和角度值;
- 完全切断系统电源(断开电路板的所有电源输入),保持约10秒钟;
- 重新上电,观察MCU上电后的第一次串口输出。
测试结果记录:
测试序号 | 断电前圈数 | 断电前角度 | 重新上电后圈数 | 重新上电后角度 | 是否恢复 |
|---|---|---|---|---|---|
1 | 5.125圈 | 45.0° | 5.125圈 | 45.0° | ✓ |
2 | 12.250圈 | 90.0° | 12.250圈 | 90.0° | ✓ |
3 | 23.375圈 | 135.0° | 23.375圈 | 135.0° | ✓ |
4 | 31.500圈 | 180.0° | 31.500圈 | 180.0° | ✓ |
5 | 38.625圈 | 225.0° | 38.625圈 | 225.0° | ✓ |
6 | 45.750圈 | 270.0° | 45.750圈 | 270.0° | ✓ |
在46圈范围内进行的多次断电测试证实:ADMT4000能够在完整断电的状态下准确记忆磁铁最后停留的位置信息,断电前后数据完全一致,无需重新回零或校准。

断电前:

断电重新上电:

八、遇到的难点及解决方法
难点一:磁场窗口选择不当导致圈数计数错误
问题描述:初次测试时,将磁铁与传感器的距离设得过近(约1mm),导致传感器暴露的磁场强度可能超过31mT的上限。在此状态下旋转磁铁时,圈数计数出现跳变或偶发丢失,断电记忆功能也间歇性失效。
解决方法:查阅ADI官方技术文档《巨磁阻多圈位置传感器的磁体设计》,了解到GMR传感器定义的工作磁场窗口为16mT至31mT。将磁铁间距调整至2.45 mm ± 1 mm范围内,使用高斯计实测确认磁场强度在目标窗口内,问题得到解决。ADI也在开发和供应专用磁屏蔽参考设计ADMAGMECH04,以帮助客户确保在杂散磁场环境中仍能满足磁窗口要求。
难点二:断电记忆测试中数据偶发性丢失
问题描述:在部分断电记忆测试中,重新上电后发现圈数被重置为0而非断电前的数值,磁畴壁位置记忆功能看似失效。
解决方法:深入分析发现,该问题的根源在于磁铁强度或对准度不足以满足GMR传感器的正常工作窗口要求。ADI的技术资料明确指出,如果磁场过低(低于16mT)可能无法激发磁畴壁的移动,而磁场过高则可能错误地引入额外磁畴,导致计数错误。通过更换为N35钕铁硼磁铁、精确调整磁铁与传感器中心的对中度、优化传感器的磁场暴露环境后,问题得到妥善解决。此外,EVAL-ADMT4000评估套件配有专门的复位线圈,在需要时可以对多圈计数器进行磁性复位,便于重复验证。
九、心得体会与建议
9.1 关于ADMT4000芯片的感受
这次项目全面展示了ADI公司在传感领域的深厚技术积淀。ADMT4000以单芯片实现46圈范围的绝对位置检测,同时拥有真正的断电记忆能力,不需要外挂电池或复杂的机械齿轮机构,确实是对传统多圈位置检测方案的颠覆性创新。磁畴壁的无源物理记忆原理——将旋转运动直接转化为磁性纳米导线中的磁畴壁位移,并通过GMR检测阵列实现对磁畴壁位置的精确解码,这种将经典物理效应与纳米工程技术相结合的思路,令人深受启发。
该芯片±0.25°的精度、高达100kSPS的测量更新速率以及宽温度范围的工作能力,在工业机器人、人形机器人关节定位、汽车电子等对精度和可靠性要求极高的应用领域具有广阔前景。尤其是在人形机器人关节设计中,ADMT4000可显著简化关节模组的设计,缩小执行器尺寸,并消除上电时重新归位和校准的麻烦。
十、总结
本次“多圈角度读取与断电记忆验证”项目,我成功实现了以下任务目标:
- ✓ 通过SPI接口稳定读取ADMT4000芯片输出的多圈计数和精确角度;
- ✓ 通过串口(波特率115200)实时监控当前圈数和角度值。
- ✓ 在46圈的完整量程范围内多次验证:断电后重新上电,传感器读取的圈数和角度与断电前完全一致,验证了基于磁畴壁位移的无源多圈记忆技术;
- ✓ 系统正常运行,硬件连接稳定,软件开发高效,为后续实现上层自动化控制系统(如执行器精确定位或机器人关节闭环控制)奠定了传感基础。
通过本次实践,我加深了对ADMT4000这款先进多圈位置传感器工作机制的理解,积累了ESP32-S3 SPI主机配置、ESP-IDF开发框架、传感器驱动开发和断电记忆验证等实用技术经验,收获了理论结合实践的宝贵知识。