STM32外设系列—L298N

这篇具有很好参考价值的文章主要介绍了STM32外设系列—L298N。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


🎀 文章作者:二土电子

🌸 关注文末公众号获取其他资料和工程文件!

🐸 期待大家一起学习交流!


一、L298N简介

L298N是SGS公司生产的一款通用的电机驱动模块。其内部包含4路逻辑驱动电路,有两个H桥的高电压大电流全桥驱动器,接收TTL逻辑电平信号,一个模块可同时驱动两个直流电机工作,具有反馈检测和过热自断功能。利用L298N驱动电机时,主控芯片只需通过I/O口输出控制电平即可实现对电机转向的控制,编程简单,稳定性好。

STM32外设系列—L298N

二、L298N电路图

L298N的电路图如下

STM32外设系列—L298N

OUT1、OUT2、OUT3和OUT4之间分别接两个电机。IN1、IN2、IN3和IN4引脚接STM32单片机,用来接收单片机发送来的控制电平,控制电机的转动方向,ENA和ENB为使能端。

三、L298N使用方法

L298N通常用于电机驱动,控制电机的转向,转速。电机转向通过IN1,IN2,IN3和IN4的逻辑电平控制,转向通过给输入引脚输入的PWM占空比控制。L298N控制电机转动状态的逻辑功能表如下

STM32外设系列—L298N

正如上面所说,电机的调速可以通过单片机给输入引脚发送PWM信号来实现。电机的转速与电机两端PWM信号的占空比成正比,占空比越大,电机转速越快。

四、L298N驱动电机实例

一个L298N可以驱动两个电机,博主使用时L298N用12V航模电池供电,L298N输出的5V给单片机供电。这里以利用两个L298N,驱动四个电机,搭配麦克纳姆轮实现车的前进,后退,平移和自转为例,展示一下L298N的配置和使用流程。同时,也对麦克纳姆轮做一个简单介绍。

4.1 麦克纳姆轮简介

麦克纳姆轮与传统轮胎相比可以实现全向移动,能够在较为狭小的空间内任意行进,更加灵活。虽然麦克纳姆轮相比于传统轮胎也有许多缺点,比如麦克纳姆轮的能耗高,成本也高,而且还容易受到地形限制,但是对于机器人大赛以及一些工业生产用的智能车来说,麦克纳姆轮的全向移动优势就表现得十分突出,避障时麦克纳姆轮小车可直接平移,无需提前预留转弯角度,也无需其他传感器辅助,编写程序时更加简洁,所以最终我选择使用麦克纳姆轮来实现小车的全向移动。

STM32外设系列—L298N

麦克纳姆轮主要是由轮毂和辊子两部分组成,辊子轴线和轮毂轴线夹角为45°,有互为镜像的A/B轮两种,安装时所有轮子辊子的轴线方向都要指向小车的中心,这是因为麦轮的全向移动是通过力的合成和分解来实现的,如果A/B轮混用或者没有按照上述要求安装会导致小车没法正常行驶。

4.2 定时器PWM配置

使用TIM2和TIM3的四个PWM通道(共8路PWM)来控制车速,这里配置了固定的预分频系数和自动重装载值。对于定时器的内容,可见博主STM32速成笔记的定时器介绍部分。TIM2和TIM3初始化程序如下

/*
 *==============================================================================
 *函数名称:TIM2_PWM_Init
 *函数功能:初始化定时器2的PWM
 *输入参数:无
 *返回值:无
 *备  注:预分频系数和自动重装载值固定
 *==============================================================================
 */
