步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件

步进电机简介

  步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累计误差等特点。使得在速度、位置等控制领域用步进电机来控制变的非常的简单。虽然步进电机已被广泛的应用,但步进电机并不能像普通的直流电机,交流电机在常规下使用。它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。因此用好步进电机也并非易事,它涉及到机械、电机、电子及计算机等多专业知识。下图即为混合式步进电机组成图。

步进电机工作原理

  通常步进电机的转子为永磁体,当电流流过定子绕组时,定子绕组产生一矢量磁场。磁场会带动转子旋转一定的角度,使得转子的一对磁场方向与定子的磁场方向一致。当定子的矢量磁场旋转一个角度。转子也随着该磁场转步距角。每输入一个电脉冲,电动机转动一个角度前进一步。它输出的角位移与输入的脉冲数成正比、转速与脉冲频率成正比。改变绕组通电的顺序,电机就会反转。所以可以控制脉冲数量、频率及电动机各相绕组的通电顺序来控制步进电机的转动。

步进电机极性区分

  步进电机又分为单极性的步进电机和双极性的步进电机,具体简易图如下所示:

  其中左侧为单极性步进电机,右侧为双极性的步进电机,从上图中不难看出区别是什么。单双极性是指一个步进电机里面有几种电流的流向,左侧的五线四相步进电机就是单极性的步进电机,图中的红色箭头为电流的走向,四根线的电流走向汇总到公共线,所以称之为单极性电机;但是右侧则不同,电机中有两个电流的回路,两个电流的回路自然就是双极性,所以称之为双极性电机。

单极性绕组

  单极性步进电机使用的是单极性绕组。其一个电极上有两个绕组,这种联接方式为当一个绕组通电时,产生一个北极磁场;另一个绕组通电,则产生一个南极磁场。因为从驱动器到线圈的电流不会反向,所以可称其为单极绕组。

双极性绕组

  双极性步进电机使用的是双极性绕组。每相用一个绕组,通过将绕组中电流反向,电磁极性被反向。典型的两相双极驱动的输出步骤在电气原理图和下图中的步进顺序中进一步阐述。按图所示,转换只利用绕组简单地改变电流的方向,就能改变该组的极性。

  永磁步进电机包括一个永磁转子、线圈绕组和导磁定子,只要将线圈通电根据电磁铁的原理就会产生磁场,分为南北极,见上图所示;通过改变步进电机定子的磁场,转子就会因磁场的变化而发生转动,同理,依次改变通电的顺序就可以使得电机转动起来。

双极性步进电机驱动原理

  下图是一个双极性的步进电机整步,步进顺序。在第一步中:将 A 相通电,根据电磁铁原理,产生磁性,并且因异性相吸,所以磁场将转子固定在第一步的位置;第二步:当 A 相关闭,B 相通电时,转子会旋转 90°;第三步:B 相关闭、A 相通电,但极性与第 1 步相反,这促使转子再次旋转 90°。在第四步中:A 相关闭、B 相通电,极性与第 2 步相反。重复该顺序促使转子按 90°的步距角顺时针旋转。

  上图中显示的步进顺序是单相激励步进,也可以理解为每次通电产生磁性的相只有一个,要么 A相,要么 B 相;但是更常用的是双相激励,但是在转换时,一次只能换相一次,具体详见下图:

  上图是两相同时通电的旋转顺序,与单相激励不同的是,单相通电后被固定在了与定子正对着的绕组极性,但是双相同时激励时转子却被固定在两个绕阻的极性中间;此时通电顺序就变成了AB 相同时通电即可。

  在双相激励的过程中,也可以在换相位时加一个关闭相位的状态而产生走半步的现象,这将步进电机的整个步距角一分为二,例如,一个 90°的步进电机将每半步移动45°,具体见下图。

  1. A 相通电,B 相不通电
  2. A、B 相全部通电,且电流相同,产生相同磁性
  3. B 相通电,A 断电
  4. A 相通电,B 断电
  5. B 相通电,A 相通电,且电流相等,产生相同磁性
  6. A、B 相全部通电,且电流相同,产生相同磁性
  7. B 相通电,A 断电
  8. B 相通电,A 相通电,且电流相等,产生相同磁性

  其中 1-4 步与 5-8 步的电流方向相反(电流相反,电磁的极性就相反)这样就产生了顺时针旋转,同理逆时针是将通电顺序反过来即可。

