一、任务介绍
多圈角度读取与断电记忆验证
- 手动旋转磁体,通过串口实时输出 ADMT4000 传感器的旋转圈数与角度数据;
- 测试设备断电重启后,数据是否保持一致
- 验证断电间歇期间,传感器能否正常记录磁体累计旋转次数。
二、项目描述

本项目基于 CH32V103 主控芯片核心板,通过 SPI 总线与 ADMT4000 传感器通信,实时采集电机旋转圈数、角度及温度数据;同时通过串口与电脑终端交互,将上述数据实时打印输出,并完成断电数据保持功能验证。
三、简短的硬件介绍
1.ADI ADMT4000磁传感器模块

ADMT4000 是ADI(亚德诺)推出的真掉电记忆多圈磁角度传感器,无需电池 / 齿轮,断电仍能记录旋转圈数,上电直接输出绝对位置,专为工业无刷电机、执行器、旋转定位设计。
核心定位与亮点
- 真上电多圈:断电不丢圈数,上电即读绝对位置,无需电池、无需额外计数。
- 46 圈测量范围:总角度 **>16560°,单圈精度±0.25°**。
- 非接触磁传感:GMR 多圈计数 + AMR 角度检测 + GMR 象限判别,抗震动、油污、粉尘。
- 高速采样:100 kSPS更新率,适合高速电机闭环控制。
- 宽温工业级:结温 **−40°C ~ +150°C**,24 引脚 TSSOP 封装。
- 数字接口:SPI(Mode 0),支持 1.7V~5.5V 逻辑电平,自带 CRC 与 ECC 校验。
2.CH32V103评估板

CH32V103R8 评估板是沁恒 WCH推出的32 位 RISC‑V 通用 MCU 开发板,搭载CH32V103R8T6主控,面向工业控制、电机驱动、传感器采集、USB 设备等场景,开箱即用、成本极低、生态完善。
核心定位
- 主控:CH32V103R8T6(LQFP64M)
- 内核:沁恒自研 RISC‑V3A(RV32IMAC),最高 80MHz
- 用途:RISC‑V 入门学习、外设验证、USB / 电机 / ADC 项目原型开发
- 特点:Type‑C 供电、GPIO 全引出
四、方案框图及设计思路

采用 CH32V103R8 + ADMT4000 实现多圈绝对角度实时采集系统;
通过SPI读取ADMT4000寄存器相关数据,通过串口与电脑交互,实时显示当前数据。
五、软件流程图及关键代码说明

1.相关初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//中断初始化
SystemCoreClockUpdate(); //时钟初始化
Delay_Init(); //延时初始化
USART_Printf_Init(115200); //串口初始化 115200
/* 初始化 ADMT4000 硬件接口 */
ADMT4000_Init();
2.检测SPI数据是否通讯正常
/* 1. 验证 SPI 通信:读取唯一 ID (UNIQID3 应为 0x0002) */
uint16_t id3 = ADMT4000_ReadRegister(0x02, ADMT4000_PAGE2_UNIQID3);
printf("UNIQID3: 0x%04X (expected 0x0002)\r\n", id3);
if (id3 != 0x0002) {
printf("SPI Communication FAILED! Check wiring (especially Pin4 pull-up).\r\n");
while(1); /* 通信失败,停止执行 */
}
3.清除上电告警
/* 2. 上电后故障寄存器为 0xFFFF,先读取确认,然后清除 */
printf("FAULT at power-up: 0x%04X\r\n", ADMT4000_ReadFault());
ADMT4000_ClearFault();
printf("FAULT after clear: 0x%04X\r\n", ADMT4000_ReadFault());
4.配置ADMT4000寄存器并启动转换
/* 3. 配置工作模式:连续转换 + 角度滤波器使能
按数据手册流程:先中止当前转换,修改寄存器,再启动。 */
ADMT4000_AbortConversion(0x02); /* 切换到页 0x02 并中止 */
uint16_t gen = ADMT4000_ReadRegister(0x02, ADMT4000_PAGE2_GENERAL);
gen &= ~ADMT4000_GENERAL_CNVMDE; /* Bit0=0 -> 连续转换模式 */
gen |= ADMT4000_GENERAL_ANGLFILT; /* Bit12=1 -> 使能 IIR 滤波器 */
/* Bit9 必须为 1,Bit5:4 必须为 11(保留位),此处维持默认 */
ADMT4000_WriteRegister(0x02, ADMT4000_PAGE2_GENERAL, gen);
ADMT4000_StartConversion(0x02); /* 在页 0x02 启动转换 */
printf("Conversion started (continuous mode, filter enabled).\r\n");
5.获取各种测量值
/* 获取各种测量值 */
float angle = ADMT4000_GetAngle(); /* 单圈角度 0~360° */
float abs_angle = ADMT4000_GetAbsoluteAngle();/* 多圈总角度 */
int turns = (int)(abs_angle / 360.0f); /* 整圈数 */
float turn_angle = abs_angle - turns * 360.0f; /* 圈内角度 */
float temp = ADMT4000_GetTemperature(); /* 芯片温度 */
6.串口打印相关数据
/* 打印输出(避免使用 %f 以减小代码体积) */
printf("Ang:%3d.%02ddeg Turns:%2d TAng:%3d.%02ddeg Abs:%5d.%02ddeg T:%3d.%02dC\r\n",
(int)(angle * 100) / 100, (int)(angle * 100) % 100, /* 角度整数/小数 */
turns,
(int)(turn_angle * 100) / 100, (int)(turn_angle * 100) % 100,
(int)(abs_angle * 100) / 100, (int)(abs_angle * 100) % 100,
(int)(temp * 100) / 100, (int)(temp * 100) % 100);
7.检测是否有故障
/* 检查故障状态 */
uint16_t fault = ADMT4000_ReadFault();
if (fault) {
printf("FAULT: 0x%04X\r\n", fault);
/* 尝试清除故障(如果故障条件消失,清除后不再出现) */
ADMT4000_ClearFault();
}
六、实物演示及说明
ADMT4000 引脚 | 功能 | 连接至 CH32V103 |
|---|---|---|
18 (SCLK) | 时钟 | PA5 (SPI1_SCK) |
17 (SDO) | 数据输出 | PA6 (SPI1_MISO) |
16 (SDI) | 数据输入 | PA7 (SPI1_MOSI) |
15 (CS) | 片选 | PA4 (GPIO 控制) |
注意:SDO 是 ADMT4000 的输出,对应 MCU 的 MISO;SDI 是输入,对应 MOSI。
1.SPI通讯异常,出发初始化校验失败告警

只接通核心板电源,未接通ADMT4000,触发spi通讯错误告警。

2.SPI通讯正常,串口实时打印单圈角度、圈数、圈内角度、总角度、温度

接通ADMT4000,并复位,spi验证通过,开始实时打印数据
3.旋转电机,检测角度及圈数变化

4.测试设备断电重启后,数据是否保持一致


确认断电数据保持功能成功
5.验证断电间歇期间,传感器能否正常记录磁体累计旋转次数。(手动旋转电机两圈)

手动断电,并旋转电机2圈

确认磁圈保持功能验证成功
七、对本次活动的心得体会
本次实验让我掌握了 ADMT4000 多圈磁传感器与 CH32V103 的应用,实现了角度读取与断电记忆验证。我加深了对 SPI 通信、嵌入式编程和绝对位置传感的理解,提升了软硬件调试能力,真切体会到掉电记忆传感器在工业定位中的实用价值。