两相双极性步进电机驱动

前言

最近公司报废机器,所以我从要报废的机器中拆了不少零件,其中就在光驱中拆了迷你型步进电机(参见下图),在网上查阅资料了解到这个电机叫两相双极性步进电机

驱动电机

有在网上了解到如何驱动两相双极性步进电机下面做一个简单的总结。

电机原理图

将电机简化成如下的原理图,1和2表示两个相位,即两组定子,双极性表示两个定子缠绕的线圈可以两个方向通电,并扭转定子的极性。

转动原理

如果使用原理图简单表示90度(一次转动90°)两相双极性步进电机转动一圈的过程,1表示相1正向通电,1~表示相1反向通电,2和2~同理。

  1. 相1正向通电,相2断电,使得定子1上部为N极,下部为S极,异性相吸,转子会转动到第一张图的位置;
  2. 相2正向通电,相1断电,使得定子2左部为S极,右部为N极,异性相吸,转子会转动到第二张图的位置;
  3. 相1反向通电,相2断电,使得定子1上部为S极,下部为N极,异性相吸,转子会转动到第三张图的位置;
  4. 相2反向通电,相1断电,使得定子2左部为N极,右部为S极,异性相吸,转子会转动到第二张图的位置。

电机仿真

上面介绍了两相双极性步进电机的工作原理,接下来,使用proteus来仿真Arduino来控制电机。
元器件:

* Arduino 328
* L298或ULN2004A驱动芯片
* 两相双极性步进电机

下面贴上proteus仿真过程中使用到的原理图

最后贴上上图使用树莓派驱动电机的驱动代码:

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
/* Main.ino file generated by New Project wizard
*
* Created: Thu Sep 5 2013
* Processor: ATmega328P
* Compiler: Arduino AVR
*/

#define LED ( 13 )
#define MOTOR_PIN0 ( 0 )
#define MOTOR_PIN1 ( 1 )
#define MOTOR_PIN2 ( 2 )
#define MOTOR_PIN3 ( 3 )
#define MOTOR_PIN4 ( 4 )
#define MOTOR_PIN5 ( 5 )
#define MOTOR_PIN6 ( 6 )
#define MOTOR_PIN7 ( 7 )
#define MOTOR_ENA ( 8 )
#define MOTOR_ENB ( 9 )

void setup()
{ // put your setup code here, to run once:
pinMode( LED, OUTPUT );
pinMode( MOTOR_PIN0, OUTPUT );
pinMode( MOTOR_PIN1, OUTPUT );
pinMode( MOTOR_PIN2, OUTPUT );
pinMode( MOTOR_PIN3, OUTPUT );
pinMode( MOTOR_PIN4, OUTPUT );
pinMode( MOTOR_PIN5, OUTPUT );
pinMode( MOTOR_PIN6, OUTPUT );
pinMode( MOTOR_PIN7, OUTPUT );
pinMode( MOTOR_ENA, OUTPUT );
pinMode( MOTOR_ENB, OUTPUT );
}

void MotorOne()
{
static int i = 3;

switch( i-- )
{
case 0:
digitalWrite( MOTOR_PIN0, HIGH );
digitalWrite( MOTOR_PIN1, LOW );
digitalWrite( MOTOR_PIN2, LOW );
digitalWrite( MOTOR_PIN3, LOW );
break;
case 1:
digitalWrite( MOTOR_PIN0, LOW );
digitalWrite( MOTOR_PIN1, HIGH );
digitalWrite( MOTOR_PIN2, LOW );
digitalWrite( MOTOR_PIN3, LOW );
break;
case 2:
digitalWrite( MOTOR_PIN0, LOW );
digitalWrite( MOTOR_PIN1, LOW );
digitalWrite( MOTOR_PIN2, HIGH );
digitalWrite( MOTOR_PIN3, LOW );
break;
case 3:
digitalWrite( MOTOR_PIN0, LOW );
digitalWrite( MOTOR_PIN1, LOW );
digitalWrite( MOTOR_PIN2, LOW );
digitalWrite( MOTOR_PIN3, HIGH );
break;
default:
break;
}

if( 0 > i )
i = 3;
}

void LedLight()
{
static int i = 0;
if( 0 == i++ )
digitalWrite( LED, HIGH );
else
digitalWrite( LED, LOW );

if( 2 <= i )
i = 0;
}

void MotorTwo()
{
static int i = 0;

switch( i++ )
{
case 0:
digitalWrite( MOTOR_PIN4, HIGH );
digitalWrite( MOTOR_PIN5, LOW );
digitalWrite( MOTOR_PIN6, LOW );
digitalWrite( MOTOR_PIN7, LOW );
break;
case 1:
digitalWrite( MOTOR_PIN4, LOW );
digitalWrite( MOTOR_PIN5, HIGH );
digitalWrite( MOTOR_PIN6, LOW );
digitalWrite( MOTOR_PIN7, LOW );
break;
case 2:
digitalWrite( MOTOR_PIN4, LOW );
digitalWrite( MOTOR_PIN5, LOW );
digitalWrite( MOTOR_PIN6, HIGH );
digitalWrite( MOTOR_PIN7, LOW );
break;
case 3:
digitalWrite( MOTOR_PIN4, LOW );
digitalWrite( MOTOR_PIN5, LOW );
digitalWrite( MOTOR_PIN6, LOW );
digitalWrite( MOTOR_PIN7, HIGH );
break;
default:
break;
}

if( 4 <= i )
i = 0;
}

void loop()
{ // put your main code here, to run repeatedly:

MotorOne();
LedLight();
MotorTwo();

delay(500);

}