单极性步进电机驱动原理

  单极性与双极性步进电机驱动类似,都可以分为整步与半步的驱动方式,不同的是,双极性的步进电机可以通过改变电流的方向来改变每相的磁场方向,但是单极性的就不可以了,它有一个公共端,这就直接决定了,电流方向。具体旋转顺序详见下图:

  上图是单极性步进电机整步旋转的过程,其中,在图示中分为 5 根线,分别为 A、B、C、D 和公共端(+),公共端需要一直通电,剩下 ABCD 相中只要有一个相通电,即可形成回路产生磁场,图中的通电顺序为 A->B->C->D,即可完成上图中的顺时针旋转,如果想要逆时针旋转只需要将其倒序即可。

步进电机技术指标

静态技术指标

  • 相数:产生不同对极 N、S 磁场的激磁线圈对数,也可以理解为步进电机中线圈的组数,其中两相步进电机步距角为 1.8°,三相的步进电机步距角为1.5°,相数越多的步进电机,其步距角就越小。
  • 拍数:完成一个磁场周期性变化所需脉冲数或导电状态用 n 表示,或指电机转过一个齿距角所需脉冲数,以四相电机为例,有四相四拍运行方式即AB-BC-CD-DA-AB,四相八拍运行方式即 A-AB-B-BC-C-CD-D-DA-A。
  • 步距角:一个脉冲信号所对应的电机转动的角度,可以简单理解为一个脉冲信号驱动的角度,电机上都有写,一般 42 步进电机的步距角为 1.8°
  • 定位转距:电机在不通电状态下,电机转子自身的锁定力矩(由磁场齿形的谐波以及机械误差造成的)。
  • 翻转距:电机在额定静态电压作用下,电机不作旋转运动时,电机转轴的锁定力矩。此力矩是衡量电机体积的标准,与驱动电压及驱动电源等无关。

动态技术指标

  • 步距角精度:步进电机转动一个步距角度的理论值与实际值的误差。用百分比表示:误差/步距角 *100%。
  • 失步:电机运转时运转的步数,不等于理论上的步数。也可以叫做丢步,一般都是因负载太大或者是频率过快。
  • 失调角:转子齿轴线偏移定子齿轴线的角度,电机运转必存在失调角,由失调角产生的误差,采用细分驱动是不能解决的。
  • 最大空载起动频率:在不加负载的情况下,能够直接起动的最大频率。
  • 最大空载的运行频率:电机不带负载的最高转速频率。
  • 运行转矩特性:电机的动态力矩取决于电机运行时的平均电流(而非静态电流),平均电流越大,电机输出力矩越大,即电机的频率特性越硬。
  • 电机正反转控制:通过改变通电顺序而改变电机的正反转。

28BYJ-48步进电机简介

  28BYJ48 步进电机自带减速器,为四相无线步进电机,直径为28mm。

实物图
内部结构等效图

  28BYJ48步进电机旋转驱动方式如下表:

导线颜色 第1步 第2步 第3步 第4步 第5步 第6步 第7步 第8步
VCC 红 5V 5V 5V 5V 5V 5V 5V 5V
D  橙 GND GND GND
C  黄 GND GND GND
B  粉 GND GND GND
A  蓝 GND GND GND

  28BYJ48步进电机主要参数如下所示:

  在上图中28BYJ48步进电机主要参数中可以看到有一个减速比:1:64,步进角为5.625/64 度,如果需要转动一圈,那么需要360/5.625*64=4096个脉冲信号。
  减速比这个和之前介绍的直流减速电机有点类似,所以28BYJ48步进电机实际上是:减速齿轮+步进电机组成,28BYJ48步进电机减速齿轮实物图如下所示:

  减速齿轮计算方法如下所示:

软件设计

  本实验所要实现的功能是:通过ULN2003驱动模块控制28BYJ48步进电机运行方向及速度,当按下KEY1键可调节电机旋转方向;当按下KEY2键,电机加速,当按下KEY3键,电机减速。

实物接线图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include "reg52.h"

// 对系统默认数据类型进行重命名
typedef unsigned int u16;
typedef unsigned char u8;

