这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【let'sdo2026年第1期】静音步进电机控制实践成果贴-用TMC2209做

共1条 1/1 1 跳转至

【let'sdo2026年第1期】静音步进电机控制实践成果贴-用TMC2209做个安静的步进电机控制器

高工
2026-06-13 20:30:09     打赏

        现在我们的主要准备工作就做完了,通过对芯片和驱动板的分析,我们需要的主要控制信号是PWM和GPIO的控制,这些对于ST的官方开发板来说并不困难,但是上面只有一个功能按键,对于最终的功能展示切换是不太满足需求的,毕竟我们要控制启停,方向,速度等内容,如果有多个按键就非常不错了。

        在这个功能需求的要求下我们对控制平台进行了升级,毕竟我们本次主要想体验的是驱动板对步进电机的控制,我们找来了一个带显示屏和多个按键的mpy开发的板子进行控制开发,非常适合本次的任务,5 个按键控制启停 / 方向 / 速度,240×240 彩屏实时显示状态:

        cb3f6317-aa8f-41f0-a959-4fff52c053d0.png

        接下来我们就搭建整体的控制系统,主要内容包括步进电机结构体,驱动板及扩展板,主控平台等内容,系统框图如下:

dbfe89fd-56e3-4e11-b745-e9c21b0db029.png

        实际连接效果如下:

8888c8d2-b65f-489a-8628-32a914ecbe91.png

引脚分配

信号GPIO作用
STEP20PWM 输出,控制步率
DIR22方向,0 = CW,1 = CCW
EN21使能,0 = 工作,1 = 释放
UP7速度 +5
DOWN9速度 −5
CONFIRM5切换方向
CENTER8启停切换
RETURN6长按 800ms 清零步数

接线注意点

TMC2209SILENTSTEPSTICK把引脚全引出来了,标准 2.54 排针:

[VM]  电机电源(+9V)
[GND] 电源地
[2B][2A][1A][1B]  ← 两相电机线圈
[EN][DIR][STEP]    ← 3.3V/5V 兼容逻辑电平
[UART]             ← 可选配置接口(本项目没用到)

        电机线圈顺序错了电机只抖一下不转,不会烧板——所以放心接,搞反了换一下就行。注意接线的顺序,对应的A是一组,B一组,不是按照M1和M2分的。

Step 1:硬件连通性测试

        写代码之前,先验证 TMC2209 板是好的:

  • 9V 上电,测VM端有电

  • EN拉低,DIR拉低

  • 用杜邦线碰一下STEP脚,电机应该"咔哒"动一步

        这一步能区分是板子坏还是软件 bug,省得后面抓瞎。

Step 2:PWM输出验证

        MicroPython里两行就出方波:

from machine import Pin, PWM
step_pwm = PWM(Pin(20))
step_pwm.freq(1000)      # 1 kHz
step_pwm.duty_u16(32768) # 50%
        示波器看Pin 20,1kHz方波,电机应该慢速转。OK就可以进入下一步。

Step 3:屏幕 + 按键 + 显示缓存

        屏幕初始化、按键定义按部就班。重点是显示缓存——每个区块记一个"上次画的值",没变就不刷:

_cache = {'dir': None, 'spd': -1, 'spd_bar': -1,
          'status': None, 'steps': None, 'hint': None}

def update_direction(direction):
    if _cache['dir'] == direction:   # 没变就不画
        return
    _cache['dir'] = direction
    # ... 实际绘制 ...
        速度不变时屏幕一片寂静,完全不闪

Step 4:控制逻辑串起来

        按键 → 改速度 → 改 PWM 频率 → 电机变速。这条链路要求响应快,所以按键加了 80ms 自动连发,长按能连续加减速。

Step 5:步数累计

        硬件PWM输出的脉冲软件数不到(没法挂中断),用时间 × 频率估算:

def stepper_tick_counter():
    if not step_enabled: return
    elapsed = time.ticks_diff(time.ticks_ms(), _last_count_ms)
    step_count += elapsed * speed_to_freq(step_speed) // 1000
        1kHz 跑 1 小时 = 3,600,000 步。ticks_ms 精度 1ms,误差可忽略。

主要代码如下:

速度 → 频率映射

def speed_to_freq(s):
    """speed 5..100 → 200..4000 Hz(线性)"""
    return s * 40

步进控制三件套

def stepper_enable(enable):
    en_pin.value(0 if enable else 1)
    step_enabled = enable
    if enable:
        step_pwm.freq(speed_to_freq(step_speed))
        step_pwm.duty_u16(32768)
    else:
        step_pwm.duty_u16(0)

def stepper_set_direction(d):
    dir_pin.value(d)
    step_direction = d

def stepper_set_speed(s):
    step_speed = max(5, min(100, s))
    if step_enabled:
        step_pwm.freq(speed_to_freq(step_speed))


主循环

while True:
    stepper_tick_counter()       # 累计步数估算

    if up_btn.value()     == 0: handle_up()         # 速度+
    if down_btn.value()   == 0: handle_down()       # 速度-
    if confirm_btn.value()== 0: handle_confirm()    # 方向
    if center_btn.value() == 0: handle_center()     # 启停
    # RETURN 长按 800ms 清零步数

    sleep_ms(20)


效果展示

这里我们通过视屏的方式进行展示,主要都是一些动态的内容,视频地址如下:

【用TMC2209做个安静的步进电机控制器】 https://www.bilibili.com/video/BV1H3JW6QE7H/?share_source=copy_web&vd_source=2a202874768d99b0acaa1aceb9a9b93e






关键词: 控制器     步进     电机     成果    

共1条 1/1 1 跳转至

回复

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