一、项目介绍及设计思路
本次的活动任务是围绕着ADMT4000传感器进行的,主要完成ADMT4000电路板和测试结构的设计和实现,使用任意使用任意MCU或者Linux SoC设计一个程序读取出旋转圈数和角度数据,并显示在彩色LCD屏上。这里的实现的点主要有三个,一个是结构方面的,我们需要进行ADMT4000电路板的设计,前提是测试结构的设计,我们参考了ADMT4000官方测试板的一个思路,使用旋钮的方式进行转动,进而带动磁场变化,达到传感器数据变化的目的,这里我们通过3D打印实现基本结构;第二个任务就是ADMT4000的驱动设计,我们通过对数据手册的解读发现对于任务的实现(读取出旋转圈数和角度数据),实际上设计的寄存器并不多,主要对这些寄存器进行操作就行,可以通过AI进行辅助的设计;第三个任务就是彩屏显示,由于手里没有彩屏模块,不过正好去年得到过一个十二指神探彩屏版,正好可以利用上,页面显示驱动非常方便。
到这里我们对任务继续了一下分解,从而对我们想要实现的内容也更加清晰了,逐个进行实现就可以了。
二、硬件介绍
1、 ADMT4000传感器
ADMT4000 是一种磁转数传感器,即使在设备断电时也能够记录磁系统的旋转次数。通电时可以查询该套件,以报告系统的绝对位置。绝对位置通过串行外设接口 (SPI) 报告。ADMT4000 最多可计数 46 圈外部磁场,以顺时针 (CW) 方向递增绝对位置计数。该套件包括三个磁传感器,一个用于计数系统旋转次数的巨磁电阻(GMR)转数计数传感器,一个 GMR 象限检测传感器和一个各向异性磁阻(AMR)角度传感器。AMR 角度传感器与 GMR 象限检测传感器结合使用,可确定系统在 360° 范围内的绝对位置。将 GMR 转数计数传感器输出与 AMR 角度传感器输出相结合,该套件就能以高角度精度报告系统的位置。
2、传感器板设计j及测试结构
为了确保驱动测试的稳定性与精准度,我们设计了一个组合结构,通过转动的方式进行变化测试,类似官方板子上旋钮。根据结构的固定设计传感器电路板,确保ADMT4000能够在旋转过程中能准确获取数据。
3、 显示平台

带屏版的12指神探,它是在原板基础上,配备了一块240*240分辨率的LCD彩屏以及两个可程控按键和一个拨轮,丰富了人机交互功能,方便信息观察、界面切换等使用方式。此外还配备了白色外壳,精心设计的包装不仅使板卡日常使用时更加美观也便于板卡的站立以及使用安全。
三、实物展示
传感器板:

整体的连接效果如下:

在操作界面中,可以清晰地看到屏幕上所呈现的信息,这些信息主要聚焦于角度和圈数两大关键数据。专门配备的传感器具备极为精准的数据采集能力,非常稳定,它能够精确无误地获取电机的旋转角度。所显示出来的数据不仅清晰易读,而且具备实时性,能够及时反映出电机每一次旋转所达到的角度数值。该传感器对于转动圈数的检测同样精准可靠。为了验证系统的性能,我们进行了实际的驱动测试。在测试过程中,我们能够实时地读取电机当前的角度数值以及转动的圈数,并且将这些数据清晰地显示在LCD屏幕上。整个测试过程中,ADMT4000传感器展现出了卓越的性能。它能够稳定地输出高精度的数据,不会出现数据波动或者误差较大的情况。这种稳定且高精度的数据输出,确保了电机的控制系统能够及时、准确地获得实时反馈,从而根据反馈信息对机械的运行状态进行调整和优化,后续我们可以看一下调整的动图效果。
四、软件设计
在软件设计方面,我们通过micropython进行平台的快速开发,通过相关的库文件的调用我们可以快速的进行结构连接和驱动,主要实现了初始化SPI接口、读取传感器数据并显示在LCD屏幕上。软件流程图如下:
主要的软件部分实际上还是传感器的驱动部分,可以根据数据手册继续宁驱动的编写,主要包括初始化、读写操作、数据采集等部分。
ADMT4000驱动设计
在初始化阶段,首先需要设置SPI接口的相关参数,如时钟极性、时钟相位和数据位宽等:
def __init__(self, spi_bus, cs_pin):
self.spi = spi_bus
self.cs = Pin(cs_pin, Pin.OUT)
self.cs.value(1)
def _select(self):
self.cs.value(0)
def _deselect(self):
self.cs.value(1)
def _transfer(self, data):
return self.spi.write_readinto(data, data)
然后是读写操作的关联,这里主要用的是读操作:
def read_register(self, register):
data = bytearray(4)
data1 = bytearray(4)
data[0] = register|0x00
data[1] = 0x00
data[2] = 0x00
data[3] = 0x00
Data1 = 0x0000
self._select()
self.spi.write_readinto(data, data1)
self._deselect()
Data1 = data1[1] << 8
Data1 |= data1[2]
return int(Data1)
最后能够实时读取ADMT4000传感器的角度与转数数据:
def read_angle(self):
"""Read the angle register (ANGLE)"""
angle = self.read_register(0x05)
return (angle>>4)*360/4096;
def read_abs_angle(self):
"""Read the absolute angle register (ABSANGLE)"""
abs_angle = self.read_register(0x03)
TurnCnt = (abs_angle>>8)/4;
return TurnCnt
五、效果展示
这里我们主要看一下操作过程中的一个动图展示:

六、心得体会
ADMT4000传感器于本次精密设计的驱动测试中,呈现出卓越的性能表现。其精确捕获了转动过程中的转数及角度数据,为整个测试流程提供了稳定且可靠的数据输出。通过SPI接口ADMT4000传感器与显示平台成功实现了传感器数据的实时读取与直观清晰的展示。目前来看圈数是由上限的,对于这个参数的应用需要注意一下。