内容介绍
内容介绍
一、项目摘要
基于ADI公司的ADMT4000模块,实现了检测旋转方向以及速度的小装置。
二、所选任务介绍
手动旋转磁铁,通过串口实时识别旋转方向(正转/反转)并计算转速。
任务要求
- 读取 ADMT4000 角度数据,判断当前旋转方向(正转/反转),串口实时显示
- 根据角度变化量和时间计算转速(转/秒或度/秒),串口实时显示
- 静止时显示转速为 0,旋转时实时更新
- 在 46 圈范围内验证方向和转速检测的正确性
二、硬件介绍
1.ADMT4000
ADMT4000 是一种磁转数传感器,即使在设备断电时也能够记录磁系统的旋转次数。通电时可以查询该套件,以报告系统的绝对位置。绝对位置通过串行外设接口 (SPI) 报告。ADMT4000 最多可计数 46 圈外部磁场,以顺时针 (CW) 方向递增绝对位置计数。
产品特性:
- 真正通电多圈计数器
- 46 圈磁传感器
- >16k° 数字输出
- ±0.25° 精度
- 测量更新率 100 kSPS
- 16 mT 至 31 mT 操作范围
- 内部温度传感器
- IC 电源,3.3 V
- SPI 接口,1.8 V 至 5 V
- 结温范围:-40°C 至 +150°C
- 24 引脚 TSSOP
- 工业应用

2.合宙Air780EHV核心板
Air780是基于移芯EC618平台下的LTE Cat.1无线模组,支持FDD-LTE与TDD-LTE 4G远距传输。
集成USB、UART、I2C等丰富接口,能够应对物联网行业多样应用。

三、方案框图与设计思路
本次选择的任务比较简单,直接通过780ehv实时读取角度值,然后程序中直接计算正反转以及速度即可

四、开发过程
- 流程图
- 合宙使用的lua语言,与python比较类似,以下是主程序代码
PROJECT = "admt4000_speed_test"
VERSION = "1.0.0"
local sys = require("sys")
local admt4000 = require("admt4000")
local SPI_ID = spi.SPI_0
local SPI_CS_PIN = 22
local SAMPLE_MS = 100 -- 采样周期
local DEAD_SPEED_DPS = 2 -- 小于这个认为静止(度/秒)
-- =========================
-- 角度解码
-- =========================
local function decode_angle(raw)
local code = bit.band(bit.rshift(raw, 4), 0x0FFF)
return code * 360 / 4096
end
-- =========================
-- 角度差(处理跨 360)
-- =========================
local function calc_delta(curr, last)
local delta = curr - last
if delta > 180 then
delta = delta - 360
elseif delta < -180 then
delta = delta + 360
end
return delta
end
-- =========================
-- 主任务
-- =========================
sys.taskInit(function()
local sensor = admt4000.init({
spi_id = SPI_ID,
cs_pin = SPI_CS_PIN,
speed = 4000000
})
if not sensor then
log.error("main", "init failed")
return
end
log.info("main", "start speed test")
-- 启动转换
sensor:writeRegisterNoVerify(0x01, 0x0000)
sys.wait(100)
local last_angle = nil
local last_ts = nil
while true do
-- 读 ANGLE
local raw = sensor:readRegister(0x05)
if raw then
local angle = decode_angle(raw)
local now = mcu.ticks()
local direction = "静止"
local speed_dps = 0
local speed_rps = 0
if last_angle and last_ts then
local dt = (now - last_ts) / 1000
if dt > 0 then
local delta = calc_delta(angle, last_angle)
speed_dps = delta / dt
speed_rps = speed_dps / 360
if speed_dps > DEAD_SPEED_DPS then
direction = "正转"
elseif speed_dps < -DEAD_SPEED_DPS then
direction = "反转"
else
direction = "静止"
speed_dps = 0
speed_rps = 0
end
end
end
log.info(
"SPEED",
"角度", string.format("%.2f", angle),
"方向", direction,
"角速度(dps)", string.format("%.2f", speed_dps),
"转速(rps)", string.format("%.3f", speed_rps)
)
last_angle = angle
last_ts = now
else
log.error("read", "angle failed")
end
sys.wait(SAMPLE_MS)
end
end)
sys.run()
- 实物图

- 当手持磁铁在模块上方旋转时日志可以打印出相关信息,不过由于是手持磁铁的原因,无法固定一个点位且晃动严重,因此数据会出现一些浮动


四、遇到的难点及解决方法
其一是该模块供电和通信是分开的,但是电脑上并没有多余的usb口来供电,于是乎通过观察原理图发现,排针有一个位置是NC位,所以直接将电源飞线到该排针上,这样就可以直接将用杜邦线供电了

其二便是通信成功后发现数据浮动的厉害,并且圈数一直显示不对,经过排查之后发现是手持磁铁导致磁场不稳定,模块测量出来的也就不稳定,特别是磁铁过于靠近芯片还会引起模块复位。解决方法其实也很简单,要么拿个电机后面贴上磁铁并固定在模块上,不过手上暂时没有相关的东西,于是采用方法二,将磁铁对着模块的最下方,不过这样的话磁性可能不够,所以多加了几个磁铁堆叠起来,最后成功稳定住了,(当然间距是稳定住了,但是剩下的只能靠手稳了)。
五、心得体会
本次活动的模块挺有意思的,以后可以拿来做更多更好玩的东西。
附件下载
admt4000.rar
项目文件
团队介绍
个人
团队成员
LGX
评论
0 / 100
查看更多
猜你喜欢
2026 ADI机器控制设计竞赛 - 用ADMT4000模块实现旋转方向与转速检测该项目使用了ADMT4000模块,实现了通过磁力检测旋转方向与转速的设计,它的主要功能为:使用磁转数传感器ADMT4000模块,搭配RP2040开发板,实现通过磁力检测旋转方向、角度与转速的功能。
happy
14
2026 ADI机器控制设计竞赛 - 基于ADMT4000模块完成旋转方向与转速检测的任务该项目使用了ADMT4000 和GD32F450,实现了旋转方向检测的设计,它的主要功能为:将旋转方向进行检测并输出。
寒彬彬
5
2026 ADI机器控制设计竞赛 - 用ADMT4000模块实现旋转方向与转速检测该项目使用了ADMT4000模块,实现了旋转方向与转速检测的设计,它的主要功能为:判断当前旋转方向和转速并实时显示。
xusp99
8