这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » let'do2026年第一期步进电机控制-成果帖

共2条 1/1 1 跳转至

let'do2026年第一期步进电机控制-成果帖

助工
2026-06-14 13:26:15     打赏

本次项目实现了一个基于 STM32F407 和 TMC2209 SilentStepStick 的步进电机基础控制系统。项目目标是用 MCU 输出 STEP/DIR 信号驱动步进电机,实现启动、停止、正反转和速度调节,并在此基础上加入 TMC2209 的 UART 参数配置能力,为后续电流调节、微步细分和静音模式切换做准备。

电路原理图可以按下面连接理解:

STM32 PA6  -> TMC2209 STEP

STM32 PA1  -> TMC2209 DIR

STM32 PA2  -> TMC2209 EN

STM32 PB10 -> TMC2209 UART/PDN

STM32 PB11 <- TMC2209 UART/PDN

GND        -> TMC2209 GND

VM         -> 电机电源

A1/A2/B1/B2 -> 两相步进电机线圈

软件部分主要分为四层。第一层是硬件初始化,由 main.c 完成 GPIO、USART3、TIM3 PWM 初始化;第二层是 motor.c,封装电机使能、失能、方向控制、PWM 启停和速度设置;第三层是 key.c,负责按键读取、20ms 消抖和 150ms 调速连发;第四层是 motor_ctrl.c,实现停止、正转、反转三个状态之间的切换。TMC2209 参数配置放在 tmc2209.c,实现 CRC8、寄存器读写、电流设置、微步设置、StealthChop 静音模式和 SpreadCycle 高动态模式接口。

主要参数如下:STM32 系统时钟配置到 168MHz;TIM3 预分频为 83,形成 1MHz 计数基准;STEP 使用 TIM3_CH1 PWM 输出;默认速度为 30RPM,速度范围 1RPM 到 200RPM,每次按键调整 10RPM;电机按 200 步/圈、1/16 微步计算。TMC2209 UART 默认使用 USART3,波特率 9600,驱动地址为 0x00;初始化参数中预设 IHOLD=8、IRUN=20、IHOLDDELAY=1,并设置 1/16 微步和 StealthChop 静音模式。

开启运行步骤:先连接 STM32、TMC2209、电机和电源,确认共地;再编译工程并通过 DAPLink/OpenOCD 下载;上电后按 RUN 键,电机开始正转;再次按 RUN 键,电机切换为反转;第三次按 RUN 键,电机停止并释放;运行过程中按 UP/DOWN 键可以降低或提高转速。工程中 Motor_SetSpeed() 会根据 RPM 计算 TIM3 的自动重装载值,并同步更新比较值,使 STEP 脉冲保持稳定输出。

本次成果完成了活动主题一中的 STEP 脉冲生成、DIR 正反转控制、至少两种转速和按键控制运动。

本项目代码已按模块拆分为 motor.c、key.c、motor_ctrl.c 和 tmc2209.c,其中 motor.c 负责 STEP/DIR/EN 控制,motor_ctrl.c 负责运行状态机,tmc2209.c 负责 UART 寄存器配置,后续可以继续扩展电流动态调整、堵转检测和不同细分模式对比测试。

case KEY_ID_RUN: switch (ctrl_state) { case STATE_STOP: MotorCtrl_Start(0, STATE_RUN_FORWARD); break; case STATE_RUN_FORWARD: Motor_StopPulse(); MotorCtrl_Start(1, STATE_RUN_REVERSE); break; case STATE_RUN_REVERSE: Motor_Stop(); ctrl_state = STATE_STOP; break; } break;

void TMC2209_SetCurrent(uint8_t ihold, uint8_t irun, uint8_t iholddelay) { uint32_t data = (uint32_t)(ihold & 0x1F) | ((uint32_t)(irun & 0x1F) << 8) | ((uint32_t)(iholddelay & 0x0F) << 16);

TMC2209_WriteReg(TMC2209_REG_IHOLD_IRUN, data);

}

TMC2209_SetCurrent(8, 20, 1); 

TMC2209_SetMicrosteps(16);

 TMC2209_EnableStealthChop();


院士
2026-06-14 18:23:57     打赏
2楼

谢谢分享,学习了。


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]