这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 合作大赛 » 2026年第1期的Let'sdoDigiKey陪你渡过春夏秋冬--静音步进电机控

共1条 1/1 1 跳转至

2026年第1期的Let'sdoDigiKey陪你渡过春夏秋冬--静音步进电机控制实践(活动教程)

助工
2026-05-06 00:06:39     打赏
欢迎大家参加2026年第1期的Let's do DigiKey 陪你渡过春夏秋冬--静音步进电机控制实践。本次实践活动是由Digikey和EEPW联合举办。

新来的朋友可以看一下我们的活动流程,有兴趣的也可以到报名页面仔细看看相关的活动流程和规范。

https://www.eepw.com.cn/event/action/digikey/diy_2026_first.html

我们的活动时间是2026年5月20日结束报名和器件购买,发帖截止日期是6月21日,评选和报销时间是6月22日至6月26日。

本次活动有一块必选板子,也是本次教程的主角,静音步进电机控制驱动模块,使用的芯片是TMC2209。

image.png

本次主题的核心就是静音步进电机控制,这是一个很有趣的实践方向。简单来说,就是通过树莓派pico,配合circuitPython的程序代码,去精准地指挥一个步进电机——让它怎么动、以多快的速度动、走到哪个位置。在这个过程中,我们可以学习到:TMC2209驱动模块的能力和优缺点,这个驱动模块的接线方式,如何使用circuitPython,怎样通过它控制电机。跟着EEPW提供的circuitPython使用教程,可以学会circuitPython的安装、工程目录组织结构、库的安装和使用,最终编写python代码控制步进电机。
接下来,我们再来介绍一下TMC2209这款驱动模块。TMC2209 SilentStepStick 是一款基于 Trinamic Motion Control 公司 TMC2209 芯片设计的高性能步进电机驱动模块。它最大的特点就是 “静音” 和 “智能”。极致静音:采用 Trinamic 专利的 StealthChop2™ 斩波技术,能几乎完全消除电机在低速运行时的噪音和振动高精度与平滑性:支持最高 256 微步智能节能:内置的 SpreadCycle™ 模式能在高负载下提供高扭矩,同时芯片还有静置自动降流功能易于使用:它采用经典的 StepStick 封装,引脚兼容常见的 A4988 等驱动模块


需要注意的是,这个模块是本次活动的必选模块,在Digikey上搜索TMC2209 SilentStepStick就可以找到这个模块,也可以通过活动页面的链接点击到Digikey官网购买。这个模块是ADI旗下的美信生产的静音电机驱动模块,它的技术特性在前面的内容里已经说明了,这里就不再重复讲了。然后这是另一款活动器件,树莓派Pico,需要注意的是,这款不是必选模块,大家手上如果有其他的替代也是可以用的。


接下来是关于活动主题的说明,本次活动共设置3个活动主题+自主命题,参与者可按自身情况完成基础任务,或在此基础上进行更深入的扩展设计。主题一:基础步进电机运动控制系统使用MCU控制TMC2209 SilentStepStick 驱动步进电机,实现一个可控制转动方向和速度的基础运动控制系统。主要帮助参与者掌握:STEP/DIR控制原理、定时器脉冲生成、基础运动控制逻辑。主题一的活动任务如下:基础任务(入门级),控制端:生成STEP脉冲信号、DIR信号控制电机正反转,支持至少两种转速,例如快速、慢速。电机能够稳定运行。进阶任务,在基础任务上实现:速度调节功能、加速/减速控制、按键或串口控制运动,例如:启动、停止、反转。
简单来说,主题一就是使用最简单的步进和方向两个信号来控制TMC2209模块,实现对步进电机的控制,这也是很多步进电机控制系统里最常见的控制模式。
主题二:基于UART的TMC2209驱动参数配置系统利用TMC2209 SilentStepStick 的UART配置接口,实现驱动参数的动态配置与调节系统。主要帮助参与者掌握:驱动寄存器配置、电流控制、微步控制、静音驱动模式。其实主题2是建立在主题1的基础之上的,为什么要配置电机驱动模块呢,主要是为了更好的适配电机和对应应用,通过调节TMC2209的寄存器配置,能更好的降低噪音和电机抖动的情况。要实现这个题目,就必须掌握驱动寄存器的通信时序和配置、接线方式、电机的微步设置和工作模式的设置方式。这些东西我们在后面会再讲。
主题二的具体活动任务如下:基础任务(入门级),MCU 通过 UART 配置以下参数:微步细分、电机电流(通过调整采样电阻电压),并验证不同细分下电机运行差异(视频演示)进阶任务,实现驱动模式切换:StealthChop(静音模式),SpreadCycle(高动态模式)。这款步进电机驱动在这两种模式切换的过程中,电机会有轻微的抖动。TMC后续的升级版本驱动,切换两种模式是很顺滑的,没有电机抖动的情况。即使存在这种情况,这款电机驱动模块依然是一款非常优秀的静音驱动产品,对于一些简单的应用来说,这两种工作模式选择一种就可以了,大部分时候是不需要切换工作模式的。
主题三:迷你桌面滑台控制系统题目目标使用TMC2209 SilentStepStick 驱动步进电机,结合简单机械结构(丝杆、同步带或滑轨),设计一个迷你桌面滑台控制系统,实现直线运动控制与位置管理。直线滑轨系统在3D打印,CNC控制,自动化设备控制里广泛使用,这里我们可以使用带丝杆的步进电机,设计一个迷你桌面滑台控制系统(类似微型CNC/自动推杆/相机滑轨的基础运动平台)。主要帮助参与者掌握:步进电机位置控制、加减速运动控制、机械运动与软件控制的结合。活动任务:基础任务(入门级),实现一个可工作的桌面滑台系统:使用 TMC2209 SilentStepStick 驱动步进电机(步进电机需要用户自行购买)步进电机带动滑台实现直线运动(丝杆、同步带或滑轨需要用户自行购买)支持基本控制功能:向前移动、向后移动、停止MCU通过:按键、串口命令控制滑台运动,不强制要求使用屏幕显示状态(有能力的用户可以做)进阶任务,在基础任务上实现位置控制功能:通过步数实现简单位置管理,即将长度映射到具体的步数(总长度分为N个位置),可以准确指定移动到准确的位置
支持以下控制功能:回到原点、移动到指定位置、设定移动距离(移动相对位置)实现平滑加减速控制,避免电机突然启动或停止回零操作
主题四是自主命题,使用 TMC2209 控制步进电机,实现一个创意或者产品 demo,需提交项目框图、控制代码(如不能公开,展示部分控制代码)、演示视频等项目提交的相关资料。本次活动的4个主题,就是以上的这些内容了,个人建议直接做任务1,不需要考虑调整驱动配置,也不需要去研究寄存器和通信时序。


现在我们来看一下使用TMC2209 SilentStepStick 的手册,下边的这两幅图就是模块的正面和背面。背面的丝印就是引脚定义,其中最重要的就是VIO和GND,以及步进电机的AB相接线引脚。VIO就是指通信部分的电平,像我们用树莓派Pico来控制,那就要用3.3V接到VIO引脚上。然后就是VM引脚,这个引脚需要接到电机电源上,根据电机的工作电压来接对应电源就行了。按手册上,是建议4.75V到28V,但是我们一般不建议按极限的电压来使用,建议5V到12V就行了。常见的小型步进电机也是12V,如果手头上只有24V的电机,也可以用一下。除了这些引脚,串口通信引脚也是比较重要的,配置芯片寄存器的时候需要用。另外就是直接控制运动的步进和方向信号引脚(STEP和DIR)。板子正面的一个小型旋钮变阻器,是用来调整电机采用电流参考电平的。在下一页有详细的说明。另外板子正面,芯片的右边,两个绿色的电阻就是AB相的采样电阻。一般情况下是没必要去更换采样电阻。

image.png

下方的两个表格,一个是引脚表,另一个是元器件表格,不关注实际硬件的话,可以不管。这个手册往下拉,左下方的这个就是这个板子的原理图了,原理图上的R6和R7,也就是AB相的电流采样电阻,前面我们也画出来过。这两个电阻是比较重要的,如果你有需要,可以根据自己的情况计算出合适的值去更换。从原理图上可以看到EN引脚已经直接通过R2电阻上拉到内部的LDO输出,也就是5V电压上了。这就意味着,默认板子上电是关闭的,需要使用将EN引脚拉低才可以开始工作。另外,我们还可以从左下角的电机电流检测的参考电压建议数据里看到,我们可以根据自己手头上电机的工作电流,调整这个旋转式的可调电阻,将参考电压调整到需要的水平上。例如2.5V则是满量程,工作电流最大是1.77A。一般建议设置成比自己电机工作电流要小一些的,安全点。需要设置成其他电流档的,可以按表上的数据,或者自己根据规格书的计算公式来计算。这个参考电压的引脚并没有引出,它的过孔位置是在可调电阻旁边,诊断和INDEX引脚上方的那个小过孔。最后,右边这个图,就是我们实际模块的上层PCB和过孔图纸了,这里可以看到官方模块是如何布局和引出相关引脚的。


image.png

然后,我们接下来看一下TMC2209的规格书,这个规格书虽然是英文的,我们也可以节选部分需要看的内容,丢给AI翻译就可以了。在这个教程里,我们简单过一下我觉得比较重要的内容。首先第一个,我们可以看一下这个芯片的驱动模式一,也就是目前步进电机控制系统里,最常见、也是最通用的一种开环位置控制方式,也就是步进和方向控制信号驱动的模式。就是直接步进和方向的信号给到驱动板就可以了,至于诊断和位置指示信号,完全可以不管。然后再连接电机就可以了,这种是第一种。

image.png

然后第二种方式就是除了连接前面说的步进和方向信号以外,还需要连接串口。这就是我们主题二需要用到的接线方式,这种方式其实大部分的用户是用不上的,因为默认的驱动配置,基本上已经足够一些通用的电机了。

image.png


现在我们再来看一下串口的接线方式,这个芯片支持单向和双向的串口信息传输方式,以及多种不同的连接配置。首先我们如果只考虑读写寄存器,只连接一块驱动板的情况。这种情况下,我们只需要使用1K欧的电阻将MCU的RX和TX引脚连接起来,再连接到驱动模块的PDN_UART引脚即可。如果我们需要接两个驱动模块,分时控制这两个模块的话,需要使用MS1和MS2来设置不同的地址,单个串口线即可控制多个设备。

image.png

芯片规格书里还有其他的内容,例如各种寄存器的详细说明。 另外还有就是可以了解一下两种不同的工作模式的切换策略,可以从图里看到官方是怎样推荐去切换工作模式的。如果大家感兴趣的话,还可以深入了解一下SpreadCycle模式是如何实现快速、精确的电流控制的底层电路机制。 对这个芯片的配置和优化有兴趣的话,还可以了解一下不同工作模式的详细流程图,以及OPT写入配置的流程图。 规格书的内容挺多的,也不需要每个都过一遍,接下来我们就跳到下一个章节,树莓派Pico简介吧。

本次活动的另一款搭配的板子,就是可选的树莓派Pico。树莓派Pico是2021年初的时候,树莓派基金会推出的微控制器领域的新产品,推出后就受到社区和用户的广泛关注。推出至今一共有4款树莓派的板子,我们推荐的是第1款,也就是最经典的。其他的3款,分别是调试引脚使用插座的,还有另外两款是带wifi功能的。前两年还推出了树莓派Pico2,硬件有一些升级,如果对树莓派Pico2有兴趣的,也可以购买。

image.png

image.png

我们简单介绍一下树莓派Pico的硬件参数,它是双核M0+的处理器,主频高达133MHz,264K 的SRAM,支持USB控制器(只能做设备端,不能做主机端)。然后在外设这一块,支持2个SPI,2个串口,2个I2C。目前我们的主题只需要使用1个串口和随便两个gpio口就可以了。

其他的内容就没啥好说了,我们再来看一下它的引脚定义。就像刚才说的,我们用到的就是1个串口,比如GP0和GP1,然后随便找两个gpio,例如GP2和GP3。使用这几个端口,就可以完成我们主题内容了,并不需要使用其他的外设。如果需要驱动屏幕的话,就需要另外使用其他的引脚去接屏幕。然后我们还需要关注一下5V的引脚和3.3V,GND这些引脚,方便接线。

非无线 Raspberry Pi Pico 开发板的引脚布局和板载布局图

