Funpack4-3 - 实现ADMT4000对舵机运行角度的检测
该项目使用了ADMT4000,实现了舵机角度检测的设计,它的主要功能为:对舵机运行角度的检测。
标签
ADMT4000
Funpack4-3
舵机角度检测
无言的朝圣
更新2026-02-05
18

一、项目介绍

本次实现的是基于ADMT4000对180°舵机角度的检测,主要是通过带屏十二指神探对舵机进行基本控制,然后观察ADMT4000采集的实际角度。这里通过带屏十二指神探进行按键的输出控制,以达到不同角度的输出,显示也是通过它进行的。具体来说,带屏十二指神探可以提供直观的用户界面,方便用户进行操作和监控。用户可以通过按下不同的按键来控制舵机的角度,而ADMT4000则负责实时采集舵机的实际角度数据,并将这些数据显示在带屏十二指神探的屏幕上。这样,用户可以直观地看到舵机当前的角度,并根据需要进行调整。

二、硬件介绍

1、 ADMT4000传感器扩展板


0

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

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

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

2、 主控平台


0

本处所选用的是本论坛备受青睐的一款开发板——带屏版12指神探。该开发板在原版基础上实施了升级优化,增设了一块分辨率为240*240的LCD彩色显示屏,同时配备有两个可编程控制按键及一个拨轮,显著提升了人机交互体验,使信息观测与界面切换等操作更为便捷高效。此外,该开发板还采用了设计精巧的白色外壳,其包装构思独特,既提升了板卡日常使用中的美观度,又便于其稳固放置,从而保障了使用过程的安全性。这里的外设我们主要用的是按键和显示。

3、 测试舵机


0

我们选用了一款180°的舵机,主要转动角度是180°,选用这款舵机主要是因为其对应的PWM输出是一个固定的位置,这样的话观察会比较方便一点。

三、实物展示

整体框图如下:


0

实物连接图如下:


0

四、软件设计

软件流程图如下:


0

这里处理admt4000的驱动设计外,其他的内容都是micropython自带的功能,例如SPI,PWM等内容。

具体代码分析:

我们这里主要涉及的是两方面的内容,其中一个就是舵机的控制,这里主要是为了更好的进行传感器数据采集的效果展示,所以我们加入了舵机控制,通过按键进行舵机状态的改变,舵机控制代码如下:

pwm = Pin(20,Pin.OUT, value=0) #B
hpwm = PWM(pwm)
hpwm.freq(50)

def set_angle(angle):
# 舵机角度与占空比的映射关系(根据实际情况调整)
# 0° -> 2.5% 占空比
# 180° -> 12.5% 占空比
duty = angle*36.667+1650
hpwm.duty_u16(int(duty)) # 转换占空比为0-65535范围

然后是按键的状态处理:

up_pressed = not up_btn.value()
down_pressed = not down_btn.value()

if up_pressed:
CircleCnt = CircleCnt + 1
if CircleCnt > 6:
CircleCnt = 6
set_angle(CircleCnt*30)
display.text(font2, str(int(CircleCnt))+" ", 100, 100,st7789.GREEN)
time.sleep(0.2) # 延迟一段时间以避免按键的抖动
if down_pressed:
if CircleCnt > 0:
CircleCnt = CircleCnt - 1
set_angle(CircleCnt*30)
display.text(font2, str(int(CircleCnt))+" ", 100, 100,st7789.GREEN)
time.sleep(0.2) # 延迟一段时间以避免按键的抖动

接下来是ADMT4000的驱动函数,主要涉及读取数据的接口函数和实际数据的读取函数:

def read_register(self, register):
"""Read a register value from ADMT4000"""
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):
"""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)"""
angledata = self.read_register(0x03)
TurnCnt = (angledata>>8)/4;
return TurnCnt

接下来就是刷新显示的函数:

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, 60,st7789.GREEN)

五、效果展示

我们这里主要是通过控制舵机实现磁场的变化,进一步观看传感器数据的采集,这里我们控制舵机一共有六个状态:

状态6及角度:



状态5及角度:



状态4及角度:



状态3及角度:



状态2及角度:



状态1及角度:



状态0及角度:



六、心得体会

ADMT4000传感器驱动测试表现优异,准确捕捉电机转数和角度数据,通过SPI接口实现数据实时读取显示。实际上这个传感器还是有很多有趣的功能可以开发,从当前的数据来看非常稳定,正好也跨了一个圈数,可以看到丝滑的变化,非常稳定。

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