L298电机驱动模块STM32程序封装

L298电机驱动模块STM32程序封装

程序可以控制电机驱动模块实现 前进、后退、左右转、停止、PWM速度调节。适用于多种电机奁动模块。

1、适用模块:

L298N电机驱动模块

L

TB6612F电机驱动模块
在这里插入图片描述
L293D电机驱动模块在这里插入图片描述

2、程序:

L298.h

/*******************************************************************/
#ifndef __L298_H
#define __L298_H
#include "stm32f10x.h"

void Go_forward (void);	 //前进
void Go_back(void);	 //后退
void Turn_right(void);	 //右转	
void Go_forward (void);	 //前进
void Turn_left(void);	 //左转
void Go_stop(void);	 //停止

void L298_Init(void);
void TIM3_PWM_Init(u16 arr,u16 psc);
void TIM2_PWM_Init(u16 arr,u16 psc);


void PWM_ENA(u16 pwm);  //0--100
void PWM_ENB(u16 pwm); //0--100

#endif

L298.c

#include"L298.h"


//PWMA->PB.5
//Q1->PB.6 
 //Q2-->PB.7
 
//PWMB-PB.3 
//Q3-->PB.1 
//Q4-->PB.4 
void L298_Init(void)
{
 
	 GPIO_InitTypeDef  GPIO_InitStructure;
	 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	 //使能PB端口时钟
		
	
	 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
	 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
	
	 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;				 //	Q1->PB.6 端口配置
	 GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB.7


	 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;	    		 //Q2-->PB.7 端口配置, 推挽输出
	 GPIO_Init(GPIOB, &GPIO_InitStructure);	  				 //推挽输出 ,IO口速度为50MHz


	 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;	    		 //Q3-->PB.1 端口配置, 推挽输出
	 GPIO_Init(GPIOB, &GPIO_InitStructure);	  				 //推挽输出 ,IO口速度为50MHz


	  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;	    		 //Q4-->PB.4 端口配置, 推挽输出
	  GPIO_Init(GPIOB, &GPIO_InitStructure);	  				 //推挽输出 ,IO口速度为50MHz



    Go_stop();	 //停止
	  TIM3_PWM_Init(7199,0);	 //PWM=72000000/7200=10Khz
    TIM2_PWM_Init(7199,0);	 //PWM=72000000/7200=10Khz
}

void Go_forward (void)	 //前进
{
	GPIO_ResetBits(GPIOB,GPIO_Pin_7);//Q1=0;	//M1正转
	GPIO_SetBits(GPIOB,GPIO_Pin_6);//Q2=1;
		
	GPIO_ResetBits(GPIOB,GPIO_Pin_1);//Q3=0;  //M2正转
	GPIO_SetBits(GPIOB,GPIO_Pin_4);//Q4=1;
 }

void Go_back(void)	 //后退
{
	GPIO_SetBits(GPIOB,GPIO_Pin_7);//QQ1=1;	//M1反转
	GPIO_ResetBits(GPIOB,GPIO_Pin_6);//Q2=0;
		
	GPIO_SetBits(GPIOB,GPIO_Pin_1);//Q3=1;  //M2反转
	GPIO_ResetBits(GPIOB,GPIO_Pin_4);//Q4=0;
 }

void Turn_right(void)	 //右转
{
	GPIO_ResetBits(GPIOB,GPIO_Pin_7);//Q1=0;	//M1正转
	GPIO_SetBits(GPIOB,GPIO_Pin_6);//Q2=1;
		
		  
	GPIO_SetBits(GPIOB,GPIO_Pin_1);//Q3=1;  //M2反转
	GPIO_ResetBits(GPIOB,GPIO_Pin_4);//Q4=0;

 }

void Turn_left(void)	 //左转
{
	GPIO_SetBits(GPIOB,GPIO_Pin_7);//Q1=1;	//M1反转
	GPIO_ResetBits(GPIOB,GPIO_Pin_6);//Q2=0;
		
	GPIO_ResetBits(GPIOB,GPIO_Pin_1);//Q3=0;  //M2正转
	GPIO_SetBits(GPIOB,GPIO_Pin_4);//Q4=1;	
 }

void Go_stop(void)	 //停止
{
	GPIO_ResetBits(GPIOB,GPIO_Pin_7);//Q1=0;	
	GPIO_ResetBits(GPIOB,GPIO_Pin_6);//Q2=0;
	
  GPIO_ResetBits(GPIOB,GPIO_Pin_1);//Q3=0; 
	GPIO_ResetBits(GPIOB,GPIO_Pin_4);//Q4=0;
 }


//****************************PID********************************
//TIM3 PWM部分初始化 
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)
{  
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);	//使能定时器3时钟
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
	
	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5    
 
   //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形	GPIOB.5
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
 
   //初始化TIM3
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
	
	//初始化TIM3 Channel2 PWM模式	 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low ; //输出极性:
	TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2

	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
  TIM_Cmd(TIM3, ENABLE);  //使能TIM3
	
}

