使用 TMC2209 SilentStepStick 驱动步进电机
硬件准备
NUCLEO-G474RE 开发板 1 块
Grove - 0.96英寸黄蓝双色OLED显示屏 1 个
TMC2209 SilentStepStick 模块 1 个
面包板 1 块
杜邦线 若干
Grove - 0.96英寸黄蓝双色OLED显示屏 默认情况下是通过 IIC 连接,按照如下图所示,连接到开发板即可。

驱动库
waspinator/AccelStepper @ ^1.64
代码实现
#include <AccelStepper.h>
AccelStepper stepper(AccelStepper::DRIVER, D13, D12);
void setup() {
stepper.setMaxSpeed(1000);
stepper.setSpeed(1000);
}
void loop() {
stepper.runSpeed();
}效果展示

步进电机带动滑台实现直线运动
硬件准备
NUCLEO-G474RE 开发板 1 块
Grove - 0.96英寸黄蓝双色OLED显示屏 1 个
TMC2209 SilentStepStick 模块 1 个
面包板 1 块
杜邦线 若干
Grove - 0.96英寸黄蓝双色OLED显示屏 默认情况下是通过 IIC 连接,按照如下图所示,连接到开发板即可。

代码实现
#include <AccelStepper.h>
AccelStepper stepper(AccelStepper::DRIVER, D13, D12);
void setup() {
stepper.setMaxSpeed(1000);
stepper.setSpeed(1000);
}
void loop() {
stepper.runSpeed();
}效果展示

基本控制功能:向前移动、向后移动、停止
硬件准备
NUCLEO-G474RE 开发板 1 块
Grove - 0.96英寸黄蓝双色OLED显示屏 1 个
TMC2209 SilentStepStick 模块 1 个
面包板 1 块
杜邦线 若干
Grove - 0.96英寸黄蓝双色OLED显示屏 默认情况下是通过 IIC 连接,按照如下图所示,连接到开发板即可。

代码实现
#include <AccelStepper.h>
#define DEFAULT_MICROSTEPS 8 // 默认微步数 - 细分设置(1/8步)
#define STEPS_PER_REV 200 // 每转步数 - 标准200步/转步进电机
#define STEPS_5_REV (5 * STEPS_PER_REV * DEFAULT_MICROSTEPS)
AccelStepper stepper(AccelStepper::DRIVER, D13, D12); // Defaults to AccelStepper::FULL4WIRE (4 pins) on 2, 3, 4, 5
void setup() {
stepper.setMaxSpeed(STEPS_5_REV); // 最大速度(步/秒)
stepper.setCurrentPosition(0);
}
void loop() {
// 正转 5 圈(绝对位置 8000)
stepper.runToNewPosition(STEPS_5_REV);
delay(500); // 停顿 0.5 秒
// 反转 5 圈(回到 0)
stepper.runToNewPosition(0);
delay(500); // 停顿后自动循环
}效果展示

按键、串口命令控制滑台运动
硬件准备
NUCLEO-G474RE 开发板 1 块
Grove - 0.96英寸黄蓝双色OLED显示屏 1 个
TMC2209 SilentStepStick 模块 1 个
面包板 1 块
杜邦线 若干
上位机电脑 1 台
Grove - 0.96英寸黄蓝双色OLED显示屏 默认情况下是通过 IIC 连接,按照如下图所示,连接到开发板即可。
代码实现
// 1. 处理串口命令
while (Serial.available()) {
String cmd = Serial.readStringUntil('\n');
processCommand(cmd);
}
// 2. 根据模式执行任务
switch (currentMode) {
case MODE_VELOCITY:
// 速度模式:无需操作,TMC2209 会自动维持速度
break;
case MODE_POSITION:
// 位置模式:由 AccelStepper 驱动脉冲直到到达目标
if (stepper_pulse.distanceToGo() != 0) {
stepper_pulse.run();
} else {
currentMode = MODE_STOP; // 自动回到停止状态
Serial.println("位置到达");
}
break;
case MODE_STOP:
default:
break;
}效果展示

我要赚赏金
