【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 之间交替进行性能调整

【Arduino 动手做】Arduino TMC2209的方向和步进控制图1

【Arduino 动手做】Arduino TMC2209的方向和步进控制图3


【Arduino 动手做】Arduino TMC2209的方向和步进控制图2

【Arduino 动手做】Arduino TMC2209的方向和步进控制图4

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(2)
驴友花雕
驴友花雕
作者
项目代码
[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]
- 没有更多了 -