1. 项目介绍与主题
1.1 项目背景
随着精密加工和自动化控制技术的快速发展,高精度直线位置控制系统在工业自动化、实验室设备、精密测量仪器等领域有着广泛的应用需求。传统的线性位置控制通常采用编码器或限位开关进行位置检测,但存在分辨率有限、需要参考点复位等问题。绝对位置传感器的应用可以有效解决这些问题,实现无需回零操作即可获取当前位置信息。
1.2 项目主题
基于ADMT4000的高精度滑轨线性控制
本项目采用ADMT4000绝对角度传感器作为位置检测元件,结合步进电机驱动丝杠导轨,实现对滑块位置的精确控制。ADMT4000传感器能够输出绝对角度信息和旋转圈数,通过数学转换即可得到线性位移信息,实现0-80mm行程范围内的高精度位置控制。
1.3 项目目标
- 实现ADMT4000传感器与直线位移的精确对应关系
- 支持手动控制模式(UP/DOWN按键)和自动控制模式(自动运行到目标位置)
- 通过LCD实时显示当前位置、目标位置、传感器数据等信息
- 实现边界保护和防过冲功能
- 支持设置界面修改目标位置
2. 硬件介绍
ADMT4000绝对角度传感器模块

ADMT4000是一款专为精密角度测量设计的磁性编码器芯片。其核心测量原理是利用磁性感应技术检测磁场角度的变化,具有非接触式测量、精度高、稳定性好等优点。在测量范围方面,ADMT4000支持多圈角度测量,最多可记录46圈(184个机械旋转)的角度数据。在分辨率方面,传感器原始输出为1°分辨率的角度值,通过内部算法处理后可以输出更高精度的数据。
主控平台

带屏版的12指神探,配备了一块240*240分辨率的LCD彩屏以及两个可程控按键和一个拨轮,丰富了人机交互功能,方便信息观察、界面切换等使用方式。此外还配备了白色外壳,精心设计的包装不仅使板卡日常使用时更加美观也便于板卡的站立以及使用安全。还配备配备了丰富的对外接口。
传动结构-步进电机滑轨

采用28步进电机,具体参数如下:
参数 | 规格 |
步角 | 1.8° |
相数 | 2相 |
额定电压 | 3.6V |
额定电流 | 1.2A/相 |
保持转矩 | 0.2N·m |
驱动方式 | PWM脉冲驱动 |
步进电机通过联轴器直接驱动丝杠,丝杠导程为2mm,即电机每转一圈滑块移动2mm。
硬件连接示意图:
实际连接如下:
3. 系统设计
3.1 方案框图

3.2 项目设计思路
本系统采用分层控制架构设计:
第一层:硬件层
- ADMT4000传感器负责位置检测
- 步进电机负责驱动执行
- LCD负责信息显示
- 按键负责用户输入
第二层:驱动层
- ADMT4000通信驱动(SPI通信)
- 步进电机驱动(PWM调速)
- LCD显示驱动
- 按键扫描驱动
第三层:应用层
- 位置计算模块
- 模式控制模块(手动/自动)
- 显示管理模块
- 边界保护模块
3.3 系统功能设计
手动控制模式(MANUAL)
- UP键:电机正转(CW),滑块向前移动
- DOWN键:电机反转(CCW),滑块向后移动
- CENTER键:停止电机
- 长按边界处自动锁定
自动控制模式(AUTO)
- CONFIRM键:切换到自动模式并设置目标位置
- CENTER键:启动自动运行到目标位置
- 到达目标位置后自动停止
- 支持防抖处理避免过冲
设置界面(SETUP)
- RETURN键:进入/退出设置界面
- UP/DOWN键:调整目标位置(0-80mm)
- CONFIRM键:执行系统复位
3.4 算法设计思路
ADMT4000与线性距离的数学关系
传感器与丝杠导轨的连接方式为:丝杠每旋转一周,滑块移动2mm(导程2mm)。ADMT4000每转输出4096个计数(12bit = 360°),因此:
每毫米对应脉冲数 = 4096 / 2mm = 2048 counts/mm
每毫米对应步进电机脉冲 = 4096 / 2mm × 32(细分) = 65536 pulses/mm (使用32细分驱动时)
位移计算公式(设复位零位对应的传感器读数为1440°即4圈):
距离(mm) = (总角度 - 1440°) × 80mm / (15840° - 1440°)
= (总角度 - 1440°) × 5 / 900
为便于显示,转换为0.01mm单位:
distance_x100 = (total_angle - 1440) × 5 / 9
有效行程范围:1440°(0mm)至15840°(80mm)
4. 接口设计分析
4.1 主控制器接口分配
GPIO | 功能 | 连接到 |
GP0 | LCD_RES | ST7789复位 |
GP1 | LCD_DC | ST7789数据/命令 |
GP2 | LCD_SCK | ST7789时钟 |
GP3 | LCD_MOSI | ST7789数据 |
GP5 | CONFIRM | 按键输入 |
GP6 | RETURN | 按键输入 |
GP7 | UP | 按键输入 |
GP8 | CENTER | 按键输入 |
GP9 | DOWN | 按键输入 |
GP20 | STEP | 步进电机脉冲 |
GP21 | EN | 步进电机使能 |
GP22 | DIR/COIL_PS | 方向/线圈供电 |
GP23 | SHDN | 传感器关断 |
GP24 | RST | 传感器复位 |
GP25 | SPI1_CS | ADMT4000片选 |
GP26 | SPI1_SCK | ADMT4000时钟 |
GP27 | SPI1_MOSI | ADMT4000数据输出 |
GP28 | SPI1_MISO | ADMT4000数据输入 |
4.2 电路连接分析
SPI通信电路
ADMT4000使用SPI接口与主控制器通信,采用四线制:
- SCK:时钟线
- MOSI:主出从入(SDO)
- MISO:主入从出(SDI)
- CS:片选信号
通信时序要求:
- 时钟极性:CPOL = 0
- 时钟相位:CPHA = 0
- 通信速率:1MHz
步进电机驱动电路
采用PWM脉宽调制方式控制步进电机:
- EN引脚:使能控制(低电平使能)
- STEP引脚:PWM脉冲输入(10kHz)
- DIR引脚:方向控制
复位电路设计
ADMT4000的DIR引脚在复位期间临时复用为COIL_PS输出,用于控制复位线圈。这种引脚复用设计减少了GPIO的使用数量,但需要精确的时序控制确保功能正常。
5. 软件设计
5.1 软件流程图

