一、项目描述
本次项目实现的是基于ADMT4000实现磁转数据的采集显示,对应的是任务1,完成ADMT4000电路板和测试结构的设计和实现,使用任意MCU或者Linux SoC设计一个程序读取出旋转圈数和角度数据,并显示在彩色LCD屏上。这里实际上完成的子主要内容就是ADMT4000的驱动,读取相应的数据,然后通过对彩屏的驱动实现数据的可视化。
二、硬件介绍
传感器:
ADMT4000 是一种磁转数传感器,即使在设备断电时也能够记录磁系统的旋转次数。通电时可以查询该套件,以报告系统的绝对位置。绝对位置通过串行外设接口 (SPI) 报告。ADMT4000 最多可计数 46 圈外部磁场,以顺时针 (CW) 方向递增绝对位置计数。该套件包括三个磁传感器,一个用于计数系统旋转次数的巨磁电阻(GMR)转数计数传感器,一个 GMR 象限检测传感器和一个各向异性磁阻(AMR)角度传感器。AMR 角度传感器与 GMR 象限检测传感器结合使用,可确定系统在 360° 范围内的绝对位置。将 GMR 转数计数传感器输出与 AMR 角度传感器输出相结合,该套件就能以高角度精度报告系统的位置。
主控单元:
这是我们同期活动中该设计的一款主控板,主控单片机为STM32H503,STM32H503微控制器作为STM32高性能产品组合的新成员,展现了显著的增强功能与能效提升。该系列微控制器内置128 KB Flash存储器及32 KB RAM,确保了充足的数据存储与处理能力。其封装形式多样,涵盖25至64引脚规格,包括WLCSP、LQFP及UFQFPN等封装类型,满足了不同应用场景的需求。
显示屏:这里我们选用的是一款1.54寸的屏幕,控制器围殴ST7789,分辨率为240*240,数据接口为SPI。
三、软件流程及代码说明
软件流程图:
我们需要对基本的外设进行配置,然后对外接的模块继续初始化,这里主要涉及的就是屏幕,需要一些配置,实际上传感器不需要太多的初始化配置,直接读取数就可以,然后感觉精度对采集的数据进行转化,最后通过屏幕进行刷新显示。
这里主要涉及的传感器驱动部分的代码包括,读写寄存器数据与SPI接口的适配:
int ADMT4000_Send_Data(uint8_t REG,uint16_t data)
{
uint8_t SandData[4] = {0};
int result;
SandData[0] = REG;
SandData[0] |= 0x40;
SandData[1] = data>>8;
SandData[2] = data;
admt4000_compute_crc(SandData[0], data, 0x00,&SandData[3],1);
ADMT_SPICS_OUT0;
result = HAL_SPI_Transmit(&hspi2, SandData, 4, 100);
ADMT_SPICS_OUT1;
if (result!=HAL_OK)
return -1; //error
else
return 0; //Success
}
uint8_t ReceData[4] = {0};
int ADMT4000_Read_Data(uint8_t REG,uint16_t *data)
{
uint8_t SandData[4] = {0};
// uint8_t ReceData[4] = {0};
int result;
SandData[0] = REG;
SandData[0] |= 0x00;
ADMT_SPICS_OUT0;
result = HAL_SPI_TransmitReceive(&hspi2,SandData,ReceData,4,100);
ADMT_SPICS_OUT1;
*data = ReceData[1];
*data = (*data<<8)|ReceData[2];
if (result!=HAL_OK)
return -1; //error
else
return 0; //Success
}
然后是传感器的初始化以及对绝对数据和相对角度的读取:
void ADMT4000_Init(void)
{
ADMT4000_Read_Data(ADMT4000_REG_FAULT,&Rece_Data);
if(Rece_Data == 0xFFFF)
ADMT4000_Send_Data(ADMT4000_REG_FAULT,0);
ADMT4000_Read_Data(ADMT4000_REG_FAULT,&Rece_Data);
//
// ANGLE_data = (Rece_Data>>3)*360/4096;
}
void ADMT4000_GetANGLE(void)
{
ADMT4000_Read_Data(ADMT4000_REG_ANGLE,&Rece_Data);
ANGLE_data = (Rece_Data>>4)*360/4096;
}
void ADMT4000_GetABSANGLE(void)
{
ADMT4000_Read_Data(ADMT4000_REG_ABSANGLE,&Rece_Data);
TurnCnt = (Rece_Data>>8)/4;
ABSANGLE_data = (Rece_Data&0x3ff)*0.351;
}
四、功能展示
我们绘制的传感器板的效果如下:

通过将传感器放置在板子的中间位置,方便我们后续可能的结构设计。
下面是我们进行整体测试的连接效果图:

由于显示模块不是专门为这个主控板设计的,我们在驱动连接的时候是通过杜邦线进行的连接.传感器板固定在纸壳的表面,内部是一支笔,在笔的顶端放置了一个磁铁,我们通过旋转磁铁来让传感器数据采集发生变化。
五、项目中遇到的问题
估计这个问题只是在我这个项目实现过程中,问题就是当磁铁的中心轴与传感器的中心轴不统一的时候,其采集的磁通量代表的数据是不太准确的,这个与我们整个系统的结构有关,还有一个问题,就是其转数达到顶值之后不会再变化,我们需要对它进行一定的处理。
六、心得体会
ADI的这款磁转速传感器绝对属于非常顶尖的存在,非常感谢活动的成功举办,让我们有机会可以接触到更多先进的器件。本款传感器的控制相对来说也是比较简单的,不过adi的SPI通信大家需要好好的琢磨一下,可以借助逻辑分析仪等工具对通信过程进行监控,判断是否符合时序的要求。通过对不同器件的驱动,让我们可以了解到更多的注意事项,再次感谢活动的成功举办。