一、项目介绍
本次实现的是基于ADMT4000对180°舵机角度的检测,主要是通过带屏十二指神探对舵机进行基本控制,然后观察ADMT4000采集的实际角度。这里通过带屏十二指神探进行按键的输出控制,以达到不同角度的输出,显示也是通过它进行的。具体来说,带屏十二指神探可以提供直观的用户界面,方便用户进行操作和监控。用户可以通过按下不同的按键来控制舵机的角度,而ADMT4000则负责实时采集舵机的实际角度数据,并将这些数据显示在带屏十二指神探的屏幕上。这样,用户可以直观地看到舵机当前的角度,并根据需要进行调整。
二、硬件介绍
1、 ADMT4000传感器扩展板
ADMT4000传感器是一款高精度的磁转数据传感器,能够精确测量角度与旋转次数。其内部集成了多个传感器模块,包括:
- GMR转数计数传感器:用于检测系统旋转的次数。
- GMR象限检测传感器:用来检测旋转的方向和位置。
- AMR角度传感器:精确测量旋转的角度,协同GMR传感器工作,提供系统的绝对位置数据。
该传感器能够通过SPI接口与外部MCU进行通信,提供最高精度的旋转数据。ADMT4000可以通过SPI传输数据,使得数据采集过程高效稳定。
2、 主控平台
本处所选用的是本论坛备受青睐的一款开发板——带屏版12指神探。该开发板在原版基础上实施了升级优化,增设了一块分辨率为240*240的LCD彩色显示屏,同时配备有两个可编程控制按键及一个拨轮,显著提升了人机交互体验,使信息观测与界面切换等操作更为便捷高效。此外,该开发板还采用了设计精巧的白色外壳,其包装构思独特,既提升了板卡日常使用中的美观度,又便于其稳固放置,从而保障了使用过程的安全性。这里的外设我们主要用的是按键和显示。
3、 测试舵机
我们选用了一款180°的舵机,主要转动角度是180°,选用这款舵机主要是因为其对应的PWM输出是一个固定的位置,这样的话观察会比较方便一点。
三、实物展示
整体框图如下:
实物连接图如下:
四、软件设计
软件流程图如下:
这里处理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接口实现数据实时读取显示。实际上这个传感器还是有很多有趣的功能可以开发,从当前的数据来看非常稳定,正好也跨了一个圈数,可以看到丝滑的变化,非常稳定。