步进电机又称为脉冲电机,简而言之,就是一步一步前进的电机。
基于最基本的电磁铁原理,它是一种可以自由回转的电磁铁,其动作原理是依靠气隙磁导的变化来产生电磁转矩。步进电机的角位移量与输入的脉冲个数严格成正比,而且在时间上与脉冲同步,因而只要控制脉冲的数量、频率和电机绕组的相序,即可获得所需的转角、速度和方向。

主要分类
目前市面上主要的步进电机,按照绕组来分,共有二相、三相和五相等系列。最受欢迎的是两相混合式步进电机,约占97%以上的市场份额,其原因是性价比高,配上细分驱动器后效果良好。
该种电机的基本步距角为1.8°/步,配上半步驱动器后,步距角减少为0.9°,配上细分驱动器后其步距角可细分达256倍(0.007°/微步)。由于摩擦力和制造精度等原因,实际控制精度略低。同一步进电机可配不同细分的驱动器以改变精度和效果。
目前主流的步进电机一般是42步进电机和57步进电机。42步进电机的“42”,是指其外形长宽各为42mm。高一点的电机力矩通常更大,基本步距角一般为1.8°。42步进电机在3D打印以及各类DIY项目(如写字机)中应用非常广泛。
42步进电机:

57步进电机:

步进电机结构拆解
实际上,步进电机内部的结构主要是由许多小齿交错而成的,每交错一次步距角就可以缩小一倍。步距角越小则步进电机越精密,旋转一圈所需要的脉冲也就越多。目前市面上不管是42电机、57电机,亦或是86电机,其基本步距角通常都是1.8°。
混合式42步进电机爆炸视图:

42步进电机实物拆卸图:

42步进电机内部齿图:


TB6600驱动器简介
步进电机驱动器种类繁多,例如28步进电机驱动器ULN2003、A4988以及我们将要使用的TB6600等。

驱动器的内部原理较为复杂,不过我们无需深入理解其所有细节也能熟练使用。我们只需要了解每个端口的功能和正确接法即可。
TB6600驱动器手册地址:http://u3v.cn/63i7HW。

电路接线图示
端口功能讲解
如下图所示,TB6600驱动器一共有12个端口以及一排拨码开关。
12个端口分别为:电机使能信号(EN+/EN-)、方向控制信号(DIR+/DIR-)、步进脉冲信号(PUL+/PUL-)、电机两相(A+,A-,B+,B-)以及驱动电源(V+,V-)。
拨码开关中,SW1-SW3用于设置细分,SW4-SW6用于设置电流。

(1)电机使能信号(EN+)(EN-):全名Enable。此信号相当于一个软件开关,用于控制电机是否具备旋转能力。当电机失能时,无论进行何种操作,电机均无反应。
(2)方向控制信号(DIR+)(DIR-):全名Direction。通过控制此端口的高低电平,可以改变电机的旋转方向。利用此特性,可以实现按键控制方向等功能。
(3)步进脉冲信号(PUL+)(PUL-):全名Pulse。这是控制步进电机运动的核心信号。驱动器内部的芯片会根据接收到的脉冲信号,转换成驱动电机旋转的相序信号。可以说,没有脉冲信号,电机就无法步进。
(4)电机两相(A+,A-,B+,B-):目前市面上主流的步进电机多为两相,因其在保证精度的同时更具成本优势。
(5)拨码开关:SW1-SW3用于设置细分倍数(如1,2,4,8,16等),SW4-SW6用于设定输出电流。例如,对于额定电流1.5A的42电机,若采用8细分,则需将SW4、SW5设为ON,SW6设为OFF。

拨码开关的具体设置方法在驱动器背面均有明确标示,按图操作即可。
步进电机接线示意图
一个完整的控制系统需要控制器、驱动器和被控对象。本例中,控制器选用STM32F407单片机(其他型号如STM32F103亦可),驱动器为TB6600,被控对象为42步进电机。

驱动器接线
驱动器接线方式主要有两种:共阴极接法和共阳极接法。两者的本质相同,都是通过制造电位差来触发信号。
- 共阴极接法:将EN-、DIR-、PUL-全部连接到控制器的GND(低电平),其他信号端(EN+, DIR+, PUL+)由控制器给出高电平信号。
- 共阳极接法:将EN-、DIR-、PUL-全部连接到控制器的VCC(高电平),其他信号端由控制器给出低电平信号。
本例采用共阴极接法。

