Funpack4-3 - 实现ADMT4000传感器数据采集及显示
该项目使用了ADMT4000,实现了驱动模块的设计,它的主要功能为:传感器数据采集及显示。
标签
ADI
ADMT4000
Funpack4-3
驱动模块
立冬的雪
更新2026-02-03
24

一、项目描述

本次项目依托ADMT4000这一高性能传感器,实现磁转数据的精准采集与直观显示功能,此项目明确对应活动任务的第一个任务。为了具体实现这一任务目标,我们需全面完成ADMT4000电路板及其配套测试结构的设计与实际搭建工作。在设计电路板时,我们需要充分考虑结构要求;而在搭建测试结构方面,我们重新设计了一个基于42步进电机的转动角度采集结构,该结构经过实践验证可行。在此基础上,我们进一步利用任意一款性能稳定的MCU或Linux SoC,精心设计了一套驱动程序。这套程序不仅能够准确读取旋转圈数及角度数据,还能将这些数据实时、清晰地呈现在彩色LCD屏幕上,为用户提供直观、便捷的数据查看体验。其中,核心子任务便是开发ADMT4000的驱动程序。这一驱动程序的开发至关重要,它直接关系到能否准确捕获传感器输出的相关数据。借助优秀的开发平台进行的彩屏可视化展示,使得用户能够更加直观地了解旋转圈数及角度的变化情况。

二、硬件介绍

传感器:ADMT4000


0

ADMT4000 是一种磁转数传感器,即使在设备断电时也能够记录磁系统的旋转次数。通电时可以查询该套件,以报告系统的绝对位置。绝对位置通过串行外设接口 (SPI) 报告。ADMT4000 最多可计数 46 圈外部磁场,以顺时针 (CW) 方向递增绝对位置计数。该套件包括三个磁传感器,一个用于计数系统旋转次数的巨磁电阻(GMR)转数计数传感器,一个 GMR 象限检测传感器和一个各向异性磁阻(AMR)角度传感器。AMR 角度传感器与 GMR 象限检测传感器结合使用,可确定系统在 360° 范围内的绝对位置。将 GMR 转数计数传感器输出与 AMR 角度传感器输出相结合,该套件就能以高角度精度报告系统的位置。

开发平台:


0

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

辅助测试工具:42步进电机及驱动设备。

三、硬件设计

结构设计:这里主要参考的是42步进电机实物的尺寸,尽量避免结构上的干涉,转动轴上设计了一个磁铁的载体:


0

测试板卡设计:测试板卡依托测试结构继续行的限高图的设计,主要为了方便安装,并使传感器和磁铁的中心轴保持一致,距离合适:


0

整机连接效果如下:


0

四、软件流程及代码说明

软件流程图:

调用相应的库文件,然后配置驱动接口(屏驱动、admt4000驱动),循环采集admt4000以及刷新显示,如下图:


0

这里我们主要实现的是屏幕的基本控制与显示功能,传感器的接口配置与基本控制,再到数据的基本采集,然后实现数据与屏幕显示的关联。下面详细介绍一下ADMT4000驱动文件的内容,主要包括SPI接口的基本关联以及数据交互的函数。在此基础上,进行应用函数的基本设计,主要包括传感器读数据与写数据函数的关联,以及数据的读取和处理。具体来说,SPI接口的基本关联涉及初始化SPI通信协议,配置时钟极性、相位和数据位宽等参数,确保与ADMT4000传感器的正确通信。数据交互函数则负责实现数据的发送和接收,包括读取传感器返回的数据和向传感器发送控制指令。应用函数的设计则进一步封装了这些基本操作,使得用户可以更方便地调用传感器读数据与写数据的功能,包括对采集到的数据进行处理,如格式转换等,以满足实际应用的需求。

驱动文件如下:

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):
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):
senddata = bytearray(4)
recedata = bytearray(4)
senddata[0] = register|0x00
senddata[1] = 0x00
senddata[2] = 0x00
senddata[3] = 0x00

Data16 = 0x0000

self._select()
self.spi.write_readinto(senddata, recedata)
self._deselect()

Data16 = recedata[1] << 8
Data16 |= recedata[2]
return int(Data16)

def read_angle(self):
angle = self.read_register(0x05)
return (angle>>4)*360/4096;

def read_abs_angle(self):
angledata = self.read_register(0x03)
TurnCnt = (angledata>>8)/4;
return TurnCnt

在主程序中进行循环采集和显示:


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

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

time.sleep(0.01)

五、功能展示

效果展示一共包括了三部分,其中由快速转动部分,跨圈数部分和低速转动部分:



六、心得体会

这款传感器非常的优秀,测量数据稳定可靠,相对角度可以实现360°的数据采集,比市场上大多数的磁传感器由测试盲区相比,可以大大简化采集系统,以前也确实没有接触过这么先进的传感器,这次算是打开了眼界,整个测试系统的采集也很方便。正在整个测试过程最困惑的地方使继续宁结构设计,如何是的转动能够平稳转动是关键,这里我们是通过一个驱动板来实现的步进电机转动的控制,最后看到了这么平稳的效果展示,最后还是由于结构设计留的固定孔尺寸问题没有已最完美的姿态呈现,通过美纹纸继续的固定。

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