接下来我们要讲的是,如何烧录CircuitPython到树莓派Pico上。首先我们打开搜索引擎,输入CircuitPython,然后找到官方网站,一般第一个就是了。然后点击主页或者是下载链接,进入下载页面。进入下载页面后,选择第一个图片的链接就可以了,这个就是树莓派Pico的固件了。前面也提到过树莓派有不同的类型,带wifi和不带的,树莓派Pico和树莓派Pico2,我们选择自己购买的硬件对应的图片就行了。如果是跟着我们的推荐物料链接购买的,就直接用第1个就行。点击页面进去后,可以在页面右侧看到,固件支持多种语言,其中中文的话,只支持拼音输出,报错和内容是没有中文输出的。所以我们还是直接按默认的英文就好了。然后再点击右边的紫色按钮,下载UF2固件文件进行烧录。


image.pngimage.png

下载好固件后,我们可以拿出树莓派Pico开发板,在靠近USB接口的地方有个白色的按键。这个按键的作用只有一个,在开发板上电前按住按钮不放,插入USB接口。此时电脑上会提示发现新设备,并在电脑上出现一个新的U盘图标。这个U盘的名称一般是RPI-RP2之类的,并且在弹出的U盘内容窗口里,有两个文件,一个是HTML,一个是INFO UF2.txt文件。进入这个模式后,我们就可以正常烧录UF2固件了,如果发现电脑上没有这个移动磁盘图标的,就拔掉USB线,按住BOOT按钮重新接线。反复尝试都失败的话,建议检查自己手上的USB线是否带数据通信功能,有其他线的话,更换数据线再尝试。

image.png

image.png

在进入下载模式后,我们可以直接从下载好的目录,拖动固件到U盘的图标上,或者直接复制粘贴到U盘里。复制进去后,经过短暂的进度条,树莓派Pico会自行完成固件的烧录和校验。一切顺利的话,我们可以马上看到设备重启,具体的表现就是U盘消失,开发板上的绿色灯会短暂闪烁,并且电脑上会出现一个新的,名称是CircuitPython的U盘。当这个CircuitPython的U盘在电脑上出现时,代表固件烧录成功了。假如固件烧录后,没反应(U盘里能看到固件,但是不重启也没有新的U盘),建议检查一下是不是下载错了不同硬件用的固件。例如购买的是树莓派Pico,结果下载错了树莓派Pico2的固件。

image.png

接下来我们演示如何查看运行状态,以及一些常见的程序报错内容。首先,我们需要打开设备管理器,查看CircuitPython固件运行后的串口设备信息。如视频里演示的一样,可以在端口COM设备清单里,找到USB串行设备,记录对应的串口信息。然后我们打开串口工具,选择这个串口,按常规的115200波特率和常规配置连接串口。连接之后,我们就可以看到CircuitPython的提示了。CircuitPython的串口交互界面里,我们可以直接按任意键,进入REPL模式编程,也可以直接按住Ctrl键+D键软件重启,用来强制重启板子上的Python程序。我们也可以利用串口输出一些调试信息,或者用串口输入捕获数据。

image.png

一些常见的报错的处理方式,内容详情比较长,建议去看一下视频教程。

现在来讲讲CircuitPython的目录组织结构。其实CircuitPython的工程目录结构非常简单。我们打开U盘,可以看到几个内容,code.py文件,这个文件就是主程序入口。只要你对CIRCUITPY盘符下的文件进行了修改并保存,开发板检测到文件系统变动后,通常会立即自动重启并运行最新的code.py代码。这在开发调试时非常方便。除了code.py,你也可以把主程序命名为main.py或code.txt/main.txt,开发板启动时会按顺序寻找这些默认的主文件来执行。 其他的文件可以不关注,如果你烧录的固件里有boot.py,一般也不要把程序写到里面。boot.py通常用于执行一次性的系统级配置,使用不当有可能使设备无法正常工作。code.py文件才是编写代码的正确入口,这点一定要注意。
然后就是lib目录,这个是前面提到过的外部库(也就是外部模块)存放的地方。比如你想驱动OLED屏幕或使用传感器,就需要把对应的.mpy库文件下载并放在这个lib文件夹里,然后你的code.py才能正常调用它们。既然CircuitPython有外部库和内部库的区别,那就有一个同名的问题,假如外部库和内部库,都有一个同名的模块,那我们加载的是哪一个?在CircuitPython中,模块加载的优先级规则非常明确,/lib目录下的用户库,其优先级永远高于内置库。这意味着如果你在/lib文件夹中放置了一个名为time.mpy的文件,那么当你的代码执行import time时,加载的将是lib目录的time模块,而不是固件中内置的time模块。这个规则是故意设计的,它为你提供了极大的灵活性,你可以用自己的实现替换掉任何内置模块。

