Funpack4-3 - 基于ADMT4000的传感器驱动模块的设计
该项目使用了ADMT4000,实现了传感器驱动模块的设计,它的主要功能为:读取电机的角度和转数。
标签
ADMT4000
Funpack4-3
传感器驱动模块
金玉其中
更新2026-02-03
45

一、项目描述

在现代自动化控制和精密测量中,高精度的角度与转速检测传感器是不可或缺的组成部分。ADMT4000作为一款功能强大的磁转数据传感器,其广泛应用于角度与位置反馈系统中。本次测试主要围绕ADMT4000传感器的驱动测试展开,详细描述测试流程、硬件选型、软件设计及测试结果,并结合具体使用的42型步进电机进行评估。

二、背景介绍

本次的任务是Funpack4-3的内容,目标是通过ADMT4000传感器对步进电机进行高精度的角度与转速测量,并将实时数据通过LCD显示屏进行可视化。为了实现这一目标,我们设计了一个完整的驱动测试系统,其中采用了42型步进电机驱动和ESP32-S3开发板,通过SPI通信接口连接ADMT4000传感器,实现数据的实时读取与显示。传感器板子的设计严格依据42型步进电机的尺寸要求,确保传感器能够准确读取电机的旋转数据。开发语言选择了CircuitPython,它具备易用性与高效性,适合快速实现原型设计。

三、硬件介绍

1、 ADMT4000传感器

ADMT4000传感器是一款高精度的磁转数据传感器,能够精确测量角度与旋转次数。其内部集成了多个传感器模块,包括:

  • GMR转数计数传感器:用于检测系统旋转的次数。
  • GMR象限检测传感器:用来检测旋转的方向和位置。
  • AMR角度传感器:精确测量旋转的角度,协同GMR传感器工作,提供系统的绝对位置数据。

该传感器能够通过SPI接口与外部MCU进行通信,提供最高精度的旋转数据。ADMT4000可以通过SPI传输数据,使得数据采集过程高效稳定。

2、 步进电机与传感器板设计

为了确保驱动测试的稳定性与精准度,我们选用了42型步进电机。步进电机相当的常见,广泛应用于自动化设备中,特别是在需要精确定位的系统里。根据电机的尺寸与安装要求,我们设计了一个专门的传感器电路板,确保ADMT4000能够在电机的旋转过程中准确获取数据。传感器与电机的结合使得整个系统能够精准地监测电机的转动角度和转速。实际的测试过程不需要驱动步进电机,我们只要能够实现转动就可以看到输出的明显变化。

3、 开发平台与显示模块

开发平台选用了一款ESP32-S3开发板,该板集成了Wi-Fi与蓝牙模块,适合进行快速原型设计。ESP32-S3具有足够的计算能力和丰富的接口资源,能够稳定地处理传感器数据并通过LCD屏幕进行显示。显示模块开发板上自带的显示屏,其接口也是SPI,注意使用的时候要进行对应的引脚冲突的避免。

三、实物展示

传感器板:


0

整体系统的效果显示:


0

可以看到屏幕上显示的信息就是角度和圈数的信息。传感器能够精确地读取电机的旋转角度,显示的数据清晰且实时,反映了电机每次旋转的角度。也可以准确地检测到电机的转动圈数,并通过显示屏实时展示。这对于需要精确计数的应用场景尤为重要。通过实际的驱动测试,我们能够实时读取电机的角度和转数,并将其显示在LCD屏幕上。测试过程中,ADMT4000传感器表现出色,能够稳定输出高精度的数据,确保了电机的控制系统能够得到实时反馈。

四、软件设计

在软件设计方面,本项目的核心任务是实现ADMT4000传感器的驱动与数据采集。软件架构基于CircuitPython,主要实现了初始化SPI接口、读取传感器数据并显示在LCD屏幕上。

SPI接口初始化

在初始化阶段,首先需要设置SPI接口的相关参数,如时钟极性、时钟相位和数据位宽等。这些设置确保了ESP32-S3与ADMT4000之间能够正确地进行数据交换。

