Funpack4-3: 步进电机闭环控制系统
该项目使用了TMC4361A, TMC2160A, ADMT4000,实现了步进电机闭环控制系统的设计,它的主要功能为:通过磁编码器 ADMT4000 反馈角度数据,利用TMC4361A实现硬件闭环功能。
标签
步进电机
ADMT4000
TMC4361A
clr
更新2026-02-09
13

一、 项目介绍

本项目基于 admt4000 磁编码器和 TMC4361A、TMC2160A组成的驱动系统,综合实现闭环步进电机控制系统。


首先介绍一下使用到的器件,ADMT4000 磁编码器是我们系统的“眼睛”。它结合了 AMR (各向异性磁阻) 角度传感器和 GMR 圈数传感器,不仅能记圈数,还能提供 ±0.25° 的高精度单圈角度信息,总分辨率覆盖超过 16,000° 的范围。通过 SPI 接口直接读取绝对位置和圈数。是实现小型化、高可靠性伺服系统的理想选择。


TMC4361A 运动控制器负责生成平滑的运动轨迹,支持 S形加减速曲线,可独立设置加减速及急动度,显著减少电机振动和噪音;它支持全闭环控制,内置硬件闭环算法,可以直接连接 增量式编码器 或 SPI 绝对值编码器,实现精准定位,彻底解决步进电机丢步问题。TMC2160A 支持外置 N 沟道 MOSFET,电压最高支持 60V,非常适合驱动大尺寸、高扭矩的步进电机;他还搭载 Trinamic 第二代静音技术 StealthChop2,通过在超声波范围内进行平稳的电流控制,从根本上消除了电机可闻噪音,即使在大电流驱动下,也能让电机在低速和中速运行时保持极致安静,消除电流噪音。提供高精度的逐周期电流控制算法,确保电机在高速运行或负载剧烈变化时,依然拥有强大的扭矩输出和极低的共振。


项目核心功能:

  1. 高精度位置监测:利用磁编码器实时获取电机转子的绝对角度和多圈位置。
  2. 全闭环防丢步控制:通过实时比对规划轨迹与实际位置,自动补偿因负载突变或外力干扰导致的丢步。
  3. 静音与平滑驱动:利用 S 形加减速曲线和 StealthChop2 技术,实现极致静音和平滑的运动控制。




二. 设计思路

  1. 前端采集:M1W 模块通过 SPI 总线(8MHz)高速轮询 ADMT4000 寄存器(0x05),获取原始角度数据。
  2. 数据传输:M1W 对数据进行多圈解算和 CRC 校验后,通过高波特率 UART(921600 baud)打包发送给 STM32。
  3. 闭环运算:STM32 接收位置数据,与 TMC4361A 内部的规划位置进行比对,计算偏差并执行补偿。


流程图:


三、实现过程

1 编码器数据的高可靠性采集 (M1W/Micropython)

为了防止SPI传输干扰导致的数据错误,我们在 M1W 端实现了软件 CRC5 校验

  • 算法逻辑:模拟硬件 LFSR(线性反馈移位寄存器)对读取的 26位 数据流进行 CRC5 计算。
  • 过零点处理:实现了 StepperPositionTracker 类,通过对比前后两次采样值(Diff),处理 0-4096 的翻转问题,将 12位 原始数据转换为 32位 连续的微步(Microsteps)数据。
  • 数据封包:采用二进制协议和特有帧结构发送数据给stm32端,提高了传输效率。

2 STM32 端的高效解析与控制

  • UART 状态机解析
     HAL_UART_RxCpltCallback 中实现了状态机(State Machine),严格检查帧头 0xCA 和帧尾 0xA8。只有当校验通过时,才更新全局变量 motor.enc_pos,确保闭环控制不会因为通信误码而失控。
    // 状态机伪代码示例
    case UART5_WAIT_HEADER:
    if (byte == 0xCA) state = UART5_WAIT_BYTE0;
    break;
    ...
    case UART5_WAIT_FOOTER:
    if (byte == 0xA8) { data_ready = 1; update_position(); }
    break;
  • 丢步补偿任务 (Step Loss Compensation Task)
    这是闭环控制的核心。代码通过周期性任务(20ms)检查位置偏差。
    void motor_step_loss_compensation_task(void) {
    // 计算偏差
    int32_t deviation = xactual - real_pos;

    // 超过死区,执行“欺骗式”补偿
    if (abs(deviation) > POS_DEAD_ZONE) {
    // 关键操作:将TMC4361认为的位置修正为真实位置
    // 芯片会自动加速去追赶真正的 Target
    tmc4361A_writeRegister(0x00, TMC4361A_XACTUAL, real_pos);
    motor.total_lost_steps += deviation; // 统计数据
    }
    }

3 人机交互与调试

实现了基于 UART 的命令行接口(CLI),支持以下功能:

  • ls/rs:设置左右旋转速度。
  • la/ra:指定角度绝对定位。
  • show:实时打印 XACTUALVACTUAL 及编码器原始数据,便于调试 PID 参数和机械安装误差。
  • sync:手动强制同步tmc4361a和m1w侧的坐标系微步值)。

四、实现效果

Snipaste_2026-01-09_02-57-22.png


Snipaste_2026-01-09_02-57-46.png


系统上电后,由于电机与编码器坐标系未对齐,我们首先发送 sync 指令,使 tmc4361 同步当前磁编码器的步进数,再使用 set 指令保存当前位置,将当前位置标记为“A点”。发送 cl 指令开启闭环控制,MCU开始监测位置偏差。我们控制电机移动到远处,然后发送 gotoa 指令使其返回 A 点。


由于数据读取和传输过程中与实际值存在时间差,程序也对这部分进行了补偿,但是可以确保终点的差值不会超过预设的死区值,可以作为后续改进的点。实际上在步进电机转动的过程中,手不太可能对电机造成丢步的效果,运行电流设置的过小会导致电机无法正常运动。


还可以在电机停止时用手对轴施加力,使其超过预设的死区值,这里死区值设为150微步,程序也会对此进行补偿,同时通过串口输出补偿步数。需要注意将电机的保持电流设为0,在没有运动指令的时候能够 freewheeling,要不然轴无法转动,无法用手产生丢步的效果。


实践中发现 AMR 对环境更加敏感,表现为手远离电机后更容易发生校验错误,最好可以对步进电机壳进行接地以排除影响。


五、 总结与展望

本项目成功构建了一套高可靠性的闭环步进控制系统。

  1. 解决了丢步痛点:通过 ADMT4000 的高频反馈和 STM32 的实时补偿算法,电机在受到外力干扰偏离位置后,能够迅速自动回归目标点。
  2. 静音效果显著:TMC2160A 的 StealthChop2 模式使得电机在低速运行时几乎无噪音。
  3. 代码健壮性:引入了 CRC5 校验和 UART 帧校验,确保了在复杂电磁环境下的通信稳定性。

未来优化方向

  • 目前采用固定死区补偿,未来可引入 PID 算法调节 TMC4361A 的 VMAX,使追赶过程更加柔和。
  • 将 M1W 的功能集成至 STM32,利用 STM32 的硬件 SPI 直接读取编码器,进一步降低通信延迟。
附件下载
admt4000-cl2.py
m1w
TMCStepperMotor.zip
stm32工程
团队介绍
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号