现在我们的主要准备工作就做完了,通过对芯片和驱动板的分析,我们需要的主要控制信号是PWM和GPIO的控制,这些对于ST的官方开发板来说并不困难,但是上面只有一个功能按键,对于最终的功能展示切换是不太满足需求的,毕竟我们要控制启停,方向,速度等内容,如果有多个按键就非常不错了。
在这个功能需求的要求下我们对控制平台进行了升级,毕竟我们本次主要想体验的是驱动板对步进电机的控制,我们找来了一个带显示屏和多个按键的mpy开发的板子进行控制开发,非常适合本次的任务,5 个按键控制启停 / 方向 / 速度,240×240 彩屏实时显示状态:

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

实际连接效果如下:

引脚分配
接线注意点
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脚,电机应该"咔哒"动一步
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) // 10001kHz 跑 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
我要赚赏金
