4.20 TMC2225 步进电机驱动(来自~的贡献)
4.20.1 模块来源
资料下载:https://oshwhub.com/Knight_Sin/tmc2225
4.20.2 规格参数
工作电压:4.75V-36V
工作电流:1.4A~2A
通信方式:uart
引脚数量:16 脚
4.20.3 模块原理
4.20.3.1 引脚说明
| 引脚 | 功能 | 引脚 | 功能 |
|---|---|---|---|
| EN | 低电平使能 | VM | 电机供电电压 |
| MS1 | 微步分辨率配置 | GND | 电机供电共地 |
| MS2 | 微步分辨率配置 | B1 | 电机控制口 |
| SPREAD | 斩波模式 | A1 | |
| RX | 接收管脚 | A2 | |
| TX | 发送管脚 | B2 | |
| STEP | 步输入 | VIO | 逻辑高电平 |
| DIR | 转动方向 | GND | 地 |
传统模式下的微步分频(例如,1/4step,为 4 个 step 信号转电机的最小角度)
4.20.3.2 注意事项
在编写的过程中遇到,插在面包板上无法跑出正确的结果,会出现一顿一顿的现象,和面包板的干扰有关。建议利用这个模块是采用嘉立创制板。
4.20.4 移植工程
我们的目标是在梁山派 GD32F470 上能够控制步进电机的旋转功能。首先要获取资料,查看数据手册应如何实现,再移植至我们的工程。
4.20.4.1 引脚选择
| TMC2225 | 立创·梁山派 |
|---|---|
| EN | PA3 |
| MS1 | PA5 |
| MS2 | PA7 |
| STEP | PA2 |
| DIR | PA0 |
| VIO | 5V |
| GND | GND |
| VIM | 8V |
4.20.4.2 移植步骤
bsp_tmc2225.c
cpp
#include "BSP_TMC2225.H"
/************************************************
函数名称 : tmc2225_gpio_config
功 能 : 引脚配置
参 数 : 无
返 回 值 : 无
作 者 : ~
*************************************************/
void tmc2225_gpio_config(void)
{
/* 开启时钟 */
rcu_periph_clock_enable(BSP_EN_RCU);
rcu_periph_clock_enable(BSP_MS1_RCU); // 系统配置时钟
rcu_periph_clock_enable(BSP_MS2_RCU);
rcu_periph_clock_enable(BSP_step_RCU);
rcu_periph_clock_enable(BSP_AIR_RCU);
/* 配置为输出模式 浮空模式 */
gpio_mode_set(BSP_EN_PORT,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,BSP_EN_PIN);
/* 配置为推挽输出 50MHZ */
gpio_output_options_set(BSP_EN_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,BSP_EN_PIN);
/* 配置为输出模式 浮空模式 */
gpio_mode_set(BSP_MS1_PORT,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,BSP_MS1_PIN);
/* 配置为推挽输出 50MHZ */
gpio_output_options_set(BSP_MS1_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,BSP_MS1_PIN);
/* 配置为输出模式 浮空模式 */
gpio_mode_set(BSP_MS2_PORT,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,BSP_MS2_PIN);
/* 配置为推挽输出 50MHZ */
gpio_output_options_set(BSP_MS2_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,BSP_MS2_PIN);
/* 配置为输出模式 浮空模式 */
gpio_mode_set(BSP_step_PORT,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,BSP_step_PIN);
/* 配置为推挽输出 50MHZ */
gpio_output_options_set(BSP_step_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,BSP_step_PIN);
/* 配置为输出模式 浮空模式 */
gpio_mode_set(BSP_AIR_PORT,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,BSP_AIR_PIN);
/* 配置为推挽输出 50MHZ */
gpio_output_options_set(BSP_AIR_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,BSP_AIR_PIN);
}
/************************************************
函数名称 : step_4
功 能 : 4分频
参 数 : 无
返 回 值 : 无
作 者 : ~
*************************************************/
void step_4(void)
{
gpio_bit_write(BSP_MS1_PORT,BSP_MS1_PIN,RESET);
gpio_bit_write(BSP_MS2_PORT,BSP_MS2_PIN,RESET);
}
/************************************************
函数名称 : step_8
功 能 : 8分频
参 数 : 无
返 回 值 : 无
作 者 : ~
*************************************************/
void step_8(void)
{
gpio_bit_write(BSP_MS1_PORT,BSP_MS1_PIN,SET);
gpio_bit_write(BSP_MS2_PORT,BSP_MS2_PIN,RESET);
}
/************************************************
函数名称 : step_16
功 能 : 16分频
参 数 : 无
返 回 值 : 无
作 者 : ~
*************************************************/
void step_16(void)
{
gpio_bit_write(BSP_MS1_PORT,BSP_MS1_PIN,RESET);
gpio_bit_write(BSP_MS2_PORT,BSP_MS2_PIN,SET);
}
/************************************************
函数名称 : step_32
功 能 : 32分频
参 数 : 无
返 回 值 : 无
作 者 : ~
*************************************************/
void step_32(void)
{
gpio_bit_write(BSP_MS1_PORT,BSP_MS1_PIN,SET);
gpio_bit_write(BSP_MS2_PORT,BSP_MS2_PIN,SET);
}
/************************************************
函数名称 : DN
功 能 : 逆时针旋转
参 数 : 无
返 回 值 : 无
作 者 : ~
*************************************************/
void DN(void)
{
STEPPER_BOTTOM_ENABLE;
STEPPER_BOTTOM_Ahead;
STEPPER_BOTTOM_PulseUP;
delay_1ms(1);
STEPPER_BOTTOM_PulseDOWN;
delay_1ms(1);
}
/************************************************
函数名称 : DS
功 能 : 顺时针旋转
参 数 : 无
返 回 值 : 无
作 者 : ~
*************************************************/
void DS(void)
{
STEPPER_BOTTOM_ENABLE;
STEPPER_BOTTOM_Rear;
STEPPER_BOTTOM_PulseUP;
delay_1ms(1);
STEPPER_BOTTOM_PulseDOWN;
delay_1ms(1);
}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
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
bsp_tmc2225.h
cpp
#ifndef _BSP_TMC2225_H
#define _BSP_TMC2225_H
#include "gd32f4xx.h"
#include "systick.h"
#define BSP_EN_RCU RCU_GPIOA // 使能端口时钟
#define BSP_EN_PORT GPIOA // 使能端口
#define BSP_EN_PIN GPIO_PIN_3 // 使能引脚
#define BSP_MS1_RCU RCU_GPIOA // MS1端口时钟
#define BSP_MS1_PORT GPIOA // MS1端口
#define BSP_MS1_PIN GPIO_PIN_5 // MS1引脚
#define BSP_MS2_RCU RCU_GPIOA // MS2端口时钟
#define BSP_MS2_PORT GPIOA // MS2端口
#define BSP_MS2_PIN GPIO_PIN_7 // MS2引脚
#define BSP_step_RCU RCU_GPIOA // 步进端口时钟
#define BSP_step_PORT GPIOA // 步进端口
#define BSP_step_PIN GPIO_PIN_2 // 步进引脚
#define BSP_AIR_RCU RCU_GPIOA // 方向端口时钟
#define BSP_AIR_PORT GPIOA // 方向端口
#define BSP_AIR_PIN GPIO_PIN_0 // 方向引脚
#define STEPPER_BOTTOM_DISABLE gpio_bit_set(BSP_EN_PORT,BSP_EN_PIN)//失能底层步进电机
#define STEPPER_BOTTOM_ENABLE gpio_bit_reset(BSP_EN_PORT,BSP_EN_PIN)//使能底层步进电机
#define STEPPER_BOTTOM_Ahead gpio_bit_reset(BSP_AIR_PORT,BSP_AIR_PIN)//底层电机顺时针
#define STEPPER_BOTTOM_Rear gpio_bit_set(BSP_AIR_PORT,BSP_AIR_PIN)//底层电机逆时针
#define STEPPER_BOTTOM_PulseUP gpio_bit_set(BSP_step_PORT,BSP_step_PIN);//下电机脉冲引脚输入高
#define STEPPER_BOTTOM_PulseDOWN gpio_bit_reset(BSP_step_PORT,BSP_step_PIN);//下电机脉冲引脚输入低
void step_4(void);
void step_8(void);
void step_16(void);
void step_32(void);
void DN(void);
void DS(void);
void tmc2225_gpio_config(void); // tmc2225 gpio引脚配置
#endif1
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
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
4.20.5 移植验证
在 main.c 中编写如下代码:
cpp
/********************************************************************************
* 测试硬件:立创·梁山派开发板GD32F470ZGT6 使用主频200Mhz 晶振25Mhz
* 版 本 号: V1.0
* 修改作者: LCKFB
* 修改日期: 2022年04月19日
* 功能介绍:
******************************************************************************
* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 其余模块移植手册:https://dri8c0qdfb.feishu.cn/docx/EGRVdxunnohkrNxItYTcrwAnnHe
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
*********************************************************************************/#include "gd32f4xx.h"
#include "systick.h"
#include "main.h"
#include "sys.h"
#include "bsp_led.h"
#include "bsp_basic_timer.h"
#include "bsp_tmc2225.h"
/************************************************
函数名称 : main
功 能 : 主函数
参 数 : 无
返 回 值 : 无
作 者 : ~
*************************************************/
int main(void)
{
nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2); // 优先级分组
systick_config(); // 滴答定时器初始化
led_gpio_config(); // led初始化
// basic_timer_config(200,1000); // 定时器初始化
tmc2225_gpio_config();
step_4();
STEPPER_BOTTOM_ENABLE;
while(1)
{
DN ();
}
}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
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
案例现象:
移植成功示例工程。
文件移植成功示例
通过网盘分享的文件:立创·梁山派GD32F470ZGT6开发板【模块移植手册代码】
链接: https://pan.baidu.com/s/1pp44yjD1Dhh7U9iZ2a11IA 提取码: LCKF