二相四线步进电机
步进电机是将电脉冲信号,转变为角位移或线位移的开环控制电机,又称为脉冲电机。步进电机组成最主要的就是转子和定子部分。
- 定子,就是由电流控制磁场方向,通电时就会产生磁力;
- 转子,被定子环绕在中间受定子磁场变化产生转动(下方示意图中转动的指针)
通过给定子通电,产生磁力,将转子吸附过来,那转子就会转一小格;通过给定子连续的通电,就可以实现让转子转动。
在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数。当步进驱动器接收到一个脉冲信号时,它就可以驱动步进电机按设定的方向转动一个固定的角度。因此:
- 可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;
- 可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的;
- 可以通过控制绕组通电顺序,达到控制电机正反转的目的。
模块来源
采购链接:https://item.taobao.com/item.htm?spm=a1z09.2.0.0.4be02e8dpoBqfX&id=642594293054&_u=72t4uge55e33
资料下载:无
模块原理
二相四线步进电机,二相指的是有两个线圈,四线指的是每一个线圈有两根线。其中A+与A-为一相,B+与B-为一相。
要让它转动起来,需要给线圈连续通电。而转动方式有四拍方式、八拍方式。
四拍方式的转动顺序:【A+】->【B+】->【A-】->【B-】。
八拍方式的转动顺序:【A+】->【A+B+】->【B+】->【B+A-】->【A-】->【A-B-】->【B-】->【B-A+】。
使用磁性电机,电流越大,磁力越强。虽然直接使用开发板的GPIO去控制步进电机也可以,但是会有损坏开发板引脚的风险。因此我们需要考虑一个合适的步进电机驱动。
移植工程
4.18.4-1 引脚选择
要想让步进电机动起来,我们需要先配置好引脚。引脚的配置直接配置为推挽输出模式即可。
#define AP_RCU RCU_GPIOG
#define AP_PORT GPIOG
#define AP_PIN GPIO_PIN_12
#define AM_RCU RCU_GPIOG
#define AM_PORT GPIOG
#define AM_PIN GPIO_PIN_10
#define BP_RCU RCU_GPIOB
#define BP_PORT GPIOB
#define BP_PIN GPIO_PIN_9
#define BM_RCU RCU_GPIOB
#define BM_PORT GPIOB
#define BM_PIN GPIO_PIN_6
#define AP(X) gpio_bit_write(AP_PORT, AP_PIN, X?SET:RESET)//A+
#define AM(X) gpio_bit_write(AM_PORT, AM_PIN, X?SET:RESET)//A-
#define BP(X) gpio_bit_write(BP_PORT, BP_PIN, X?SET:RESET)//B+
#define BM(X) gpio_bit_write(BM_PORT, BM_PIN, X?SET:RESET)//B-
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/******************************************************************
* 函 数 名 称:stepper_motor_config
* 函 数 说 明:对步进电机引脚初始化
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
******************************************************************/
void stepper_motor_config(void)
{
rcu_periph_clock_enable(AP_RCU); // 开启时钟
rcu_periph_clock_enable(AM_RCU); // 开启时钟
rcu_periph_clock_enable(BP_RCU); // 开启时钟
rcu_periph_clock_enable(BM_RCU); // 开启时钟
/* 配置A+推挽输出模式 上拉模式 */
gpio_mode_set(AP_PORT,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,AP_PIN);
gpio_output_options_set(AP_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,AP_PIN);
/* 配置A-推挽输出模式 上拉模式 */
gpio_mode_set(AM_PORT,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,AM_PIN);
gpio_output_options_set(AM_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,AM_PIN);
/* 配置B+推挽输出模式 上拉模式 */
gpio_mode_set(BP_PORT,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,BP_PIN);
gpio_output_options_set(BP_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,BP_PIN);
/* 配置B-推挽输出模式 上拉模式 */
gpio_mode_set(BM_PORT,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,BM_PIN);
gpio_output_options_set(BM_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,BM_PIN);
AP(0);
BP(0);
AM(0);
BM(0);
}
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
4.18.4-2 驱动方式
本案例使用的是八拍方式驱动步进电机,则顺时针的控制方式为:
最终实现顺时针旋转的代码:
//顺时针,转动顺序:a+ b+ a- b-
void motor_cw(void)
{
motor_cw_flag = 1;
motor_ccw_flag = 0;
//开启了顺时针动作
if( motor_cw_flag == 1 )
{
BM ( 0 );
AM ( 0 );
BP ( 0 );
AP ( 1 );
delay_1ms(2);
BM ( 0 );
AM ( 0 );
BP ( 1 );
AP ( 1 );
delay_1ms(2);
BM ( 0 );
AM ( 0 );
BP ( 1 );
AP ( 0 );
delay_1ms(2);
BM ( 0 );
AM ( 1 );
BP ( 1 );
AP ( 0 );
delay_1ms(2);
BM ( 0 );
AM ( 1 );
BP ( 0 );
AP ( 0 );
delay_1ms(2);
BM ( 1 );
AM ( 1 );
BP ( 0 );
AP ( 0 );
delay_1ms(2);
BM ( 1 );
AM ( 0 );
BP ( 0 );
AP ( 0 );
delay_1ms(2);
BM ( 1 );
AM ( 0 );
BP ( 0 );
AP ( 1 );
delay_1ms(2);
}
}
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
逆时针旋转同理。
//逆时针,转动顺序:b- a- b+ a+
void motor_ccw( void )
{
motor_cw_flag = 0;
motor_ccw_flag = 1;
//如果开启了逆时针动作
if( motor_ccw_flag == 1 )
{
BM ( 1 );
AM ( 0 );
BP ( 0 );
AP ( 0 );
delay_1ms(2);
BM ( 1 );
AM ( 1 );
BP ( 0 );
AP ( 0 );
delay_1ms(2);
BM ( 0 );
AM ( 1 );
BP ( 0 );
AP ( 0 );
delay_1ms(2);
BM ( 0 );
AM ( 1 );
BP ( 1 );
AP ( 0 );
delay_1ms(2);
BM ( 0 );
AM ( 0 );
BP ( 1 );
AP ( 0 );
delay_1ms(2);
BM ( 0 );
AM ( 0 );
BP ( 1 );
AP ( 1 );
delay_1ms(2);
BM ( 0 );
AM ( 0 );
BP ( 0 );
AP ( 1 );
delay_1ms(2);
BM ( 1 );
AM ( 0 );
BP ( 0 );
AP ( 1 );
delay_1ms(2);
}
}
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
我们在顺时针和逆时针函数中,加入了一个开启标志位,只有当对应标志位为1时,才会开启动作。
例如,我要让它顺时针旋转,那么可以这样写:
motor_cw_flag = 1; //开启顺时针旋转
motor_ccw_flag = 0; //关闭逆时针旋转
2
而逆时针旋转,可以这样写:
motor_cw_flag = 0; //关闭顺时针旋转
motor_ccw_flag = 1; //开启逆时针旋转
2
移植步骤中的导入.c和.h文件与上一节相同,只是将.c和.h文件更改为bsp_stepper_motor.c与bsp_stepper_motor.h。见2.2.3.3 移植至工程。这里不再过多讲述。移植完成后面修改相关代码。
详细可见【TTP224触摸传感器】中的移植至工程目录(点我查看)。这里不再过多讲述。移植完成后面修改相关代码。
(新版本)空白工程文件(更新了usart串口的文件:以后就不用在usart文件中进行更改了)
文件下载
文件4.15.3.3-1 空白工程 文件bsp_stepper_motor.c的代码如下:
/******************************************************************************
* 测试硬件:立创开发板·GD32E230C8T6 使用主频72Mhz 晶振8Mhz
* 版 本 号: V1.0
* 修改作者: www.lckfb.com
* 修改日期: 2023年11月02日
* 功能介绍:
*****************************************************************************
* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 其余模块移植手册:【立创·GD32E230C8T6开发板】模块移植手册
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
******************************************************************************/
#include "bsp_stepper_motor.h"
#include "systick.h"
#include "stdio.h"
#include "math.h"
uint8_t motor_cw_flag = 0;
uint8_t motor_ccw_flag = 0;
uint16_t step_count = 0;
/******************************************************************
* 函 数 名 称:stepper_motor_config
* 函 数 说 明:对步进电机引脚初始化
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
******************************************************************/
void stepper_motor_config(void)
{
rcu_periph_clock_enable(AP_RCU); // 开启时钟
rcu_periph_clock_enable(AM_RCU); // 开启时钟
rcu_periph_clock_enable(BP_RCU); // 开启时钟
rcu_periph_clock_enable(BM_RCU); // 开启时钟
/* 配置A+推挽输出模式 上拉模式 */
gpio_mode_set(AP_PORT,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,AP_PIN);
gpio_output_options_set(AP_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,AP_PIN);
/* 配置A-推挽输出模式 上拉模式 */
gpio_mode_set(AM_PORT,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,AM_PIN);
gpio_output_options_set(AM_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,AM_PIN);
/* 配置B+推挽输出模式 上拉模式 */
gpio_mode_set(BP_PORT,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,BP_PIN);
gpio_output_options_set(BP_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,BP_PIN);
/* 配置B-推挽输出模式 上拉模式 */
gpio_mode_set(BM_PORT,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,BM_PIN);
gpio_output_options_set(BM_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,BM_PIN);
AP(0);
BP(0);
AM(0);
BM(0);
}
//顺时针,转动顺序:a+ b+ a- b-
void motor_cw(void)
{
motor_cw_flag = 1;
motor_ccw_flag = 0;
//开启了顺时针动作
if( motor_cw_flag == 1 )
{
BM ( 0 );
AM ( 0 );
BP ( 0 );
AP ( 1 );
delay_1ms(2);
BM ( 0 );
AM ( 0 );
BP ( 1 );
AP ( 1 );
delay_1ms(2);
BM ( 0 );
AM ( 0 );
BP ( 1 );
AP ( 0 );
delay_1ms(2);
BM ( 0 );
AM ( 1 );
BP ( 1 );
AP ( 0 );
delay_1ms(2);
BM ( 0 );
AM ( 1 );
BP ( 0 );
AP ( 0 );
delay_1ms(2);
BM ( 1 );
AM ( 1 );
BP ( 0 );
AP ( 0 );
delay_1ms(2);
BM ( 1 );
AM ( 0 );
BP ( 0 );
AP ( 0 );
delay_1ms(2);
BM ( 1 );
AM ( 0 );
BP ( 0 );
AP ( 1 );
delay_1ms(2);
}
}
//逆时针,转动顺序:b- a- b+ a+
void motor_ccw( void )
{
motor_cw_flag = 0;
motor_ccw_flag = 1;
//如果开启了逆时针动作
if( motor_ccw_flag == 1 )
{
BM ( 1 );
AM ( 0 );
BP ( 0 );
AP ( 0 );
delay_1ms(2);
BM ( 1 );
AM ( 1 );
BP ( 0 );
AP ( 0 );
delay_1ms(2);
BM ( 0 );
AM ( 1 );
BP ( 0 );
AP ( 0 );
delay_1ms(2);
BM ( 0 );
AM ( 1 );
BP ( 1 );
AP ( 0 );
delay_1ms(2);
BM ( 0 );
AM ( 0 );
BP ( 1 );
AP ( 0 );
delay_1ms(2);
BM ( 0 );
AM ( 0 );
BP ( 1 );
AP ( 1 );
delay_1ms(2);
BM ( 0 );
AM ( 0 );
BP ( 0 );
AP ( 1 );
delay_1ms(2);
BM ( 1 );
AM ( 0 );
BP ( 0 );
AP ( 1 );
delay_1ms(2);
}
}
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
文件bsp_stepper_motor.h的代码如下:
/******************************************************************************
* 测试硬件:立创开发板·GD32E230C8T6 使用主频72Mhz 晶振8Mhz
* 版 本 号: V1.0
* 修改作者: www.lckfb.com
* 修改日期: 2023年11月02日
* 功能介绍:
*****************************************************************************
* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 其余模块移植手册:【立创·GD32E230C8T6开发板】模块移植手册
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
******************************************************************************/
#ifndef _BSP_STEPPER_MOTOR_H_
#define _BSP_STEPPER_MOTOR_H_
#include "gd32e23x.h"
#define AP_RCU RCU_GPIOA
#define AP_PORT GPIOA
#define AP_PIN GPIO_PIN_1
#define AM_RCU RCU_GPIOB
#define AM_PORT GPIOB
#define AM_PIN GPIO_PIN_0
#define BP_RCU RCU_GPIOA
#define BP_PORT GPIOA
#define BP_PIN GPIO_PIN_2
#define BM_RCU RCU_GPIOB
#define BM_PORT GPIOB
#define BM_PIN GPIO_PIN_1
#define AP(X) gpio_bit_write(AP_PORT, AP_PIN, X?SET:RESET)//A+
#define AM(X) gpio_bit_write(AM_PORT, AM_PIN, X?SET:RESET)//A-
#define BP(X) gpio_bit_write(BP_PORT, BP_PIN, X?SET:RESET)//B+
#define BM(X) gpio_bit_write(BM_PORT, BM_PIN, X?SET:RESET)//B-
extern uint8_t motor_cw_flag;
extern uint8_t motor_ccw_flag;
void stepper_motor_config(void);
void motor_ccw( void );
void motor_cw(void);
#endif
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
移植验证
在main.c中编写以下代码:
/******************************************************************************
* 测试硬件:立创开发板·GD32E230C8T6 使用主频72Mhz 晶振8Mhz
* 版 本 号: V1.0
* 修改作者: www.lckfb.com
* 修改日期: 2023年11月02日
* 功能介绍:
*****************************************************************************
* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 其余模块移植手册:【立创·GD32E230C8T6开发板】模块移植手册
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
******************************************************************************/
#include "gd32e23x.h"
#include "systick.h"
#include <stdio.h>
#include "bsp_usart.h"
#include "bsp_stepper_motor.h"
int main(void)
{
uint8_t motor_flag = 0;
//滴答定时器初始化 1ms
systick_config();
//串口0初始化 调试
usart_gpio_config(9600U);
//步进电机初始化
stepper_motor_config();
printf("Start!\r\n");
while(1)
{
int i = 30;
while(i > 0)
{
motor_cw();
i--;
delay_1ms(2);
}
i = 30;
while(i > 0)
{
motor_ccw();
i--;
delay_1ms(2);
}
}
}
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
现象: