Funpack4-3基于TMC4361+TMC2160实现步进电机控制
该项目使用了TMC4361、TMC2160、Rust语言,实现了步进电机控制的设计,它的主要功能为:控制步进电机指定速度/位置运动。
标签
步进电机
Rust
justbe
更新2026-02-25
4

项目简介

本项目基于 STM32U545RE 微控制器,使用 Rust Embassy 异步框架驱动 TMC4361A 运动控制器和 TMC2160 步进电机驱动器。

芯片介绍

  • TMC4361A:高性能运动控制器,负责运动规划、位置/速度/加速度控制,生成步进脉冲和方向信号。
  • TMC2160:高精度步进电机驱动器,提供静音电流控制(SpreadCycle/StealthChop)和集成保护。
  • STM32U545RE:主控制器,通过 SPI 与 TMC4361A 通信,协调整个系统。

硬件连接

如图所示MCU仅与TMC4361连接

image.png

屏幕截图 2026-02-11 224303.png

TMC4361信号

stm32开发板接口

芯片引脚

sck

CN7 p1

pc10

sdo

CN7 p2

pc11

sdi

CN7 p3

pc12

cs

CN7 p4

pd2

clk

Arduino D7

pa8

:TMC4361的sdi_drv连接TMC2160的sdi,sdo_drv 连接TMC2160的sdo,与芯片手册描述不一致,因为在TMC4361-BOB PCB上做了处理。

项目结构

src/
├── main.rs # 主程序,硬件初始化和控制逻辑
└── tmc4361.rs # TMC4361A 驱动程序

流程图

image.png

环境要求

  • Rust 工具链
  • probe-rs(用于烧录)
  • STM32U545RE 开发板

烧录与运行

cargo run --release

初始化与配置

基本配置流程

pub async fn init(&mut self) {
    let _ = self.read_raw(0x0e);
    self.write_raw(0x00, 0x00007020);
    self.write_raw(0x0a, 0x00000C80); // 微步
    self.write_raw(0x04, 0x4440128D); // spi 非sd
    // 初始化tmc2160
    self.cover_write(0x00, 0x00010000).await;
    self.cover_write(0x6c, 0x000100C3).await; // chop
    self.cover_write(0x10, 0x00000303).await; // irun-ihold
}

参考《TMC4361A-LA_Datasheet_V1.24_CN.pdf》17.1.1

  • 配置tmc4361基本设置
  • 配置tmc4361微分
  • 配置tmc4361时钟
  • 配置tmc4361连接驱动的spi接口(本项目是tmc2160对应的非sd模式)
  • 通过tmc4361配置tmc2160的工作模式(非sd模式)、微分、电流

关键寄存器设置

芯片

地址

说明

TMC4361A

0x00

0x00007020

通用配置

TMC4361A

0x0a

0x00000C80

256微步分辨率

TMC4361A

0x04

0x4440128D

SPI 通信参数

TMC2160

0x00

0x00010000

通用配置(GCONF)

TMC2160

0x6c

0x000100C3

斩波配置(CHOPCONF)

TMC2160

0x10

0x00000303

运行/保持电流(IRUN/IHOLD)

控制模式

速度模式

pub fn speed_at(&mut self, pps: i32) {
    self.write_raw(0x20, 0b000); // 速度模式
    self.write_raw(0x24, (pps << 8) as u32);
}
  • 配置运动模式寄存器
  • 配置斜坡曲线参数(可选),不包含目标速度
  • 配置目标速度,配置完电机开始运动,运动方向取决于速度符号

位置模式

pub fn position_at(&mut self, rps: i32, postion: i32) {
    self.write_raw(0x20, 0x04); // 位置模式
    self.write_raw(0x24, (rps << 8) as u32); // 设置速度
    self.write_raw(0x21, 0); // 设置当前位置为0
    self.write_raw(0x37, postion as u32);
}
  • 配置运动模式寄存器
  • 配置斜坡曲线参数(可选)
  • 配置目标位置,配置完电机开始运动,运动方向取决于速度符号,位置模式下速度符号位会被忽略

停止运动

pub fn stop(&mut self) {
    self.write_raw(0x24, 0);
}

停止运动只要往速度寄存器写入0即可

UART 控制命令

通过串口发送单个字符控制电机:

命令

功能

0

停止电机

1

速度模式,正转 1 RPS

2

速度模式,反转 2 RPS

3

位置模式,正转 90°

4

位置模式,反转 180°

注意事项

  • 确保TMC4361时钟正确,需要提供正确的频率以及设置寄存器,参考《TMC4361A-LA_Datasheet_V1.24_CN.pdf》14.19,本项目刚好是默认时钟速率因此未进行设置。
  • 确保mcu SPI配置正确,时钟速率最高不超过tmc4361时钟4分频。
  • 位置计算需考虑微步分辨率(200步/圈 × 256微步)。
  • 电流设置(IHOLD_IRUN)应根据实际电机调整,本项目设置的较小,防止过热。
  • 配置速度时注意速度寄存器数据格式。
附件下载
u545-nucleo-tmc4361a.zip
源码
团队介绍
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号