【Arduino 动手做】Arduino TMC2209的方向和步进控制
2025-07-262022
AI 快速预览详细
这个项目介绍了如何使用Arduino UNO和TMC2209步进驱动器来控制步进电机。通过三个数字引脚(STEP、DIR和EN),可以实现高达1/256微步的精确控制,并支持StealthChop模式,实现安静的运动。适用于初学者,设置时间不到45分钟,费用约为10-15美元。该项目非常适合3D打印机、摄像机滑块、机器人技术、数控机床和自动化系统等应用场景。
|
这种简单且经济实惠的设置,使用 Arduino UNO 和 TMC2209 步进驱动器,让您只需三个数字引脚即可控制步进电机。没有 UART,没有复杂性,只有干净的运动控制。这个 DIY 电子项目非常适合初学者,因为设置时间不到 45 分钟,费用约为 10-15 美元。 为什么要将TMC2209与Arduino一起使用? 与 A4988 或 DRV8825 等基本驱动程序相比,TMC2209 安静且效率更高。对于噪音和精度真正重要的项目来说,它是首选。即使没有 UART 配置,它也可以仅使用 STEP、DIR 和 EN 引脚即可完美工作。 主要特点 • 它提供高达 1/256 微步的精确控制 • 使用 StealthChop 模式进行安静运动 • 基本 3 引脚设置:STEP、DIR 和 EN(无需 UART) • 为未来的升级提供可扩展性,例如无传感器归位 (StallGuard) • 与流行的 NEMA 17 步进电机兼容 • 速度和方向都可以轻松定制 工作 该项目使用三个 Arduino 数字引脚: • D8 表示 EN(启用) • D9 用于 STEP(脉冲输入) • D10 用于 DIR(方向控制) 电机沿一个方向旋转,然后反转,重复循环。 电路连接 • EN → D8 - 启用或禁用驱动程序(LOW 表示启用) • 步骤 → D9 - 在上升沿发送步进信号 • DIR → D10 - 设置电机方向(高/低) • VIO → 5V - 驱动器的逻辑电源输入(与 Arduino 的 5V 信号匹配) • GND → GND - 公共接地 • VM/VS → 12V-24V 外部电源 - 电机电源输入 提示:确保所有接地(Arduino、驱动器、电机电源)连接在一起。这有助于避免不稳定的行为。 实际用途 3D 打印机 - 精确、安静地控制挤出机或轴 摄像机滑块 - 平滑的电影级平移 机器人技术 - 允许精确的关节运动或轮子旋转 数控机床 - 可重复运动,控制简洁 自动化系统 - 传送带、分拣机和拾取和放置 升级想法 想更进一步吗?尝试: UART 模式 - 激活动态电流控制或诊断 添加 StallGuard - 用于无传感器归位,无需限位开关 速度控制 - 使用电位器控制电机速度 按钮输入 - 使用按钮手动控制方向 高级模式 - 在 StealthChop 和 SpreadCycle 之间交替进行性能调整 ![]() ![]() ![]() ![]() |








项目链接:https://www.hackster.io/ElectroScopeArchive/tmc2209-with-arduino-uno-complete-guide-31e07e
项目作者:Electroscope
项目代码:
https://github.com/Circuit-Digest/Interfacing-TMC2209-Stepper-Motor-Driver-with-Arduino
https://github.com/Circuit-Digest/Interfacing-TMC2209-Stepper-Motor-Driver-with-Arduino/blob/main/tmc2209_code.ino
[code]// Pin Definitions
#define EN_PIN 8 // LOW: Driver enabled, HIGH: Driver disabled
#define STEP_PIN 9 // Step on the rising edge
#define DIR_PIN 10 // Set stepping direction
int noOfSteps = 500; // Number of steps to move in each direction
int microSecondsDelay = 1000; // Delay in microseconds between each step
void setup() {
// Configure pin modes
pinMode(EN_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
// Initialize pin states
digitalWrite(EN_PIN, LOW); // Enable the driver
digitalWrite(DIR_PIN, LOW); // Set initial direction
}
void loop() {
// Move motor in one direction
digitalWrite(DIR_PIN, LOW); // Set direction to LOW
moveSteps(noOfSteps);
// Move motor in the opposite direction
digitalWrite(DIR_PIN, HIGH); // Set direction to HIGH
moveSteps(noOfSteps);
}
void moveSteps(int steps) {
for (int i = 0; i < steps; i++) {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(microSecondsDelay);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(microSecondsDelay);
}
}[/code]