前言
参加活动Let's do 2026年第1期任务TMC2209 步进电机驱动模块 的体验活动,本次活动主要围绕 TMC2209 驱动模块完成步进电机控制,并逐步实现速度控制、加减速控制以及更多扩展功能。
本系列文章将按照实际开发过程进行记录,希望能够帮助第一次接触 TMC2209 的朋友快速完成开发环境搭建,同时记录自己在开发过程中遇到的问题以及解决方法。
一、本次活动任务
活动任务主要分为三个阶段。
1. 基础任务
生成 STEP 脉冲信号
DIR 控制电机正反转
支持至少两种转速,例如快速、慢速
电机能够稳定运行
2. 进阶任务
速度调节功能
加速/减速控制
按键或串口控制运动,例如启动、停止、反转
3. 自由发挥方向
梯形加减速控制
多种运动模式
定位控制,也就是步数控制
PWM 方式生成 STEP 信号
目前已经完成了基础驱动,电机可以正常转动,后续会继续完成调速、加减速以及串口控制等功能。


二、硬件开箱
本次测试使用的主要硬件包括:
| 开发板 | Adafruit ESP32-S3 Reverse TFT Feather,4MB Flash / 2MB PSRAM |
| 驱动模块 | TMC2209 步进电机驱动模块 |
| 电机 | 5V 四相五线步进电机 |
| 电源 | 外部 5V 电源 |
| 连接线 | 杜邦线 |
ESP32-S3 负责输出 STEP、DIR、ENN 控制信号,TMC2209 负责驱动步进电机。
TMC2209 驱动模块


ESP32-S3 开发板正面


ESP32-S3 开发板背面


步进电机


三、TMC2209 模块简介
TMC2209 是一款常见的静音步进电机驱动芯片,支持 STEP/DIR 控制方式,也可以通过 UART 进行参数配置。
常见功能包括:
STEP / DIR 控制
UART 参数配置
StealthChop 静音驱动
SpreadCycle 驱动模式
StallGuard 堵转检测
电流调节功能
本次测试为了降低入门难度,暂时没有使用 UART 功能,而是采用最基础的 STEP/DIR 控制方式。
这种方式下,MCU 只需要输出三个信号:
STEP:控制步进脉冲
DIR :控制电机方向
ENN :控制驱动使能
其中 ENN 为低电平有效。
四、本次使用的电机
本次使用的是一颗 5V 四相五线步进电机。
厂家提供的接线说明如下:
| 蓝 | 1 | 相线 |
| 粉 | 2 | 相线 |
| 黄 | 3 | 相线 |
| 橙 | 4 | 相线 |
| 红 | 5 | 公共端——5V |
厂家提供的电机接线图


需要说明的是,这类 5 线步进电机并不是 TMC2209 最标准的适配对象。TMC2209 更适合驱动常见的 4 线双极性步进电机。
不过本次活动中驱动模块已经确定,因此本次测试采用当前电机进行验证。实际测试结果表明,在低速和中速情况下可以实现转动。
五、硬件接线
本次使用的开发板为 Adafruit ESP32-S3 Reverse TFT Feather。
控制信号接线如下:
| VIO | 3.3V |
| STEP | A1 |
| DIR | A0 |
| ENN | A2 |
| GND | GND |
电机和电源部分接线如下:
| 外部 5V | 电机红线公共端 |
| TMC2209 VMOT | 外部 5V |
| TMC2209 GND | 外部电源 GND |
| TMC2209 A/B 输出 | 电机相线 |
整个系统需要注意一点:
ESP32-S3 GND
TMC2209 GND
外部 5V 电源 GND
三者必须共地。
规划整体接线图


实际接线整体图


六、软件开发环境
本次使用 Arduino IDE 进行开发。
开发环境如下:
| IDE | Arduino IDE |
| 开发板 | Adafruit ESP32-S3 Reverse TFT Feather |
| 控制方式 | STEP / DIR / ENN |
| 是否使用库 | 否 |
由于目前只是使用 STEP/DIR 基础控制,因此程序中不需要调用 TMC2209 专用库。
只需要使用 Arduino 自带的 GPIO 控制函数即可:
pinMode();
digitalWrite();
delayMicroseconds();
七、第一版基础驱动程序
当前程序的目标是让电机连续转动,并通过修改 speedDelay 控制速度。
#define STEP_PIN A1
#define DIR_PIN A0
#define ENN_PIN A2
int speedDelay = 500; // 数值越小,速度越快
void setup() {
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
pinMode(ENN_PIN, OUTPUT);
digitalWrite(ENN_PIN, LOW); // TMC2209 低电平使能
digitalWrite(DIR_PIN, HIGH); // 设置方向
digitalWrite(STEP_PIN, LOW);
}
void loop() {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(5);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(speedDelay);
}
程序中最核心的部分是:
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(5);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(speedDelay);
这段程序会不断输出 STEP 脉冲。
其中:
speedDelay 数值越大,STEP 频率越低,电机越慢;
speedDelay 数值越小,STEP 频率越高,电机越快。
八、当前实现效果
目前已经完成以下功能:
ESP32-S3 可以正常输出 STEP 脉冲
TMC2209 可以响应 STEP 信号
DIR 可以控制电机方向
ENN 可以控制驱动使能
电机可以连续旋转
修改 speedDelay 后可以改变 可以控制驱动使能
电机可以连续旋转
修改 speedDelay 后可以改变转速
当前测试中,speedDelay = 500 时电机可以正常连续转动。
电机连续转动演示视频
九、遇到的问题与分析
1. targetDelay 的含义理解错误
最开始我以为 targetDelay 是电机运行多久后停止的参数。
后来经过测试发现,targetDelay 实际表示的是目标脉冲延时,也就是目标速度。
例如:
int targetDelay = 500;
表示最终希望 STEP 脉冲间隔达到 500us。
它不是运行时间。
如果要控制运行时间,应该使用 millis() 记录时间,或者通过步数控制运行距离。
2. targetDelay 太小时电机震动但不转
当 targetDelay 设置得很小时,例如 100 或 50,电机会出现明显震动,但是不能正常旋转。
这种现象一般不是程序没有输出,而是电机已经失步。
可能原因包括:
STEP 频率过高
启动速度过快
电机力矩不足
电流设置不合适
当前 5 线电机与 TMC2209 并非标准匹配
后续需要通过加减速控制来改善。
3. 需要加入加速过程
步进电机不能直接从静止状态跳到很高速度。
更合理的方式是:
低速启动
逐渐加速
稳定运行
逐渐减速
停止
也就是后续需要实现的梯形加减速控制。
十、下一步计划
下一篇文章准备继续完成进阶任务,主要包括:
多档速度切换
加速控制
减速控制
串口输入速度参数
串口控制正反转
启动/停止控制
如果时间允许,后续还会继续实现:
按键控制
步数定位控制
梯形加减速
PWM 或定时器方式生成 STEP 脉冲
后续任务规划图


十一、总结
本篇文章完成了 TMC2209 步进电机驱动模块的基础测试。
目前已经实现:
TMC2209 模块接线
ESP32-S3 输出 STEP 脉冲
DIR 控制方向
ENN 控制使能
电机连续转动
简单速度调节
本次测试中也遇到了一些问题,尤其是对 speedDelay 和 targetDelay 的理解。经过测试后可以确认,它们控制的是 STEP 脉冲之间的延时,而不是运行时间。
我要赚赏金
