很多小伙伴刚开始接触智能车时会使用到L298N这个驱动模块,本期出一个L298N的使用教程

一·L298N介绍

1.技术参数

基于数据手册可知

最高工作温度:150°C,在我们自个买芯片来焊接时,尽量长时间停留加温,避免损坏芯片,但建议是可以先焊排母,在把芯片的引脚插入排母中

输出电压范围:4.5V~7V,可知我们在选电机时要参考电机的参数,例如我们常见的普通电机TT直流减速电机,输入电压范围是3~6V,则适合用该芯片作为驱动,而又例如我们常见的520编码电机额定电压是12V,则不适合用该电机驱动模块驱动 

输出电流:2A,2A电流是比较大的电流,连接电机的时候,或者在自个画PCB的时候给线加粗

负载电压:4.8~46V,可见L298N芯片是不容易烧的,但是我们接入电压时还是建议接入12V,虽然有5V端口接入,但是5V电压可能不稳定,若低于负载电压范围,可能会影响输出电压变低,导致转速变慢

2.引脚介绍

我将从原理图和实物图讲解

L298N原理图

 

实物图

 L298N电机驱动模块主要是为L298N芯片来控制,我们由数据手册我们可知L298N芯片有15个引脚,他们的功能分别是:

Sense A ,Sense A :主要是用于连接电流检测电阻,以实现对电机电流的监测和控制,在原理图中接地,实物图中没有引脚引出,一般不使用

Out 1; Out 2:是控制电机1的引脚,通过这两个端口连接电机两端,实现对电机1的控制,在原理图中与端子U2相连,有引脚引出,此处直接接电机两端

Vs:12V电压输入端,在原理图中与端子P1相连,有引脚引出,直接接入12V电压供电

Input 1; Input 2:既NI1和NI2,属于信号端口,在原理图中与H3排针相连,有引脚引出,直接接信号线,用于控制电机1的正反转,下文说如何控制

Enable A; Enable B:使能端口,这不是给芯片使能,是给电机使能,有A和B是指分别对电机1和电机2使能,原理图中与H1,H2相连接,有引脚引出,需要接线,下文说如何使用

GND:接地,有引脚引出,输入电压接入时,不要忘记正负极,防止接反,GND在实物中P1端子的中间接口,具体标识还得看板子上的标志位置

VSS:接5V电压输入,可见L298N可以5V输入也可以12V输入,该端口也有引脚引出,这个端口如果使用12V电压输入则该端口不用接线了

Input 3; Input 4:与Input 1; Input 2用法一样,为信号端口,用于控制电机2

Out 3; Out 4:与Out 1; Out 2用法一样,用于控制电机2

其他:

散热片: 用于给芯片散热

减压芯片:L298N还配有一款降压芯片,用于将12V电压降到5V给芯片和5V使能

LED指示灯:用于指示芯片是否是否使能,如果灯亮,则代表输入电压正常,减压正常

二·使用方式

我们了解了各个引脚的作用,现在进入期待已久的正题了,如何使用它(以控制三轮智能车为例,差速转向)

连线:

按照以上理解,

电机1电机2:首先我们分别连接电机1,电机2,两端都连接线,

ENA,ENB:ENA,ENB怎么连线呢?如果我们像实现差速转向,则这两个端口连接到面包板输出PWM波形端口上,输出的PWM波形用于控制电机的转速,给该端口分配不同的占空比,则OUT输出端口输出不同电压给电机,从而达到控制电机转速的目的

5V使能:那5V使能怎么使用?如果你不想控制电机速度,可以使用盖帽直接将5V使能端口和EA,EB连接,则两个电机就会以5V电压全速前进,但是不能控制速度了,当然如果你是控制速度的,这两个5V使能端口则不用接线

信号端口:分别是NI1~NI4,分别接到到面包板上,任意IO口用于控制高低电平即可,想知道如何使用,得先搞懂下面这张图

信号端口使用图解

可见,如果我想控制电机1停止,我们就输出PWM波的占空比为0,就是ENA使能为0V电压,这样NI1,NI2无论是高低电平,都不能使电机1转动起来,如果我们使能ENA,也就是图中ENA置1,电机1的转动方向就看NI1和NI2了,如果NI1和NI2都置低电平也就是0,则电机1制动,如果NI1置低电平,NI2置高电平,则电机1正传,如果NI1置高电平,NI2置低电平,则电机1反转,如果都置高电平,则制动,这是控制电机1的,控制电机2也是如此,所以我们就实现控制电机转速和方向啦

三·代码实现

输出PWM波(江科大教程程序)

#include "stm32f10x.h"                  // Device header

void PWM_Init(void)						//PWM初始化,输出比较模式
{

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	
	GPIO_InitTypeDef  GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin= GPIO_Pin_6|GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	
	TIM_InternalClockConfig(TIM4);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaselnitStructure;
	TIM_TimeBaselnitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaselnitStructure.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaselnitStructure.TIM_Period=100-1;		//ARR
	TIM_TimeBaselnitStructure.TIM_Prescaler=36-1;		//PSC
	TIM_TimeBaselnitStructure.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM4,&TIM_TimeBaselnitStructure);
	
	
	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse=0;				//CCR
	
	TIM_OC1Init(TIM4,&TIM_OCInitStructure);
	TIM_OC2Init(TIM4,&TIM_OCInitStructure);
	
	TIM_Cmd(TIM4,ENABLE);

}

void PWM_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM4,Compare);
}
void PWM_SetCompare2(uint16_t Compare1)
{
	TIM_SetCompare2(TIM4,Compare1);
}

电机控制

void Motor_Init(void)					//电机初始化
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef  GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//信号端口初始化
	GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	PWM_Init();
}

主函数

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Motor.h"
#include "Key.h"
#include "PWM.h"
int main(void)
{	
	Motor_Init();
	PWM_Init();
	while(1)
	{	
	PWM_SetCompare1(30);
	PWM_SetCompare2(30);
	IN1=1; IN2=0;
	IN3=1; IN4=0;
	}
	

}

程序是基于STM32F103C8T6芯片控制,部分代码来着江科大教程,程序较为繁琐,只给大致框架,想获取完整的程序,或有什么问题请私信我。

好,这期分享就到这里了,欢迎大家评论留言,Up主学识水平有限,错误和不妥之处,敬请读者给予批评指正。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