void TIM2_PWM_Init (void)
{
	// 结构体定义
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure;

	// 开启时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO
                       	| RCC_APB1Periph_TIM2,ENABLE);

	// 配置GPIO
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;   // 复用推挽输出
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	// 配置TIM2
	TIM_TimeBaseInitStructure.TIM_Period = 899;
	TIM_TimeBaseInitStructure.TIM_Prescaler = 0;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM2, & TIM_TimeBaseInitStructure);


	// 配置PWM通道1
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_Pulse = 899;
  TIM_OC1Init(TIM2 , &TIM_OCInitStructure);
  TIM_OC1PreloadConfig(TIM2 , TIM_OCPreload_Enable);
  
  // 配置PWM通道2
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_Pulse = 899;
  TIM_OC2Init(TIM2 , &TIM_OCInitStructure);
  TIM_OC2PreloadConfig(TIM2 , TIM_OCPreload_Enable);
  
  // 配置PWM通道3
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_Pulse = 899;
  TIM_OC3Init(TIM2 , &TIM_OCInitStructure);
  TIM_OC3PreloadConfig(TIM2 , TIM_OCPreload_Enable);
  
  // 配置PWM通道4
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_Pulse = 899;
  TIM_OC4Init(TIM2 , &TIM_OCInitStructure);
  TIM_OC4PreloadConfig(TIM2 , TIM_OCPreload_Enable);
  
	// 使能TIM2
  TIM_Cmd(TIM2 , ENABLE);
}
/*
 *==============================================================================
 *函数名称:TIM3_PWM_Init
 *函数功能:初始化定时器3的PWM
 *输入参数:无
 *返回值:无
 *备  注:预分频系数和自动重装载值固定
 *==============================================================================
 */
void TIM3_PWM_Init (void)
{
	// 结构体定义
  GPIO_InitTypeDef GPIO_InitStructure;
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  TIM_OCInitTypeDef TIM_OCInitStructure; 
	
	// 开启时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO
	                       | RCC_APB1Periph_TIM3, ENABLE);
	
	// 配置GPIO
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   // 复用推挽式输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);   
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	
  GPIO_Init(GPIOB, &GPIO_InitStructure);   
  
	// 配置TIM3
  TIM_TimeBaseStructure.TIM_Period = 899;
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseInit(TIM3 , &TIM_TimeBaseStructure);
  
  // 配置PWM通道1
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_Pulse = 900;
  TIM_OC1Init(TIM3 , &TIM_OCInitStructure);
  TIM_OC1PreloadConfig(TIM3 , TIM_OCPreload_Enable);
  
  // 配置PWM通道2
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_Pulse = 900;
  TIM_OC2Init(TIM3 , &TIM_OCInitStructure);
  TIM_OC2PreloadConfig(TIM3 , TIM_OCPreload_Enable);
  
  // 配置PWM通道3
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_Pulse = 900;
  TIM_OC3Init(TIM3 , &TIM_OCInitStructure);
  TIM_OC3PreloadConfig(TIM3 , TIM_OCPreload_Enable);
  
  // 配置PWM通道3
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_Pulse = 900;
  TIM_OC4Init(TIM3 , &TIM_OCInitStructure);
  TIM_OC4PreloadConfig(TIM3 , TIM_OCPreload_Enable);
  
	// 使能TIM3
  TIM_Cmd(TIM3 , ENABLE);
}

4.3 智能车行驶控制

这里简单阐述一下麦克纳姆轮的全向移动原理。

STM32外设系列—L298N

图中实线为车轮转动产生的摩擦力,虚线是分力,合成后可知左侧智能车向前移动,右侧智能车向右移动。其他的移动操作,如自转、平移等原理与之相同,就不再赘述。下面列一下不同行驶状态下,各个电机的旋转状态

STM32外设系列—L298N

下面是控制程序