void TIM2_PWM_Init(u16 arr,u16 psc)
{  
	 GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
 
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
   	GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE); //调用函数顺序很重要,PinRemap要放在时钟初始化之后。  
   	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); 

   //设置GPIOB.3该引脚为复用输出功能,输出TIM2 CH2/ 的PWM脉冲波形
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //TIM2_CH2  TIM2_CH4
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 80K
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
//	TIM_OCInitStructure.TIM_Pulse = 360; //设置待装入捕获比较寄存器的脉冲值
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
	TIM_OC2Init(TIM2, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
	//将ch2  ch4 异步
	//TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
	//TIM_OC4Init(TIM2, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

	TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);  //CH2预装载使能	 
	//TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);  //CH4预装载使能	
	
	TIM_ARRPreloadConfig(TIM2, ENABLE); //使能TIMx在ARR上的预装载寄存器
	TIM_CtrlPWMOutputs(TIM2,ENABLE);	//MOE 主输出使能	
	TIM_Cmd(TIM2, ENABLE);  //使能TIM2


}

void PWM_ENA(u16 pwm)  //0--100
{
	float f = 71.99 * pwm;
	TIM_SetCompare2(TIM3,f);
	
}
			
void PWM_ENB(u16 pwm) //0--100
{
	float f = 71.99 * pwm;
	TIM_SetCompare2(TIM2,f);
	
}		

man.c

#include "L298.h"
int main(void)
{	
  L298_Init();
  PWM_ENA(100);
  PWM_ENB(100);
  Go_forward();
  
}  

  • 5
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要基于STM32F103C8T6 HAL库配置L298N电机驱动模块进行小车调速控制,可以按照以下步骤进行: 1. 确保已经正确连接好L298N电机驱动模块STM32F103C8T6开发板,并将L298N的使能引脚连接到STM32的任意输出引脚。同时,将需要控制的电机连接到L298N的相应输出引脚。 2. 在STM32CubeMX中配置GPIO引脚,将使能引脚配置为输出模式,并使能相应的时钟。根据需要,配置其他GPIO引脚来控制L298N的IN1、IN2、IN3、IN4输入引脚。 3. 在主函数中初始化HAL库,并设置GPIO引脚的初始状态。 4. 使用HAL库的GPIO模块控制相应的引脚,以控制L298N的输入引脚。根据需要,可以使用PWM模块来控制电机的速度。 5. 编写控制函数,例如向前、向后、左转、右转等。在函数内部,设置引脚状态以实现相应的控制动作。 6. 调用相应的控制函数,实现小车的调速控制。可以根据需要修改PWM的占空比以改变电机的速度。 7. 编译并烧录程序STM32F103C8T6开发板上,并将小车放置在平坦的地面上。 8. 运行程序后,通过调用控制函数来实现小车的调速控制。观察小车的运动情况,并根据需要调整PWM的占空比以达到预期的速度和控制效果。 以上是基于STM32F103C8T6 HAL库配置L298N电机驱动模块进行小车调速控制的简要步骤。具体的实现可能会因为硬件和软件环境的不同而有所差异,具体的步骤和代码实现可以根据具体情况进行调整。 ### 回答2: 基于STM32F103C8T6和HAL库,可以使用L298N电机驱动模块进行小车的调速控制。下面是一个简单的流程: 1. 首先,需要初始化STM32的引脚和外设。使用HAL库提供的函数,将相关引脚配置为输出模式,以控制L298N模块中的使能引脚、方向引脚等。同时,还需要初始化定时器和PWM输出通道,以控制电机的转速。 2. 设置PWM的频率和占空比。根据应用需求,可以选择合适的PWM频率和占空比参数。可以使用HAL库提供的函数设置定时器的频率,以及通过设置PWM输出通道的比较值来控制电机的转速。 3. 根据实际情况,确定启动/停止电机和正转/反转的逻辑。编写控制函数,通过设置引脚的电平状态来启动/停止电机,以及控制电机的正转/反转。 4. 实现调速控制。可以通过改变PWM输出通道的占空比来实现调速控制。可以将控制函数封装为具有参数输入的函数,根据参数的不同调整占空比。然后,将调速控制函数与其他传感器获得的数据结合起来,实现小车的自动调速。 5. 最后,根据需要使用中断或定时器中断,以固定的频率调用调速控制函数,实现连续的控制动作。 以上就是基于STM32F103C8T6和HAL库配置L298N电机驱动模块进行小车调速控制的简要流程。具体实现还需要根据实际情况进行具体编码和调试,同时结合其他模块和传感器的功能来完善小车的功能。 ### 回答3: 基于STM32F103C8T6 HAL库配置的L298N电机驱动模块可以实现小车的调速控制。以下是实现调速控制的步骤: 1. 初始化GPIO引脚:使用HAL库的GPIO_Init函数初始化用于控制电机驱动模块的引脚,包括使能引脚(EN)和输入引脚(IN1、IN2、IN3、IN4)。 2. 设置PWM输出:使用HAL库的TIM_PWM_Init函数初始化定时器和PWM输出通道,将PWM信号输出到IN1和IN2引脚上,控制电机的转速。 3. 编写调速控制算法:可以使用PID算法等方法,获取期望速度和实际速度之间的误差,并根据误差调整占空比来控制电机的速度。 4. 根据调整后的占空比,设置PWM输出信号,改变电机的转速。 5. 程序循环执行,不断更新期望速度和实际速度,以保持小车的调速控制。 需要注意的是,L298N电机驱动模块可以控制两个直流电机,因此对于四个输入引脚(IN1、IN2、IN3、IN4),可以分别连接两个电机的控制引脚。EN引脚用于使能电机驱动模块的功率输出。 以上是基于STM32F103C8T6 HAL库配置的L298N电机驱动模块进行小车调速控制的基本流程。具体实现还需根据具体的硬件连接和控制算法进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值