class ADMT4000:
def __init__(self, spi, cs_pin):
self.spi = spi
self.cs = digitalio.DigitalInOut(cs_pin)
self.cs.direction = digitalio.Direction.OUTPUT
self.cs.value = True
# 初始化SPI
self.spi.try_lock()
self.spi.configure(baudrate=1000000, # 1MHz SPI时钟
phase=0,
polarity=0)
self.spi.unlock()
# 寄存器地址定义
self.CNVPAGE = 0x01
self.ABSANGLE = 0x03
self.ANGLE = 0x05
self.FAULT = 0x06
self.GENERAL = 0x10
time.sleep(0.01) # 启动延迟

def read_register(self, reg_addr):
"""
从指定寄存器读取数据
参数:
reg_addr: 寄存器地址
返回:
读取到的数据 (16)
"""
self.cs.value = False
while not self.spi.try_lock():
pass # Wait for the lock
# 发送寄存器页面选择和读命令
try:
# Transfer data
tx = bytearray([reg_addr|0x01, 0x00, 0x00, 0x00]) # Example transmit data
rx = bytearray(len(tx)) # Prepare a bytearray to store the received data
self.spi.write_readinto(tx, rx) # Perform SPI transaction
finally:
self.spi.unlock()
self.cs.value = True
Data1 = rx[1] << 8
Data1 |= rx[2]
return int(Data1)
数据读取与显示

通过配置好的SPI接口,我们能够实时读取ADMT4000传感器的角度与转数数据。以下是读取角度和转数的函数:

 def read_absolute_angle(self):
"""
读取绝对角度和旋转计数

返回:
绝对角度 (), 旋转计数 ()
"""
# 读取ABSANGLE寄存器
abs_angle_data = self.read_register(self.ABSANGLE)

# 解析数据
turn_count = (abs_angle_data>>8)/4 # 高6位中的低4位,每圈4个计数单位,共16位中的高10位的一部分
# 更精确的旋转计数需要结合低10位中的角度和整个范围重新计算,这里简化处理
# 实际中,可能需要更复杂的计算来获取精确的旋转圈数
angle = (abs_angle_data&0x3ff)*0.351 # 低8位表示0-360度的角度,256等分

# 由于ABSANGLE寄存器结构复杂,以下是一个简化的旋转计数获取方法
# 实际应用中,应参考数据手册中的详细说明进行解析

# 临时处理:假设我们只读取了部分信息,需要完整实现请参考数据手册
# 这里的turn_count仅为示例,实际解析会更复杂

return angle, turn_count # 注意:这里的turn_count是简化值

def read_angle(self):
"""
读取当前角度

返回:
当前角度 ()
"""
angle_data = self.read_register(self.ANGLE)
return (angle_data * 360) / 4096 # 12位分辨率,0-360

在主循环中,我们通过调用read_angle和read_abs_angle函数获取实时的角度与转数数据,并通过LCD显示出来::

spi_admt = bitbangio.SPI(
clock=board.D10,
MOSI=board.D11,
MISO=board.D12 # 可选
)

# 创建片选引脚
cs = board.A5 # 根据实际连接修改

# 初始化ADMT4000
admt4000 = ADMT4000(spi_admt, cs)
# 示例调用
while True:
angle, turn_count = admt4000.read_absolute_angle()
print(f"Absolute Angle: {angle:.2f}°, Turn Count: {turn_count}")

time.sleep(1) # 稍微等一下,避免CPU占用过高

五、心得体会

ADMT4000传感器在本次驱动测试中表现优异,准确捕捉了电机的转数和角度数据。通过SPI接口与ESP32-S3开发板的配合,我们成功实现了数据的实时读取与显示,为后续应用提供了坚实的基础。未来,我们将优化硬件设计与软件算法,探索更多基于ADMT4000传感器的应用场景,如机器人控制、自动化生产线等领域,相信这么精准的反馈能让我们的控制更加的便捷。

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