// 定义ULN2003控制步进电机管脚
sbit IN1_A = P1^0;
sbit IN2_B = P1^1;
sbit IN3_C = P1^2;
sbit IN4_D = P1^3;

// 定义独立按键控制脚
sbit KEY1 = P3^0;
sbit KEY2 = P3^1;
sbit KEY3 = P3^2;
sbit KEY4 = P3^3;

// 使用宏定义独立按键按下的键值
#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
#define KEY_UNPRESS 0

// 定义步进电机速度,值越小,速度越快(最小不能小于1)
#define STEPMOTOR_MAXSPEED 1
#define STEPMOTOR_MINSPEED 5

/********************************************************************
*函数名: delay_10us
*函数功能:延时函数,ten_us=1时,大约延时10us
*输入: ten_us
*输出:无
*********************************************************************/
void delay_10us(u16 ten_us)
{
while(ten_us--);
}

/********************************************************************
*函数名: delay_ms
*函数功能: ms延时函数,ms=1时,大约延时1ms
*输入: ten_us
*输出:无
*********************************************************************/
void delay_ms(u16 ms)
{
u16 i,j;
for(i = ms;i > 0;i--)
for(j = 110;j > 0;j--);
}

/********************************************************************
*函数名: step_motor_28BYJ48_send_pulse
*函数功能:输出一个数据给ULN2003从而实现向步进电机发送一个脉冲
*输入: step:指定步进序号,可选值0~7
dir:方向选择,1:顺时针,0:逆时针
*输出:无
*********************************************************************/
void step_motor_28BYJ48_send_pulse(u8 step,u8 dir)
{
u8 temp = step;

if(dir == 0) // 如果为逆时针旋转
temp = 7 - step; // 调换节拍信号

switch(temp) // 8个节拍控制:A→AB→B→BC→C→CD→D→DA
{
case 0: IN1_A = 1;IN2_B = 0;IN3_C = 0;IN4_D = 0;break; // A
case 1: IN1_A = 1;IN2_B = 1;IN3_C = 0;IN4_D = 0;break; // AB
case 2: IN1_A = 0;IN2_B = 1;IN3_C = 0;IN4_D = 0;break; // B
case 3: IN1_A = 0;IN2_B = 1;IN3_C = 1;IN4_D = 0;break; // BC
case 4: IN1_A = 0;IN2_B = 0;IN3_C = 1;IN4_D = 0;break; // C
case 5: IN1_A = 0;IN2_B = 0;IN3_C = 1;IN4_D = 1;break; // CD
case 6: IN1_A = 0;IN2_B = 0;IN3_C = 0;IN4_D = 1;break; // D
case 7: IN1_A = 1;IN2_B = 0;IN3_C = 0;IN4_D = 1;break; // DA
}
}

u8 key_scan(u8 mode)
{
static u8 key = 1;

if(mode)
key = 1; // 连续扫描按键
if(key == 1 && (KEY1 == 0 || KEY2 == 0 || KEY3 == 0 || KEY4 == 0)) // 任意按键按下
{
delay_10us(1000); // 消抖
key = 0;
if(KEY1 == 0)
return KEY1_PRESS;
else if(KEY2 == 0)
return KEY2_PRESS;
else if(KEY3 == 0)
return KEY3_PRESS;
else if(KEY4 == 0)
return KEY4_PRESS;
}
else if(KEY1 == 1 || KEY2 == 1 || KEY3 == 1 || KEY4 == 1) // 无按键按下
{
key = 1;
}
return KEY_UNPRESS;
}

void main()
{
u8 key = 0;
u8 dir = 0; // 默认逆时针方向
u8 speed = STEPMOTOR_MAXSPEED; // 默认最大速度旋转
u8 step = 0;

while(1)
{
key = key_scan(0);
if(ke
y == KEY1_PRESS) // 换向
{
dir = !dir;
}
else if(key == KEY2_PRESS) // 加速
{
if(speed < STEPMOTOR_MAXSPEED)
speed += 1;
}
else if(key == KEY3_PRESS) // 减速
{
if(speed > STEPMOTOR_MINSPEED)
speed -= 1;
}
step_motor_28BYJ48_send_pulse(step++,dir);
if(step == 8)
step = 0;
delay_ms(speed);
}
}