Funpack4-3 - 基于ADMT4000的磁转数传感器模块的设计
该项目使用了ADMT4000,实现了磁转数传感器模块的设计,它的主要功能为:采集磁转数数据。
标签
ADMT4000
Funpack4-3
磁转数传感器模块
孤独的单行者
更新2026-02-03
18

一、项目描述

本项目基于ADMT4000实现磁转数据的高精度采集与可视化显示,对应任务1。具体实施过程中,需完成ADMT4000电路板及其测试结构的设计与实物搭建(测试结构和设施选取28步进电机带动的滑轨)。在此基础上,采用任意型号MCU或Linux SoC开发专用程序,实现旋转圈数及角度数据的实时读取与彩色LCD屏幕动态显示。核心子任务包括开发ADMT4000设备驱动以实现精准数据捕获,并通过彩屏驱动技术完成数据的可视化呈现。

二、硬件介绍

本设计所采用的核心器件为ADMT4000,其属于磁转数传感器类别,具备在设备断电状态下记录磁系统旋转次数的功能。在通电条件下,可通过数字接口进行查询操作,以获取系统的绝对位置信息,该信息通过串行外设接口(SPI)进行传输。ADMT4000具备最多计数46圈外部磁场的能力,其绝对位置计数以顺时针(CW)方向递增。该套件集成有三个磁传感器,具体包括:一个用于计数系统旋转次数的巨磁电阻(GMR)转数计数传感器、一个GMR象限检测传感器以及一个各向异性磁阻(AMR)角度传感器。其中,AMR角度传感器与GMR象限检测传感器协同工作,可确定系统在360°范围内的绝对位置。通过将GMR转数计数传感器的输出与AMR角度传感器的输出相结合。

这里用到的显示主控是树莓派RP2040游戏机,RP2040 Game Kit是基于树莓派RP2040的嵌入式系统学习平台,USB Type-C供电,采用RP2040作为主控,支持MicroPython、C/C++编程,性能强大。主要用的就是板载的240*240分辨率的彩色IPS LCD,SPI接口,控制器为ST7789。注意接口线序:


0

三、实物展示


0

整体器件展示:


0

四、软件设计

整体的软件设计并不是很复杂,因为我们提供的这个游戏机的基础工程已经包含了页面的控制,主要实现的功能就是admt4000的驱动,整体的软件流程实际上只需要在初始化阶段实现SPI接口的关联,然后通过admt4000的驱动函数去实现两个寄存器的读取,这里面包括了角度传感器数据以及转数传感器数据。具体来说,初始化阶段需要正确配置SPI接口的参数,如时钟极性、时钟相位、数据位宽等,以确保与a dmt 4000芯片的正常通信。在初始化完成后,通过调用admt4000的驱动函数,可以分别读取角度传感器和转数传感器的寄存器数据。

树莓派游戏机这个开发板是基于micro python进行的开发,我们在电子森林提供的基础历程上进行修改,其中已经包括了对于屏幕的驱动控制,我们直接进行初始界面的显示即可,这里我们主要显示的就是转数和角度两个参数:

display.text(font1, "TurnCnt :", 20, 60,color=st7789.BLUE)
display.text(font1, "angle :", 20, 100,color=st7789.BLUE)

接下来是对admt4000的驱动,我们主要是从寄存器中进行读取,其中用到的接口是SPI接口,针对任务的两个参数,我们只需要用到两个寄存器地址即可:

class ADMT4000:
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):
"""Select the ADMT4000 by pulling CS low"""
self.cs.value(0)

def _deselect(self):
"""Deselect the ADMT4000 by pulling CS high"""
self.cs.value(1)

def _transfer(self, data):
"""Send and receive data over SPI"""
return self.spi.write_readinto(data, data)

def read_register(self, register):
"""Read a register value from ADMT4000"""
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)

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

接下来就是在循环中进行数据的读取与显示:

while True:
TurnCnt = admt.read_abs_angle()
angle = admt.read_angle()

display.text(font2, str(int(TurnCnt))+" ", 100, 60,st7789.GREEN)
display.text(font2, str(int(angle))+" ", 100, 100,st7789.GREEN)

time.sleep(0.01)

整体的任务要求就是在彩屏上显示转速与角度,这两个参数显示方面并不是特别的复杂,主要的难点就是对于admt4000的驱动,其他都非常好实现了.

五、效果展示

我们主要看一下显示的两个参数:


0

六、心得体会

感谢本次活动的成功举办,其为我们构建了一个接触前沿器件的珍贵平台。此传感器控制操作简便易行,重点是了解ADI的SPI通信机制,要确保其严格遵循时序规范,我们在具体的实现过程的时候,也是这里卡了很长的时间SPI的驱动涉及到软硬件上面的协同,一是要正确连接对应的线,二就是软件上使用的软件接口要是准确的,Mpython中的对引脚的定义要支持。

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