2026 ADI机器控制设计竞赛 - 基于ADMT4000模块完成旋转方向与转速检测的任务
该项目使用了ADMT4000 和GD32F450,实现了旋转方向检测的设计,它的主要功能为:将旋转方向进行检测并输出。
标签
嵌入式系统
寒彬彬
更新2026-05-11
5

任务介绍

基于 ADMT4000 传感器模块读取多圈绝对角度,将角度实时换算为行驶距离并计算累计里程,通过串口实时输出显示。支持掉电数据保持功能,重启后里程值不丢失并可继续累加。累计里程范围限定在 ADMT4000 的 46 圈等效距离内,确保数据有效可靠。

项目描述(项目的整体介绍)

使用GD32F450系列单片机用来作为系统的主控,读取 ADMT4000 传感器的绝对角度以及转动从而检测出

简短的硬件介绍(所有使用到的硬件均可介绍)

1、ADMT4000 传感器模块:ADMT4000 是一种磁转数传感器,即使在设备断电时也能够记录磁系统的旋转次数,模块将标准的SPI通信接口引出,并集成了磁畴复位电路很大程度节省了开发的时间

2、GD32F450最小系统:是基于 ARM® Cortex®- M4 RISC 内核的 32 位通用微控制器。Cortex®- M4 内核配备浮点单元(FPU),工作频率为200 MHz,外设丰富。

方案框图和设计思路

图片.png

方案框图

设计思路:本次设计以 GD32 单片机为核心,通过 SPI 通信采集 ADMT4000 多圈角度数据,借助其断电自存储特性保存圈数信息。搭配步进电机模拟车轮转动,结合预设轮周长换算行驶里程,由串口实时打印累计里程。设备重启自动延续里程计数,严格限定在传感器 46 圈测量量程内运行。

连线示意图

图片.png

示意图

软件说明

图片.png

软件流程图

传感器关键代码讲解

1、SPI初始化

void Bsp_SPI_Init()
{
//SPI参数定义结构体
spi_parameter_struct spi_init_struct;

rcu_periph_clock_enable(AMDI_SPI_RCU); // 使能SPI3

spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; // 传输模式全双工
spi_init_struct.device_mode = SPI_MASTER; // 配置为主机
spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT; // 8位数据
spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE; //极性相位 :Mode0
spi_init_struct.nss = SPI_NSS_SOFT; //软件cs
spi_init_struct.prescale = SPI_PSC_32; //SPI时钟预分频为32 : 100/32=3.125MHz
spi_init_struct.endian = SPI_ENDIAN_MSB; //高位在前
//将参数填入SPI3
spi_init(AMDI_SPI_NUM, &spi_init_struct);
//使能SPI
spi_enable(AMDI_SPI_NUM);
}

2、读取传感器寄存器

①底层发送并接收函数

/*
* 函数描述: SPI 发送并接收一个字节
* 函数输入: uint32_t spi_periph : SPI外设编号
* uint8_t tx_data : 要发送的数据,
* 函数输出: uint16_t : 接收到的数据
*/
uint16_t BSP_SPI_RW_Byte(uint32_t spi_periph, uint8_t tx_data)
{
while(RESET == spi_i2s_flag_get(spi_periph, SPI_FLAG_TBE)); //??
spi_i2s_data_transmit(spi_periph, tx_data);

while(RESET == spi_i2s_flag_get(spi_periph, SPI_FLAG_RBNE));
return spi_i2s_data_receive(spi_periph);
}

②应用读取寄存器函数

/*
* 函数描述: 使用SPI3写入AMTD4000的寄存器
(每个寄存器都是4字节但SPI是标准的1字节的所以要调用4次发送和接收的函数)
* 函数输入: uint8_t addr : 准备写入的寄存器地址,uint16_t dat : 准备写入的寄存器的值
* 函数输出: none
*/
void ADMT4000_WriteReg(uint8_t addr, uint16_t data)
{
uint32_t tx = 0;
uint8_t i;
/* 写入的标志 准备写入的地址 准备写入的数据 */
tx = ((uint32_t)0x03 << 30) | ((uint32_t)(addr & 0x3F) << 24) | ((uint32_t)data << 8);
ADMT_GPIO_CS_RESET;
for(i=0; i<4; i++)
{
uint8_t send = (tx >> (24 - i*8)) & 0xFF;
BSP_SPI_RW_Byte(AMDI_SPI_NUM, send);
}
ADMT_GPIO_CS_SET;
}
/*
* 函数描述: 使用SPI3读取AMTD4000的寄存器
(每个寄存器都是4字节但SPI是标准的1字节的所以要调用4次发送和接收的函数)
* 函数输入: uint8_t addr : 要读取的寄存器地址,uint8_t *data 接收到的数据
* 函数输出: none
*/
void ADMT4000_ReadReg(uint8_t addr, uint8_t *data)
{
uint32_t tx[4]; //发送的缓存
uint8_t i;
tx[0] = 0x80 | (addr & 0x3F);
tx[1] = 0;
tx[2] = 0;
tx[3] = 0;
ADMT_GPIO_CS_RESET;
for(i=0; i<4; i++)
{
*(data + i) = BSP_SPI_RW_Byte(AMDI_SPI_NUM, *(tx + i));
}
ADMT_GPIO_CS_SET;
}

实物演示及说明

0e983780d7727977ae04d37a6e1dc8b2.jpg90c49158d4f64fca023cbc205cf55389.jpg

图片.png

按照以上硬件连线图进行连接,将磁铁放到传感器背面进行检测进行左右的旋转观察角度和圈数的变化即可检测旋转的方向

对本次活动的心得体会

通过本次项目实践,我完成了 GD32 与 ADMT4000 的 SPI 通信开发,掌握了多圈角度采集与里程换算方法。利用传感器断电自存储特性,实现旋转检测、连续累计功能。结合步进电机模拟运动,加深了嵌入式数据采集、算法换算和串口调试的理解,提升了硬件驱动与程序综合开发能力。

附件下载
GD_SPI.zip
团队介绍
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号