项目简介
本项目基于 STM32U545RE 微控制器,使用 Rust Embassy 异步框架驱动 TMC4361A 运动控制器和 TMC2160 步进电机驱动器。
芯片介绍
- TMC4361A:高性能运动控制器,负责运动规划、位置/速度/加速度控制,生成步进脉冲和方向信号。
- TMC2160:高精度步进电机驱动器,提供静音电流控制(SpreadCycle/StealthChop)和集成保护。
- STM32U545RE:主控制器,通过 SPI 与 TMC4361A 通信,协调整个系统。
硬件连接
如图所示MCU仅与TMC4361连接

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 驱动程序
流程图
环境要求
- 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 控制命令
通过串口发送单个字符控制电机:
命令 | 功能 |
|---|---|
| 停止电机 |
| 速度模式,正转 1 RPS |
| 速度模式,反转 2 RPS |
| 位置模式,正转 90° |
| 位置模式,反转 180° |
注意事项
- 确保TMC4361时钟正确,需要提供正确的频率以及设置寄存器,参考《TMC4361A-LA_Datasheet_V1.24_CN.pdf》14.19,本项目刚好是默认时钟速率因此未进行设置。
- 确保mcu SPI配置正确,时钟速率最高不超过tmc4361时钟4分频。
- 位置计算需考虑微步分辨率(200步/圈 × 256微步)。
- 电流设置(IHOLD_IRUN)应根据实际电机调整,本项目设置的较小,防止过热。
- 配置速度时注意速度寄存器数据格式。
