直流减速编码电机的使用(STM32f103c8t6)L298N电机驱动模块

引言

直接减速电机就是在直流电机上加上霍尔编码器,霍尔编码器可用于电机转动的测速,A、B相会产生相位相差90°的方波信号。stm32可以使用硬件资源或者软件模拟来捕获编码器信号。这里我介绍的是stm32自带的编码器模式来使用直流减速电机。

1.模块介绍

1.1直流减速编码电机

以下是直流减速电机的商品图
​​直流减速电机商品图
同时我使用的是转速为620的直流电机,此直流电机的电流在0.07A(空载)到1.8A(堵转)之间。
编码器接线方式
直流电机和编码盘互相独立供电,红色和白色需要连接到电机驱动模块的输出。黑色和绿色是编码器电源,3.3V供电。黄色和绿色就是编码器的AB相,硬件资源会占用定时器的ch1和ch2通道。

1.2电机驱动模块

直流电机没有办法直接接在单片机上面使用,大部分的单片机引脚通过的电流在100mA左右,没有办驱动直流电机,同时单片机也无法承受直流电机的反馈脉冲电流强度,会导致单片机烧毁。所以单片机驱动电机时添加驱动电路来控制电机的转动。也就是由外部电源来提供电流,驱动电机转动。
这里使用的是L298N驱动模块来驱动电机转动。
L298N
驱动模块的5V连接到单片机的5V接口,L298N模块在连接外部电源时会给单片机5V供电,L298N模块的GND连接电池的负极以及单片机板载GND,输出A和输出B连接电机的正负极。
在测试模块是否正常使用时,使能端(ENA和ENB)的跳线帽可以不拔(这样相当于ENA、ENB接高电平,),IN1,IN2设置高低电平来让电机转动。当使用PWM信号控制电机转速时,使能端的跳线帽要拔下来,同时PWM信号要输入在使能端。

以下是L298N驱动模块的引脚使用方法

ENAIN1IN2转动
110
101
111
0--
ENBIN3IN4转动
110
101
111
0--

接线如下
ENA–>PA8
ENB–>PA9
IN1–>PB12
IN2–>PB13
IN3–>PB14
IN4–>PB15
编码器1–>PA0 PA1
编码器2–>PA6 PA7
之后的代码只举例一个编码电机,也就是编码器2。
接线图

2.软件部分

2.1中断配置

使用TIM4定时器进行软件中断,用于刷新OLED显示stm32捕获编码器的速度值,单独写在Timer.c的文件中

#include "stm32f10x.h"                  // Device header

void Timer_Init(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);		//使能TIM4时钟
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;				//TIM4中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	//先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;			//从优先级0级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);								//根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
	
	TIM_TimeBaseStructure.TIM_Period = 10000-1;				//总的值设置为0xFFFF,设定计数器自动重装值
	TIM_TimeBaseStructure.TIM_Prescaler = 7200-1;			//预分频器
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;				//设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;	//TIM向上计数模式
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);				//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
	
	TIM_Cmd(TIM4, ENABLE);										//开启定时器
	TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);					//开启定时器更新中断
}

中断函数可以写在Timer.c文件或者main.c文件

void TIM4_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM4, TIM_IT_Update) == SET)
	{
		//LED_ON();//用于测试是否进入中断
		Speed1 = Encoder_Get1();
		Speed2 = Encoder_Get2();
		TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
	}
}

这里需要说明一下LED_ON();的函数,这个函数的作用是点亮stm32f103c8t6最小系统板自带的LED灯,新手在配置中断时候可以使用这样的方法快速检验是否进入中断。

2.2编码器模式配置

这里把TIM3配置为编码器模式,当定时器配置为编码器模式的时候,时钟会被占用,无法处理其他任何工作,并且编码器模式会占用时钟的1和2通道。

#include "stm32f10x.h"                  // Device header

void Encoder_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//开启时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;//配置GPIO
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
		
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//配置时基单元
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;		//ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;		//PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
	
	TIM_ICInitTypeDef TIM_ICInitStructure;//配置编码器模式
	TIM_ICStructInit(&TIM_ICInitStructure);
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
	TIM_ICInitStructure.TIM_ICFilter = 0xF;
	TIM_ICInit(TIM3, &TIM_ICInitStructure);
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
	TIM_ICInitStructure.TIM_ICFilter = 0xF;
	TIM_ICInit(TIM3, &TIM_ICInitStructure);
	//开启编码器模式
	TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
	
	TIM_Cmd(TIM3, ENABLE);//使能时钟
}

int16_t Encoder_Get(void)//获取编码器模式读取的值,用于OLED显示
{
	int16_t Temp;
	Temp = TIM_GetCounter(TIM3);
	TIM_SetCounter(TIM3, 0);
	return Temp;
}

2.3主函数代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "OLED.h"
#include "L298N.h"
#include "Timer.h"
#include "Encoder.h"

int16_t Speed1,Speed2;

