4.14 N20 带编码器减速电机
N20 带编码器减速电机是一种小型的直流电机,通常用于一些较小的电子设备和机器人,它可以通过减速器(齿轮传动)来提供更大的扭矩和更低的速度。编码器是一种用于记录电机旋转角度和速度的传感器,可以帮助控制电机的位置和速度。因此,带编码器的 N20 减速电机常用于需要准确控制位置和旋转角度的应用,比如机械臂、小车和舵机等。通过编码器的反馈信号,可以精确地控制电机的运动,从而提高机器人或设备的精度和稳定性。
4.14.1 模块来源
采购链接: GA12-N20 减速马达编码器 N20 微型直流减速电机 霍尔编码器减速
4.14.2 规格参数
电机输入电压:根据采购的电机确定,比如我买的是 6V500 转
编码器输入电压:3.3V-5V
额定电流:根据电机输入电压决定
基础脉冲数:7ppr
4.14.3 移植过程
我们的目标是在梁山派 GD32F470 上能够计算电机转速的功能。首先要获取资料,查看数据手册应如何实现,再移植至我们的工程。
4.14.3.1 查看资料
直流有刷减速电机,转速越高,力量越小。转速越小,力量越大。一般 N20 电机采用的是 500 转到 600 转。
4.14.3.2 引脚选择
我采购的是 6V-300 转的编码器电机。
| N20 | 立创·梁山派 |
|---|---|
| 红线 | 5V |
| 黑线 | 3V3 |
| 黄线 | PA6 |
| 绿线 | PA7 |
| 蓝线 | GND |
| 白色线 | GND |
4.14.3.3 移植至工程
移植步骤中的导入.c 和.h 文件与之前相同,只是将.c 和.h 文件更改为 bsp_n20encoder.c 与 bsp_n20encoder.h。见 2.2.3.3 移植至工程。这里不再过多讲述。移植完成后面修改相关代码。
在文件 bsp_n20encoder.c 中,编写如下代码。
/********************************************************************************
* 文 件 名: bsp_n20encoder.c
* 版 本 号: 初版
* 修改作者: LC
* 修改日期: 2023年06月06日
* 功能介绍:
******************************************************************************
* 注意事项:
*********************************************************************************/
#include "bsp_n20encoder.h"
#include "systick.h"
#include "bsp_usart.h"
#include "stdio.h"
/******************************************************************
* 函 数 名 称:Encoder_TIM2_Init
* 函 数 说 明:定时器2的编码器模式初始化
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
******************************************************************/
void Encoder_TIM2_Init(void)
{
timer_ic_parameter_struct timer_ic_struct={0};
timer_parameter_struct timer_initpara={0};
/* 开启时钟 */
rcu_periph_clock_enable(RCU_TIMER2);
rcu_periph_clock_enable(RCU_GPIOA);
//设置引脚模式为浮空输入复用为定时器2的通道1和2
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_6);
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7);
gpio_af_set(GPIOA, GPIO_AF_2, GPIO_PIN_6);
gpio_af_set(GPIOA, GPIO_AF_2, GPIO_PIN_7);
/* 设置定时器时钟 */
rcu_timer_clock_prescaler_config(RCU_TIMER_PSC_MUL4);
// 复位定时器
timer_deinit(TIMER2);
timer_initpara.period = 65535;//设定计数器自动重装值
timer_initpara.prescaler = 0; // 预分频器
timer_initpara.clockdivision = TIMER_CKDIV_DIV1; // 不分频
timer_initpara.alignedmode = TIMER_COUNTER_EDGE; // 边缘对齐
timer_initpara.counterdirection = TIMER_COUNTER_UP; // 向上计数
timer_initpara.repetitioncounter = 0; // 重复计数器 0-255
timer_init(TIMER2,&timer_initpara); // 初始化定时器
//使用TIM2编码器模式3
timer_quadrature_decoder_mode_config(
TIMER2,
TIMER_ENCODER_MODE2, //模式3(从0开始算的)
TIMER_IC_POLARITY_RISING, //输入捕获上升边
TIMER_IC_POLARITY_RISING //输入捕获上升边
);
//先用默认值填充结构体
timer_channel_input_struct_para_init(&timer_ic_struct);
//更新通道输入捕获过滤器控制
timer_ic_struct.icfilter = 10;
timer_input_capture_config(TIMER2,TIMER_CH_0,&timer_ic_struct);
timer_input_capture_config(TIMER2,TIMER_CH_1,&timer_ic_struct);
//清除定时器2更新标志
timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_UP);
//定时器计数值清零
timer_counter_value_config(TIMER2,0);
//启用自动加载阴影功能
timer_auto_reload_shadow_enable(TIMER2);
//开启定时器2
timer_enable(TIMER2);
// timer_flag_get//获取定时器当前标志位
// timer_counter_read读定时器计数器值
}
/******************************************************************
* 函 数 名 称:Read_Encoder_Value
* 函 数 说 明:单位时间读取编码器计数
* 函 数 形 参:无
* 函 数 返 回:速度值
* 作 者:LC
* 备 注:无
******************************************************************/
int Read_Encoder_Value(void)
{
int Encoder_TIM=0;
Encoder_TIM= (short)timer_counter_read(TIMER2); //读定时器计数器值
timer_counter_value_config(TIMER2,0); //定时器计数值清零
return Encoder_TIM;
}
void TIMER2_IRQHandler(void)
{
static int val = 0;
if(SET == timer_interrupt_flag_get(TIMER2,TIMER_INT_UP))
{
timer_interrupt_flag_clear(TIMER2,TIMER_INT_UP);
}
}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
在文件 bsp_n20encoder.h 中,编写如下代码。
#ifndef _BSP_N20ENCODER_H_
#define _BSP_N20ENCODER_H_
#include "gd32f4xx.h"
void Encoder_TIM2_Init(void);
int Read_Encoder_Value(void);
#endif2
3
4
5
6
7
8
4.14.4 移植验证
在自己工程中的 main 主函数中,编写如下。
/********************************************************************************
* 文 件 名: main.c
* 版 本 号: 初版
* 修改作者: LC
* 修改日期: 2022年06月06日
* 功能介绍:
******************************************************************************
* 开发板官网:www.lckfb.com
*********************************************************************************/
#include "gd32f4xx.h"
#include "systick.h"
#include "bsp_usart.h"
#include "bsp_n20encoder.h"
#include "stdio.h"
int main(void)
{
nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2); // 优先级分组
systick_config(); //滴答定时器初始化 1ms
usart_gpio_config(115200U);
printf("encoder demo start\r\n");
Encoder_TIM2_Init();
while(1)
{
//编码器测试
printf("TIMER2->CNT->%d\r\n\r\n",Read_Encoder_Value() );
delay_1ms(500);
}
}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
移植现象:2455 为我的电机直接接到 5V 时的速度;0 为断开 5V 时的速度。
移植成功示例,见文件 4.14.4-1 。
文件 4.14.4-1 移植成功示例
通过网盘分享的文件:立创·梁山派GD32F470ZGT6开发板【模块移植手册代码】
链接: https://pan.baidu.com/s/1pp44yjD1Dhh7U9iZ2a11IA 提取码: LCKF