image.png

那我们从哪里可以下载呢? 我们也知道CircuitPython是一个小型化的Python运行环境,它其实是没有包管理器的,也就是不能像Ubuntu之类的,用pip给python安装库。在CircuitPython的官方网站上,提供了库的下载链接,我们直接点击这个链接,就能打开库文件的说明页面。在这个页面里,Bundles就是官方的库,一般都是按目前支持的版本区分的,我们正常下载和烧录的,是10.x的版本,所以需要下载10.x的Bundles,也就是视频里这个按钮的链接。这个会直接下载所有的官方库文件,这些库文件都是mpy格式的,也就是编译后的字节码模块,体积相比源码更小,不需要解析源码,直接运行,所以必须要区分版本,不同版本可能无法运行。另外,下载下来的官方库压缩包里,不但包含了所有的官方库,也包含对应的示范文件代码,所以用起来是非常方便的。如果你对对应库的源码感兴趣,可以下载下面这个链接的源码文件,CircuitPython的官方库是有专人维护的,相对很多社区库来说,代码更规范,风格也比较统一,阅读起来更舒服一些。

image.png

我们把下载的库文件解压缩后,可以得到3个目录,lib目录就是所有的库文件,这些文件不能直接全部复制到U盘里,没有足够的空间,使用哪些就放哪些就行。然后examples目录就是示范代码的目录了。最后requirements目录记录的是每个库的依赖情况。比方说我需要使用adafruit_led_animation这个库,可以直接把这个库复制到U盘的lib目录里,也就是直接拖,或者复制进去。其实不用看依赖目录,也有一种办法,就是直接把示范代码的内容,复制到code.py里,直接运行,如果还缺依赖,就会报错,到时候去资源管理器里搜索对应的库,再复制进去就好了。

image.png

现在我们再来看一下,CircuitPython这边官方的tmc2209模块驱动教程,其实默认的接线方式,就是我们前面说的,步进和方向信号,VIO和GND引脚接到树莓派pico的对应引脚上。例如这里的例子,是VIO接到3.3V,方向信号接到GP5引脚,步进信号接到GP6引脚,然后VM和GND接到电机供电和地,剩下就是步进电机的2相线圈,按电机购买的时候的信号接就可以了的。

image.png

接下来,我们来看看电机的驱动代码,这个代码也很简单,就是初始化两个信号引脚,然后用定时器来输出步进波形。 

# SPDX-FileCopyrightText: 2025 Liz Clark for Adafruit Industries
#
# SPDX-License-Identifier: MIT

import time
import board
from digitalio import DigitalInOut, Direction

# direction and step pins as outputs
DIR = DigitalInOut(board.D5)
DIR.direction = Direction.OUTPUT
STEP = DigitalInOut(board.D6)
STEP.direction = Direction.OUTPUT

# microstep mode, default is 1/8 so 8
# another ex: 1/16 microstep would be 16
microMode = 8
# full rotation multiplied by the microstep divider
steps = 200 * microMode

while True:
    # change direction every loop
    DIR.value = not DIR.value
    # toggle STEP pin to move the motor
    for i in range(steps):
        STEP.value = True
        time.sleep(0.001)
        STEP.value = False
        time.sleep(0.001)
    print("rotated! now reverse")
    # 1 second delay before starting again
    time.sleep(1)

还记得我们前面的主题1的内容对吧,我们可以将这个代码提交给AI智能体代理,然后让它帮我们升级成,使用串口接收控制字符,实现加速、减速、前进、后退、停止这些功能。记得增加一个引脚开启EN信号,配置输出低电平就可以了。同时使用串口输出当前的运行状态,例如方向、速度,以及控制提示这些内容。 在等待一段时间后,AI生成的代码就做好了,然后再复制到U盘的code.py文件里。如果有错误的话,就修改一下,最后断电接上电机,测试一下功能,一般都没有什么问题。跟着我们的教程走,基本上就没啥问题了,配置串口的部分,我们会在社区的论坛上分享帖子,实现简单的寄存器读取和写入的功能。



共1条 1/1 1 跳转至

回复

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