N20带编码器减速电机
N20带编码器减速电机是一种小型的直流电机,通常用于一些较小的电子设备和机器人,它可以通过减速器(齿轮传动)来提供更大的扭矩和更低的速度。编码器是一种用于记录电机旋转角度和速度的传感器,可以帮助控制电机的位置和速度。因此,带编码器的N20减速电机常用于需要准确控制位置和旋转角度的应用,比如机械臂、小车和舵机等。通过编码器的反馈信号,可以精确地控制电机的运动,从而提高机器人或设备的精度和稳定性。
模块来源
采购链接:
https://item.taobao.com/item.htm?spm=a1z09.2.0.0.74a22e8d71eMcV&id=565304239241&_u=62t4uge56db9
规格参数
电机输入电压:根据采购的电机确定,比如我买的是6V500转
编码器输入电压: 3.3V-5V
额定电流:根据电机输入电压决定
基础脉冲数 :7ppr
移植过程
我们的目标是在立创开发板GD32E230C8T6上能够计算电机转速的功能。首先要获取资料,查看数据手册应如何实现,再移植至我们的工程。
查看资料
直流有刷减速电机,转速越高,力量越小。转速越小,力量越大。一般N20电机采用的是500转到600转。
引脚选择
我采购的是6V-300转的编码器电机。
移植至工程
移植步骤中的导入.c和.h文件与上一节相同,只是将.c和.h文件更改为bsp_n20encoder.c与bsp_n20encoder.h。移植完成后面修改相关代码。
详细可见【TTP224触摸传感器】中的移植至工程目录。这里不再过多讲述。移植完成后面修改相关代码。
工程参考入门手册工程模板
在文件bsp_n20encoder.c中,编写如下代码。
/******************************************************************************
* 测试硬件:立创开发板·GD32E230C8T6 使用主频72Mhz 晶振8Mhz
* 版 本 号: V1.0
* 修改作者: www.lckfb.com
* 修改日期: 2023年11月02日
* 功能介绍:
*****************************************************************************
* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 其余模块移植手册:【立创·GD32E230C8T6开发板】模块移植手册
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
******************************************************************************/
#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的通道0和1
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_1, GPIO_PIN_6);
gpio_af_set(GPIOA, GPIO_AF_1, 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
104
105
106
107
108
109
在文件bsp_n20encoder.h中,编写如下代码。
/******************************************************************************
* 测试硬件:立创开发板·GD32E230C8T6 使用主频72Mhz 晶振8Mhz
* 版 本 号: V1.0
* 修改作者: www.lckfb.com
* 修改日期: 2023年11月02日
* 功能介绍:
*****************************************************************************
* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 其余模块移植手册:【立创·GD32E230C8T6开发板】模块移植手册
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
******************************************************************************/
#ifndef _BSP_N20ENCODER_H_
#define _BSP_N20ENCODER_H_
#include "gd32e23x.h"
void Encoder_TIM2_Init(void);
int Read_Encoder_Value(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
移植验证
在自己工程中的main主函数中,编写如下。
/******************************************************************************
* 测试硬件:立创开发板·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 "bsp_usart.h"
#include "bsp_n20encoder.h"
#include "stdio.h"
int main(void)
{
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
32
33
34
35
移植现象:2523为我的电机直接接到5V时的速度;0为断开5V时的速度。