5.2 关键代码介绍
ADMT4000传感器驱动
class ADMT4000:
def read_angle(self):
"""读取角度寄存器 (0-360°)"""
angle = self.read_register(0x05)
return (angle>>4)*360/4096
def read_abs_angle(self):
"""读取绝对角度寄存器,返回圈数"""
abs_angle = self.read_register(0x03)
TurnCnt = (abs_angle>>8)/4
return TurnCnt
位置计算
def calculate_position():
raw_turncnt = admt.read_abs_angle() # 圈数
raw_angle = admt.read_angle() # 角度
total_angle = raw_turncnt * 360 + raw_angle
# 转换为距离 (0.01mm单位)
# 有效范围: 1440° ~ 15840° (0mm ~ 80mm)
angle_diff = int(total_angle - 1440)
current_distance_x100 = angle_diff * 5 // 9
return current_distance_x100
显示缓存机制
为避免显示频繁刷新导致的闪烁问题,采用显示缓存机制:
_last_values = {
'distance': None,
'turn': None,
'angle': None,
'target': None,
'mode': None,
'edge': None,
}
def update_display_if_changed(...):
# 仅当数值变化时才更新对应区域
if _last_values.get('distance') != new_value:
_last_values['distance'] = new_value
# 仅清除并重绘该区域
display.fill_rect(x, y, w, h, bg_color)
display.text(...)
自动控制模式
# 自动运行到目标位置
if control_mode == MODE_AUTO and auto_started:
error = get_position_error()
error_threshold = 90 # 阈值容差
if abs(error) <= error_threshold:
position_reached = True
stepper_enable(False)
elif error > 0:
stepper_set_direction(0) # CW
stepper_set_speed(50)
stepper_enable(True)
else:
stepper_set_direction(1) # CCW
stepper_set_speed(50)
stepper_enable(True)
6. 功能展示与说明
6.1 控制界面

显示内容说明
- 第一行:标题栏
- 第二行:主显示区域,显示当前位置(XX.XX格式)
- 第三行:模式指示(MANUAL/AUTO)
- 第四行:传感器数据(左:Turn圈数/Deg角度,右:Target目标距离)
- 第五行:操作说明
6.2 动态控制

7. 设计中的难题与解决方法
我们本次主要的难点是传感器角度数据和行程之间的关联,毕竟不是定制的,只能通过设计转接结构进行固定,最终选取了其中80mm行程用于关联展示。
8. 心得体会
本项目成功实现了基于ADMT4000的高精度滑轨线性控制系统,完成了以下功能:
- ADMT4000绝对角度传感器的数据采集与转换
- 步进电机的正反转控制
- LCD实时显示当前位置、目标位置和传感器数据
- 手动控制和自动控制两种工作模式
- 设置界面修改目标位置
- 边界保护和防过冲功能
系统运行稳定,显示效果良好,控制响应及时,满足项目设计要求。为后续的高精度位置控制应用奠定了基础。