过程贴:
硬件学习:
一、TMC2209
TMC2209是一款极其安静的步进驱动器 IC,也可作为 SilentStepStick 使用。能够用于台式解决方案的终极步进驱动器,可同时进行失速检测和极其安静的运行。这里看到静音这个关键字,希望后续能够真正理解静音的含义。
1.核心特性与规格
驱动能力:支持高达 2.8A 峰值电流 和 2A RMS 电流 的线圈电流,电压范围为 4.75V 至 29V,足以驱动 NEMA 17 和 NEMA 23 等常用步进电机。
静音与平滑:采用 StealthChop2™ 技术,实现超静音、低振动运行。同时,MicroPlyer™ 插值器能将较低分辨率的步进输入平滑至 256 微步,确保运动极其平滑。
高效与节能:CoolStep™ 技术可根据负载动态调节电流,节能高达 75%,有效减少发热。其内部功率 MOSFET 的导通电阻(低边和高边均为 170mΩ 典型值)也有助于降低发热。
智能与诊断:StallGuard4™ 支持无传感器堵转检测和归位,无需外部限位开关。此外还提供过温、过流等全面的保护和诊断功能。
灵活接口:支持传统的 STEP/DIR 接口和 单线 UART 接口。通过 UART 接口可以配置参数、读取状态,甚至控制电机运动。
(deepseek总结)
2.引脚功能速览
TMC2209 采用 QFN-28 封装,主要引脚功能如下:
引脚分类 | 引脚名称 | 功能简述 |
电源 | VM | 电机电源输入 (4.75V - 29V) |
VIO | 逻辑电平电源输入 (3.3V 或 5V) | |
GND | 公共地 | |
电机控制 | STEP | 步进脉冲输入 |
DIR | 方向控制 | |
EN | 使能控制 (低电平有效) | |
电机输出 | M1A, M1B | 连接电机线圈 1 |
M2A, M2B | 连接电机线圈 2 | |
配置与诊断 | MS1, MS2 | 硬件微步选择 / UART 从机地址 |
PDN_UART | 单线 UART 通信引脚 | |
DIAG | 诊断输出 (如堵转、错误指示) | |
INDEX | 索引脉冲输出 | |
SPRD | 斩波模式选择 |
3.工作模式
TMC2209 主要有两种工作模式:
STEP/DIR 独立模式:这是最基础的模式。微控制器通过 STEP 和 DIR 引脚发送脉冲和方向信号来控制电机。微步进可通过 MS1、MS2 引脚硬件配置,最高支持 1/64 步。
UART 配置/控制模式:通过单线 UART 接口与芯片通信,实现更高级的功能。
配置与诊断:可动态配置电流、微步(最高 1/256 步)、驱动模式等参数,并读取芯片状态和诊断信息。
速度控制:可通过向 VACTUAL 寄存器写入值,利用内部脉冲发生器控制电机速度。但内部不提供自动加减速规划,需要上位机实现。
4.主要优缺点
优点:
极致静音:StealthChop2™ 技术是其最大亮点,非常适合对噪音敏感的应用。
高性价比:在提供接近高端型号功能的同时,价格更具优势。
功能丰富:集成了堵转检测、动态电流调节等智能功能,简化了系统设计。
易于升级:引脚与 A4988、DRV8825 等传统驱动器兼容,便于直接替换升级。
缺点/注意事项:
散热需求:在高负载下(如 2A 电流),必须加装散热片,否则易触发过温保护-。
无内置加减速:UART 模式下的速度控制需要外部 MCU 实现加减速算法。
UART 模式配置:通过 UART 进行高级配置比纯硬件模式复杂,需要阅读数据手册。
(以上为deepseek总结,后期整理)
二、Pico RP2040
RP2040 是树莓派基金会于 2021 年推出的首款自研微控制器芯片-1-3,以其极高的性价比(官方单价约1美元)、独特的双核架构和创新的可编程I/O (PIO) 系统,在嵌入式领域引起了广泛关注。
主要特性与亮点
1. 独特的双核架构
双核设计允许开发者将不同任务分配到两个核心上并行处理,例如一个核心处理传感器数据,另一个核心负责通信或用户界面,从而提升整体系统效率。
2. 创新的可编程I/O (PIO) 系统
这是 RP2040 最独特和强大的功能。它包含 8 个独立的 PIO 状态机,可以脱离CPU核心,在硬件层面独立、精确地执行自定义的 I/O 时序逻辑。
这使得开发者可以用软件方式“创造”新的硬件接口,例如:
精确控制 NeoPixel (WS2812) 等时序严格的LED灯带。
模拟 I2S 音频接口。
驱动 VGA 显示器。
实现自定义的高速或低速通信协议。
PIO在很大程度上弥补了RP2040没有内置I2S、SDIO等专用外设的不足。
3. 灵活便捷的存储与启动
芯片内置 264KB SRAM,足以运行复杂的嵌入式程序。代码可存储在外接的 QSPI Flash 中。一个非常方便的特性是USB 拖放式编程:按住板上的 BOOTSEL 按键并连接USB,芯片会模拟成一个U盘,直接将编译好的 .uf2 固件文件拖入即可完成烧录。
4. 完善的电源管理
芯片内置了可编程的 LDO(低压差线性稳压器)来产生内核电压,并支持 低功耗睡眠和休眠模式,适用于电池供电的便携设备。
程序编写与介绍:
import board
import digitalio
import time
# ---------- 1. 定义引脚 (依据你的实际接线) ----------
dir_pin = digitalio.DigitalInOut(board.GP5) # DIR 方向
step_pin = digitalio.DigitalInOut(board.GP6) # STEP 脉冲
en_pin = digitalio.DigitalInOut(board.GP4) # EN 使能 (新增)
# 全部设置为输出模式
dir_pin.direction = digitalio.Direction.OUTPUT
step_pin.direction = digitalio.Direction.OUTPUT
en_pin.direction = digitalio.Direction.OUTPUT
# ---------- 2. 使能电机 (EN = Low 低电平) ----------
en_pin.value = False # False 代表 0V,即低电平,使能电机
print("Motor enabled (EN = Low)")
# ---------- 3. 参数配置 ----------
MICROSTEPS = 8 # 如果 MS1/MS2 悬空,默认是 1/8 细分
STEPS_PER_REV = 200 # 步进角 1.8° 的电机,一圈 200 个整步
TOTAL_STEPS = STEPS_PER_REV * MICROSTEPS # 一圈所需的微步数 (1600)
# ---------- 4. 电机运动函数 ----------
def step_motor(steps, direction=True, delay_us=1000):
"""
发送脉冲
:param steps: 要走多少微步
:param direction: True=正转, False=反转
:param delay_us: 每步延时(微秒),数值越小速度越快
"""
dir_pin.value = direction # 先设定方向
delay_sec = delay_us / 1_000_000.0 # 转为秒(CircuitPython 专用)
for _ in range(steps):
step_pin.value = True
time.sleep(delay_sec)
step_pin.value = False
time.sleep(delay_sec)
# ---------- 5. 主循环 ----------
print("Stepper motor test starting...")
while True:
print("Forward 1 revolution")
step_motor(TOTAL_STEPS, direction=True, delay_us=1000)
time.sleep(1)
print("Reverse 1 revolution")
step_motor(TOTAL_STEPS, direction=False, delay_us=1000)
time.sleep(1)
1. 导入必要的库
import board
import digitalio
import time
board:提供对开发板(Raspberry Pi Pico)上引脚(如 GP0、GP5)的访问。
digitalio:用于控制数字输入/输出引脚(设置方向、读取或写入高低电平)。
time:提供延时功能(time.sleep())。这里使用 time.sleep() 而非 time.sleep_us(),因为 CircuitPython 中 time 模块不包含 sleep_us,但可以通过浮点数实现微秒级延时。
2. 定义并初始化引脚
dir_pin = digitalio.DigitalInOut(board.GP5) # DIR 方向
step_pin = digitalio.DigitalInOut(board.GP6) # STEP 脉冲
en_pin = digitalio.DigitalInOut(board.GP4) # EN 使能
创建三个引脚对象,分别对应 TMC2209 的 DIR、STEP 和 EN 控制引脚。
你实际接线是:
DIR → GP5
STEP → GP6
EN → GP4
dir_pin.direction = digitalio.Direction.OUTPUT
step_pin.direction = digitalio.Direction.OUTPUT
en_pin.direction = digitalio.Direction.OUTPUT
将三个引脚都设为 输出模式,以便我们向驱动器发送控制信号。
3. 使能电机(EN 引脚拉低)
en_pin.value = False # False 代表 0V,即低电平,使能电机print("Motor enabled (EN = Low)")
TMC2209 的 EN 引脚为 低电平有效:
False(即 0V)→ 驱动器使能,电机线圈通电,有保持力矩,可以响应步进脉冲。
True(即 3.3V)→ 驱动器禁用,电机处于自由状态,无保持力矩。
这里通过 en_pin.value = False 使能电机,并打印提示信息。
4. 配置步进参数
MICROSTEPS = 8 # 如果 MS1/MS2 悬空,默认是 1/8 细分STEPS_PER_REV = 200 # 步进角 1.8° 的电机,一圈 200 个整步TOTAL_STEPS = STEPS_PER_REV * MICROSTEPS # 一圈所需的微步数 (1600)
MICROSTEPS:当前驱动器设置的微步细分。
你的 TMC2209 模块上 MS1、MS2 引脚如果悬空,默认就是 1/8 细分(即一个整步被分成 8 个微步)。
如果你通过硬件跳线改为其他细分(如 1/16、1/32),需要相应修改此值。
STEPS_PER_REV:步进电机的整步步数。
常见两相步进电机步距角为 1.8°,因此一圈 360° 需要 200 个整步(360/1.8=200)。
TOTAL_STEPS:电机转一圈所需的微步数。
例如 1/8 细分下,一圈需要 200 × 8 = 1600 个微步脉冲。
5. 定义电机运动函数 step_motor()
参数说明:
steps:要发送的脉冲数量(微步数)。
direction:True 表示正转,False 表示反转。
delay_us:每个脉冲的高电平保持时间和低电平保持时间(单位微秒)。这个值决定了电机转速:数值越小,脉冲频率越高,转速越快;数值越大,转速越慢。
工作原理:
首先根据 direction 设置方向引脚的电平。
将微秒延时换算为秒(delay_sec),因为 time.sleep() 接受秒为单位的浮点数。
循环 steps 次:
将 STEP 引脚置高 → 产生上升沿,驱动器接收一个脉冲,电机转动一个微步。
等待 delay_sec 秒。
将 STEP 引脚置低 → 准备下一个脉冲。
等待 delay_sec 秒。
这样每个脉冲的周期是 2 × delay_sec 秒,频率 = 1 / (2 × delay_sec)。
6. 主循环(无限循环)
print("Stepper motor test starting...")
while True:
print("Forward 1 revolution")
step_motor(TOTAL_STEPS, direction=True, delay_us=1000)
time.sleep(1)
print("Reverse 1 revolution")
step_motor(TOTAL_STEPS, direction=False, delay_us=1000)
time.sleep(1)
程序启动后,首先打印启动信息。
进入无限循环:
打印 “Forward 1 revolution”。
调用 step_motor(TOTAL_STEPS, True, 1000):正转一圈(1600 微步),每步延时 1000 μs(即 1ms),所以一圈耗时 = 1600 × 2 × 0.001 = 3.2 秒(粗略,因还有指令执行时间)。
调用 time.sleep(1) 暂停 1 秒。
打印 “Reverse 1 revolution”。
调用 step_motor(TOTAL_STEPS, False, 1000):反转一圈。
再暂停 1 秒。
然后重复以上过程,直到断电或复位。
硬件注意事项
电源:TMC2209 的 VM 端必须连接电机电源(如 12V),GND 与电源负极相连。
逻辑电平:VIO 接 Pico 的 3.3V,确保信号电平匹配。
共地:Pico 的 GND 与驱动器的 GND 必须连接在一起(通常通过 VIO 旁边的 GND 脚)。
VREF 调节:模块上的电位器用于设置最大电流,若电流太小可能无法驱动负载,太大则发热严重。建议用万用表测量 VREF 电压,参考公式 电流 = VREF × 1.2(具体看模块说明)。
常见调整
改变转速:修改 delay_us 参数(如改为 2000 则速度减半,改为 500 则速度加倍)。
改变旋转圈数:修改 TOTAL_STEPS 的值(例如乘以 5 就转 5 圈)。
让电机连续单向转动:删除 while 循环中的反转和暂停部分,只保留正转调用。
串口情况:

我要赚赏金