int main(void)
{
	
	OLED_Init();
	Timer_Init();
	LED_Init();
	Encoder_Init();
	L298N_Init();
	OLED_ShowString(1, 1, "Speed1:");
	OLED_ShowString(2, 1, "Speed2:");
	
	while (1)
	{
		
		OLED_ShowSignedNum(1, 7, Speed1, 5);
		OLED_ShowSignedNum(2, 7, Speed2, 5);
		L298N_TurnText();
	}
}

void TIM4_IRQHandler(void)//中断函数一直刷新编码器模式捕获的值
{
	if (TIM_GetITStatus(TIM4, TIM_IT_Update) == SET)
	{
		//LED_OFF();//用于测试是否进入中断
		Speed1 = Encoder_Get1();
		Speed2 = Encoder_Get2();
		TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
	}
}

OLED显示刷新放在中断函数中是为了多任务考虑,如果只需要单片机显示编码器的值,那OLED的刷新放在主函数中就可以,但是会占用主程序的资源,单片机执行其他任务就会有压力。所以将OLED显示刷新放在中断函数中显示

3.总结

使用stm32来捕获编码电机信号,主要是使用TIM_EncoderInterfaceConfig函数来开启和配置编码器模式。stm32的编码器模式相关函数只有这一个。

stm32使用PWM信号控制直流电机速度会在我的其他文章中说明(还没有更新出来),更新后我会把文章链接放在末尾。

  • 24
    点赞
  • 234
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
### 回答1: STM32F103C8T6 可以通过 L298N驱动直流减速电机STM32F103C8T6 是一款常用的微控制器,可以通过其外接的 L298N 来对直流电机进行控制。L298N 是一款常用的直流电机驱动器,可以通过 PWM 信号来控制电机的速度和方向。需要注意的是需要通过控制 L298N 的 IN1, IN2, IN3, IN4 这四个引脚来控制电机的方向和速度。 ### 回答2: STM32F103C8T6是一款基于ARM Cortex-M3内核的单片机,而L298N是一款双通道H桥直流电机驱动器。当需要用STM32F103C8T6控制直流减速电机时,可以使用L298N作为驱动器来实现。 L298N驱动器具有两个H桥电路,可以连接和控制两个直流电机。每个电机都有两个输入引脚,分别称为输入1和输入2,这两个输入引脚用于控制电机的正转、反转和停止动作。此外,还有一个使能引脚,用于使能或禁用整个驱动器。 在STM32F103C8T6上,可以使用软件或硬件PWM来生成控制信号。将其中两个GPIO引脚与L298N的输入引脚连接,将一个GPIO引脚用作使能引脚。使用STM32F103C8T6的GPIO控制这些引脚的输出状态,可以控制直流减速电机的运动方向和速度。 要控制直流减速电机,首先需要设置GPIO引脚的工作模式为输出模式,并将其输出状态初始化为停止状态,即输入1和输入2引脚都设置为低电平。然后,通过改变输入1和输入2引脚的电平状态,可以实现电机正转、反转或停止。 在程序中,可以使用定时器来生成PWM信号,通过改变占空比来控制电机的速度。通过改变PWM信号的频率,还可以调整电机的转动速度范围。需要注意的是,根据直流减速电机的规格和要求,还需要适当设置L298N驱动器的供电电压,以保证电机正常工作。 总之,通过将STM32F103C8T6L298N驱动器连接,可以方便地控制直流减速电机的运动,实现正转、反转和停止动作,并通过调整PWM信号的占空比和频率来控制电机的速度。 ### 回答3: 要使用STM32F103C8T6驱动L298N控制直流减速电机,首先需要将STM32F103C8T6L298N连接起来。连接方式如下: 1. 首先将STM32F103C8T6的3.3V和GND引脚分别连接到L298N的5V和GND引脚上,以供电。 2. 将STM32F103C8T6的任意GPIO引脚(如PB0)连接到L298N的ENA引脚上,以控制电机使能。 3. 将STM32F103C8T6的两个GPIO引脚(如PB1和PB2)分别连接到L298N的IN1和IN2引脚上,以控制电机方向。 4. 将L298N的OUT1和OUT2引脚连接到直流减速电机的正负极上,用于提供电机驱动。 连接完成后, 我们可以通过编写STM32F103C8T6的代码来控制L298N驱动直流减速电机。 首先, 初始化GPIO引脚,将ENA引脚设置为输出模式,将IN1和IN2引脚设置为输出模式。 然后, 可以通过控制ENA引脚的高低电平来使能或禁用电机。当ENA引脚为高电平时,电机会工作;当ENA引脚为低电平时,电机会停止。 接下来, 我们可以通过控制IN1和IN2引脚的高低电平来控制电机的方向。例如,将IN1引脚设置为高电平,将IN2引脚设置为低电平,电机将会正转;反之,将IN1引脚设置为低电平,将IN2引脚设置为高电平,电机将会反转。 最后, 可以通过改变ENA引脚的PWM占空比来控制电机的转速。通过改变PWM占空比的大小,可以调节电机的转速。 综上所述,通过连接STM32F103C8T6L298N,并编写相应的控制代码,我们可以成功驱动直流减速电机
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿昕同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值