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

共2条 1/1 1 跳转至

【let'sdo第1期】静音步进电机控制实践-过程贴

工程师
2026-06-28 15:00:16     打赏

过程贴:

硬件学习:

一、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 引脚发送脉冲和方向信号来控制电机。微步进可通过 MS1MS2 引脚硬件配置,最高支持 1/64 步。

UART 配置/控制模式:通过单线 UART 接口与芯片通信,实现更高级的功能。

配置与诊断:可动态配置电流、微步(最高 1/256 步)、驱动模式等参数,并读取芯片状态和诊断信息。

速度控制:可通过向 VACTUAL 寄存器写入值,利用内部脉冲发生器控制电机速度。但内部不提供自动加减速规划,需要上位机实现。

 

4.主要优缺点

优点:

极致静音:StealthChop2™ 技术是其最大亮点,非常适合对噪音敏感的应用。

高性价比:在提供接近高端型号功能的同时,价格更具优势。

功能丰富:集成了堵转检测、动态电流调节等智能功能,简化了系统设计。

易于升级:引脚与 A4988DRV8825 等传统驱动器兼容,便于直接替换升级。

 

缺点/注意事项:

散热需求:在高负载下(如 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没有内置I2SSDIO等专用外设的不足。

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 的 DIRSTEP 和 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 模块上 MS1MS2 引脚如果悬空,默认就是 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:要发送的脉冲数量(微步数)。

directionTrue 表示正转,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 循环中的反转和暂停部分,只保留正转调用。

串口情况:

image.png



工程师
2026-06-28 15:06:44     打赏
2楼

不知道程序怎么作为代码嵌入进来。


共2条 1/1 1 跳转至

回复

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