请注意:驱动器输入电压范围为直流9-42V,推荐使用24V。务必不要将电源V+和V-接反,否则会损坏驱动器。
对于步进电机的四根线(A+, A-, B+, B-),无需纠结具体相序。电机内部结构决定了相序接错仅会影响初始旋转方向。有一个简单的判别方法:任取两根线短接,然后手动旋转电机转轴,如果感觉到明显阻力,则说明这两根线属于同一相,可暂定为A相或B相。

控制器接线
控制器(STM32)的接线非常灵活,取决于程序中GPIO引脚的配置。例如,若设置PB3为脉冲输出引脚,PB4为方向控制引脚,则只需将驱动器的PUL+接至PB3,DIR+接至PB4即可。关于STM32的GPIO配置与操作,是嵌入式开发的基础,需要熟练掌握。
代码编写思路
下面进入关键的代码实现部分。核心思想是通过GPIO引脚模拟产生PWM脉冲序列,从而控制步进电机的步进与速度。
主要代码示例如下:
Motor.c
#include "Motor.h"
#include "Delay.h"
#include "led.h"
#define TotalPulses 1600 // 设置步进电机为8细分,旋转一圈需要1600个脉冲
// Motor 初始化配置
void Motor_Init(void)
{
// 开启GPIOB时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
// 配置GPIO引脚参数
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4; // 使用PB3(脉冲)和PB4(方向)
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; // 下拉
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 速度50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 设置引脚初始状态为高电平
GPIO_SetBits(GPIOB, GPIO_Pin_3 | GPIO_Pin_4);
}
// 电机启动与控制函数
void Motor_Start(void)
{
LED_BLUE_OFF; // 蓝色指示灯状态变化,用于视觉提示
LED_RED_ON;
Delay_ms(1000);
// 设定方向(例如正向)
GPIO_SetBits(GPIOB, GPIO_Pin_4);
// 模拟PWM输出,控制电机旋转
for(int i = 0; i < TotalPulses * 2; i++)
{
GPIO_SetBits(GPIOB, GPIO_Pin_3); // 产生一个脉冲高电平
Delay_us(500); // 延时决定了脉冲宽度和频率,从而控制速度
GPIO_ResetBits(GPIOB, GPIO_Pin_3); // 拉低,完成一个脉冲
Delay_us(500);
}
LED_BLUE_ON;
LED_RED_OFF;
Delay_ms(1000);
// 改变方向(反向)
GPIO_ResetBits(GPIOB, GPIO_Pin_4);
for(int i = 0; i < TotalPulses * 2; i++)
{
GPIO_SetBits(GPIOB, GPIO_Pin_3);
Delay_us(500);
GPIO_ResetBits(GPIOB, GPIO_Pin_3);
Delay_us(500);
}
}
这段代码完成了GPIO的初始化,并定义了一个电机控制函数。在函数中,通过循环和延时来模拟产生固定频率的方波(即脉冲),Delay_us(500)的参数决定了脉冲周期,从而控制了电机的转速。这种通过延时生成波形的方法,其原理与在前端开发中使用JavaScript定时器控制动画帧率有相似之处,都是对时序的精确管理。
Main.c
#include "stm32f4xx.h"
#include "led.h"
#include "Delay.h"
#include "usart.h"
#include "Motor.h"
// 程序入口主函数
int main(void)
{
USART1_Init(115200); // 初始化串口,可用于调试
Led_Init(); // LED初始化
Motor_Init(); // 电机控制引脚初始化
while (1) // 主循环
{
Motor_Start(); // 执行电机控制
}
}
实操效果展示

通过修改Motor_Start()函数中Delay_us()的参数,可以轻松调节电机的转速。本质上这是改变了模拟PWM波的频率,频率越高,电机旋转越快。
本文介绍了基于STM32标准库和TB6600驱动器控制42步进电机的完整流程,从原理、接线到代码实现。掌握这种方法后,可以进一步扩展到更复杂的运动控制场景,例如结合嵌入式系统中的定时器实现精准PWM输出,以解放CPU资源并提高控制精度。