2026 ADI机器控制设计竞赛 - 基于ADMT4000模块实现掉电位置记录和角度测量
该项目使用了ADMT4000模块,实现了位置角度测量和掉电持续测量的设计,它的主要功能为:实时记录旋转圈数,角度,在掉电的情况下依旧可以保持记录。
标签
嵌入式系统
ESP32
步进电机
ADMT4000模块
gavinxue
更新2026-05-11
39

本项目主要基于 ESP32 和 ADMT4000 的高精度多圈磁绝对位置监控系统。该系统利用 ADMT4000 的 True Power-On 特性,实现了在断电情况下仍能记忆旋转圈数的功能。系统能够实时捕获旋转角度和累计圈数,通过软件算法实现“稳态检测”与“相对位移计算”。下面为控制流程图,通过网页来控制步进的精确旋转和网页显示绝对圈数和角度,在角度发生变动的情况下显示相对角度变化量,方便对比ADMT4000传感器显示的是否准确。步进电机是42步进电机,直接控制每步角度太大,所以用了一个DM542C驱动器,驱动细分数设置为10000,这样每个脉冲控制的旋转角度为0.036度,但是ADMT4000的精度是±0.25度,所以在网页控制上就只设置了10步0.36度和一圈360度。由于0.36度和0.25度不成比例,实际测量偶尔有点跳动,影响不大。这个模块也可以通过多圈的方式来提高精度,不仅如此,旋转角度看似0.25度很大,换算到导程10mm的丝杆运动上精度可以达到6.9um这已经非常高了,普通机械精度一般为50um。

image.png

下面先说一个很重要的使用注意事项,必须使用径向磁铁,否则会报错,从而无法获取准确的圈数和角度数值,磁场强度有条件可以用特斯拉计测测,没有的话用常见的1-2mm厚度磁铁都可以。下图为官方手册推荐的磁场强度。同时注意,不要忘记给模块插上USB供电

image.png

硬件介绍

主控器 (ESP32):负责 WiFi 热点建立、Web Server 运行、SPI 传感器读取及 PWM 脉冲生成。

传感器 (ADMT4000):ADI 公司生产的高精度多圈绝对值磁编码器,支持最高 46 圈计数及 0.25度的测量精度。

步进电机 & 驱动器:执行机构,采用 10000 细分配置,由 ESP32发送高频脉冲驱动。

磁铁:安装于电机轴端,为传感器提供 16 mT 至 31 mT 的工作磁场。

演示图片

image.png


方案框图 + 设计思路

设计思路:采用“感知-运算-反馈”的闭环思维。

感知层:利用 SPI 接口每 200ms 采集一次传感数据,确保位置跟踪不丢失。

交互层:基于 AJAX 的异步轮询机制,让 Web 页面每 500ms 自动获取 JSON 数据,实现数据的“无刷新”实时显示。

驱动层:针对 100 RPM 的高速需求,优化 PULSE_DELAY 逻辑,确保脉冲输出的平稳性。


软件流程图 + 关键代码说明

软件流程描述

系统启动后,ESP32 进入循环:同步监听 Web 指令请求,同时异步刷新传感器位置。若收到运动指令(如转一圈),则进入同步阻塞模式发送指定数量的脉冲。


关键代码:稳态识别算法

该算法用于过滤传感器静止时的噪声,并捕捉明显的角度变动:

// 算法逻辑:变动量超过阈值即视为运动

if (fabs(current_total_deg - potential_stable_deg) > STABLE_THRESHOLD_DEG) {

potential_stable_deg = current_total_deg;

stability_start_time = millis();

is_moving = true;

} else if (is_moving && (millis() - stability_start_time >= STABLE_TIME_MS)) {

// 持续稳定 3 秒后,记录新的稳定点

last_stable_total_deg = current_total_deg;

is_moving = false;

}

串口调试输出监测

image.png

静态角度测量的偏差

image.png

设计的网页控制UI

image.png

Web监控:界面显示“绝对圈数”、“当前角度”及“角度变动”。正常工作时,指示灯为绿色;电机转动时,指示灯变为橙色。

精准控制:通过按钮可实现电机的顺/逆时针持续运转,以及精确到 10 步或 1 圈的定量移动。

实时采集控制可以观看视频操作演示。


遇到的难点及解决方法

难点:磁场强度 (Radius) 读数不稳定。

现象:读数在 1 和 65535 之间跳变。

解决方法:识别出这是 SPI 时序错位及无符号整数溢出导致的。通过在代码中加入延迟补齐位、优化 read_registers_dual 调用,并最终在 UI 层隐藏该调试参数,转而通过角度的连续性来侧面验证磁场质量。


难点:高速运动 (100 RPM) 导致 Web 响应变慢。

解决方法:在电机驱动循环中适时加入 yield() 函数,让出 CPU 权限给后台网络堆栈,防止浏览器连接超时。

具体操作可以参考附件完整代码

心得体会

技术收获:深入掌握了 ADMT4000 的 SPI 通讯细节(尤其是 16 位对齐与 CRC 校验)以及 ESP32 处理异步 Web 请求的机制。ADMT4000的无接触圈数角度设计理论上无限寿命,加之掉电记录功能,可以用在很多要求相对复杂的场景,例如电控和手控的场景,现有的一些传感器在自动控制关闭后,如果人为手动改变位置,自动机械启动往往需要复位,操作不当的复位往往导致机械碰撞,无接触的设计还可以用来对一些老旧无编码器的设备进行改造,传统编码器连接必须要需要机械连接相比而言就不那么方便了。

精度换算

image.png


意见建议:在进行高细分步进控制时,硬件定时器或 RMT 外设比软件 delayMicroseconds 更适合产生超高频脉冲。


总结:项目成功实现了从底层硬件驱动到上层 Web 交互的全栈打通,验证了绝对值磁编码器在工业自动化中的可靠价值。



附件下载
admt4000.c
官方示例驱动库
admt4000.h
ADMT4000_Project_V2.ino
主控制程序
web_pages.h
网页UI
团队介绍
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号