// 差值决定快慢,差值越大越快
// 1、2差值代表左后轮和右前轮的速度;3、4差值代表左前轮和右后轮的速度
// 1-2为正代表正转,为负代表反转,差值代表速度
/*
 *==============================================================================
 *函数名称:Med_Motor_CarGo
 *函数功能:智能车前进
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Med_Motor_CarGo (void)
{
	TIM_SetCompare1(TIM2 , 899); 
  TIM_SetCompare2(TIM2 , 300);
  TIM_SetCompare3(TIM2 , 899);  
  TIM_SetCompare4(TIM2 , 300);
	
  TIM_SetCompare1(TIM3 , 899); 
  TIM_SetCompare2(TIM3 , 300);
  TIM_SetCompare3(TIM3 , 899);  
  TIM_SetCompare4(TIM3 , 300);	
}
/*
 *==============================================================================
 *函数名称:Med_Motor_CarStop
 *函数功能:智能车停止
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Med_Motor_CarStop (void)
{
	TIM_SetCompare1(TIM2 , 0); 
  TIM_SetCompare2(TIM2 , 0);
  TIM_SetCompare3(TIM2 , 0);  
  TIM_SetCompare4(TIM2 , 0);
	
  TIM_SetCompare1(TIM3 , 0);
  TIM_SetCompare2(TIM3 , 0);
  TIM_SetCompare3(TIM3 , 0);	
  TIM_SetCompare4(TIM3 , 0);
}
/*
 *==============================================================================
 *函数名称:Med_Motor_CarBack
 *函数功能:智能车后退
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Med_Motor_CarBack (void)
{
	TIM_SetCompare1(TIM2 , 300);
  TIM_SetCompare2(TIM2 , 899);
  TIM_SetCompare3(TIM2 , 300);	
  TIM_SetCompare4(TIM2 , 899);
	
  TIM_SetCompare1(TIM3 , 300);
  TIM_SetCompare2(TIM3 , 899);
  TIM_SetCompare3(TIM3 , 300);	
  TIM_SetCompare4(TIM3 , 899);
}
/*
 *==============================================================================
 *函数名称:Med_Motor_CarLe
 *函数功能:智能车向左平移
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Med_Motor_CarLeft (void)
{
	TIM_SetCompare1(TIM2 , 899);
  TIM_SetCompare2(TIM2 , 300);
  TIM_SetCompare3(TIM2 , 899);	
  TIM_SetCompare4(TIM2 , 300);
	
  TIM_SetCompare1(TIM3 , 300);
  TIM_SetCompare2(TIM3 , 899);
  TIM_SetCompare3(TIM3 , 300);
  TIM_SetCompare4(TIM3 , 899);
}
/*
 *==============================================================================
 *函数名称:Med_Motor_CarRight
 *函数功能:智能车向右平移
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Med_Motor_CarRight (void)
{
	TIM_SetCompare1(TIM2 , 300);
  TIM_SetCompare2(TIM2 , 899);
  TIM_SetCompare3(TIM2 , 300);	
  TIM_SetCompare4(TIM2 , 899);
	
  TIM_SetCompare1(TIM3 , 899);
  TIM_SetCompare2(TIM3 , 300);
  TIM_SetCompare3(TIM3 , 899);
  TIM_SetCompare4(TIM3 , 300);
}
/*
 *==============================================================================
 *函数名称:Med_Motor_ClockwiseRotate
 *函数功能:智能车顺时针自转
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Med_Motor_ClockwiseRotate (void)
{
	TIM_SetCompare1(TIM2 , 300);
  TIM_SetCompare2(TIM2 , 899);
  TIM_SetCompare3(TIM2 , 899);	
  TIM_SetCompare4(TIM2 , 300);
	
  TIM_SetCompare1(TIM3 , 300);
  TIM_SetCompare2(TIM3 , 899);
  TIM_SetCompare3(TIM3 , 899);
  TIM_SetCompare4(TIM3 , 300);
}
/*
 *==============================================================================
 *函数名称:Med_Motor_CounterClockwiseRotate
 *函数功能:智能车逆时针自转
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Med_Motor_CounterClockwiseRotate (void)
{
	TIM_SetCompare1(TIM2 , 899);
  TIM_SetCompare2(TIM2 , 300);
  TIM_SetCompare3(TIM2 , 300);	
  TIM_SetCompare4(TIM2 , 899);
	
  TIM_SetCompare1(TIM3 , 899);
  TIM_SetCompare2(TIM3 , 300);
  TIM_SetCompare3(TIM3 , 300);
  TIM_SetCompare4(TIM3 , 899);
}

五、拓展应用

知道了L298N的控制和调速方法,我们就能做许多事情。比如利用蓝牙来调整智能车行驶速度。实际原理就是通过蓝牙给配置占空比的函数传入数值,改变占空比,从而达到遥控调节车速的目的。这个在后续的实战项目系列中会有相关介绍。文章来源地址https://www.toymoban.com/news/detail-506979.html

到了这里,关于STM32外设系列—L298N的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32外设系列—HC-05(蓝牙)

    🎀 文章作者:二土电子 🌸 关注文末公众号获取其他资料和工程文件! 🐸 期待大家一起学习交流! 蓝牙(Bluetooth)是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换(使用2.4~2.485GHz的ISM波段的UHF无线电波)。蓝牙技术最初由电信巨头爱立信

    2024年02月12日
    浏览(48)
  • STM32外设系列—sg90(舵机)

    🎀 文章作者:二土电子 🌸 关注文末公众号获取其他资料和工程文件! 🐸 期待大家一起学习交流! 首先介绍说一下什么是舵机。舵机是一种位置(角度)伺服的驱动器。适用于一些需要角度不断变化的,可以保持的控制系统。sg90就是舵机的一种。 舵机的工作原理比较简

    2024年02月15日
    浏览(43)
  • STM32外设系列—TB6612FNG

    🎀 文章作者:二土电子 🌸 关注文末公众号获取其他资料和工程文件! 🐸 期待大家一起学习交流! 本文涉及到定时器和串口的知识,详细内容可见博主STM32速成笔记专栏。 TB6612FNG是东芝半导体的一款驱动电机的IC。一个TB6612FNG可以驱动两个电机,每一个驱动都有两个逻辑

    2024年02月14日
    浏览(48)
  • STM32外设系列—ESP8266(WIFI)

    🎀 文章作者:二土电子 🌸 关注文末公众号获取其他资料和工程文件! 🐸 期待大家一起学习交流! ESP8266是嵌入式和物联网开发中常用的模块,它可以单独作为MCU使用,也可以作为一个简单的WIFI模块。ESP8266可以利用串口与单片机进行通讯。利用ESP8266可以访问一些API,获取

    2024年02月16日
    浏览(46)
  • 【STM32外设系列】双轴按键PS2摇杆

    🎀 文章作者:二土电子 🌸 关注公众号获取更多资料! 🐸 期待大家一起学习交流!   我们首先来看一下双轴按键PS2摇杆长什么样子   该模块有两种输出,X轴和Y轴以模拟信号(电压)的形式输出,Z轴以数字信号(高低电平)的形式输出。其中各个引脚的作用如下 G

    2024年02月22日
    浏览(43)
  • STM32外设系列—MPU6050角度传感器

    🎀 文章作者:二土电子 🌸 关注公众号获取更多资料! 🐸 期待大家一起学习交流!   MPU6050是由InvenSense公司生产的全球首款整合性六轴运动处理模块,它可以实时获取运动物体的在三维坐标系内的偏转角度,如图所示。   其中roll为绕X轴偏转的角度,pitch为绕Y轴偏转

    2024年02月03日
    浏览(56)
  • 【STM32外设系列】GPS定位模块(ATGM336H)

    🎀 文章作者:二土电子 🌸 关注公众号获取更多资料! 🐸 期待大家一起学习交流!   我们在做一些项目时有时会需要进行GPS定位,获取自身的经纬度信息,这里使用的是中科微电子的GPS模块ATGM336H,带陶瓷天线。   该模块可以实现GPS定位,返回定位点的UTC时间和经纬

    2024年02月04日
    浏览(37)
  • 【STM32外设系列】NRF24L01无线收发模块

    🎀 文章作者:二土电子 🌸 关注公众号获取更多资料! 🐸 期待大家一起学习交流!   NRF24L01是NORDIC公司生产的一款工作在2.4GHz的无线收发模块,采用FSK调制,通常由频率发生器、增强型SchockBurstTM模式控制器、功率放大器、晶体放大器、调制器、解调器等组成,可以实现

    2024年03月26日
    浏览(52)
  • STM32外设系列—HC-SR04(超声波)

    🎀 文章作者:二土电子 🌸 关注文末公众号获取其他资料和工程文件! 🐸 期待大家一起学习交流! 超声波测距的原理非常简单,超声波发生器在某一时刻发出一个超声波信号,当这个超声波信号遇到被测物体后会反射回来,被超声波接收器接收到。这样只要计算出从发出

    2024年02月09日
    浏览(46)
  • 【STM32外设系列】JW01三合一空气质量检测模块

    🎀 文章作者:二土电子 🌸 关注公众号获取更多资料! 🐸 期待大家一起学习交流!   首先我们看一下JW01的样子   值得注意的是,本文介绍的是三合一空气质量检测模块,能够检测空气中有机气态物质的浓度,同时也能检测甲醛和二氧化碳的浓度,该模块通过串口输

    2024年02月04日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包