问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

L298N电机驱动芯片使用详解

创作时间:
作者:
@小白创作中心

L298N电机驱动芯片使用详解

引用
CSDN
1.
https://m.blog.csdn.net/2201_75342985/article/details/140197481

L298N是一种常用的双H桥电机驱动芯片,广泛应用于各种电子项目和机器人制作中。本文将详细介绍L298N的功能、引脚定义、工作原理,并提供具体的代码示例,帮助读者快速掌握其使用方法。

一、介绍

L298N 是一种双H桥电机驱动芯片,其中每个H桥可以提供2A的电流,内含4路逻辑驱动电路,功率部分的供电电压范围是2.5-48v,逻辑部分5v供电,接受5vTTL电平。一般情况下,功率部分的电压应大于6V否则芯片可能不能正常工作。一个模块可同时驱动两个直流电机工作,具有反馈检测和过热自断功能。其模块实物图如下所示:

二、引脚说明

引脚名
引脚号
描述
GND
1,10,11,20
接地
Sense A
2
在该引脚和接地之间连接检测电阻器以控制负载的电流。
Sense B
19
N.C.
3;18
无连接
OUT1
4
桥A的输出;连接在这两个引脚之间的负载上流过的电流在引脚1处监测。
OUT2
5
Vs
6
供电电压用于功率输出级。一个无感的10nF电容必须连接在这个引脚和地之间。
Input1
7
桥A的TTL兼容输入。
Input2
9
EnableA
8
TTL兼容使能输入:L状态禁用桥A(使能A)和/或桥B(使能B)。
EnableB
14
VSS
12
模块的供电电压。一个100nF电容必须连接在这个引脚和地之间。
Input3
13
桥B的TTL兼容输入。
Input4
15
OUT3
16
桥B的输出。连接在这两个引脚之间的负载上流过的电流在引脚15处监测。
OUT4
17
  • IN1, IN2, IN3, IN4: 输入控制引脚,控制电机的转动方向。
  • ENA, ENB: 使能引脚,用于启动和停止电机。
  • OUT1, OUT2, OUT3, OUT4: 输出引脚,连接到电机端子。
  • VSS: 逻辑电压供应引脚。
  • VS: 电机电压供应引脚。
  • GND: 地引脚。

三、工作原理

1.供电控制:

只需要在12V供电处接上7-12V电压,供电GND处与单片机共地即可,5V供电处会输出一个5V的电压,可以用于给单片机供电,做小车时最常用的就是这种方式。使用这种方式时,板载5V使能不用管。

2.控制逻辑:

不用PWM调速,就单纯想让电机转动,就给使能脚一个高电平即可,可以通过跳线帽将其与高电平输出脚相连,如果给使能脚低电平的话,电机将无法转动。其转动逻辑如下表:

电机1
电机2
电机1
电机2
IN1
IN2
IN3
IN4
1
0
1
0
0
1
0
1
相同
相同
相同
相同

启动电机1:使能引脚ENA设置为高电平
停止电机1:使能引脚ENA设置为低电平
IN1高电平,IN2低电平:电机1正转
IN1低电平,IN2高电平:电机1反转
电机2同理,不做过多解释。

四、代码示例

1.带PWM示例

接线:

L298N
STM32
OUT1和OUT2
电机1的两个端子
OUT3和OUT4
电机2的两个端子
ENA
PA7
ENB
PA6
IN1和IN2
PA0和PA1
IN3和IN4
PA4和PA5
VSS
5V
GND
GND

l298n.h

#ifndef __L1298N_H
#define __L1298N_H
#include "sys.h"
#define MOTOR_PIN_A GPIO_Pin_7
#define MOTOR_PIN_B GPIO_Pin_6
#define MOTOR_CTRL_A GPIO_Pin_0
#define MOTOR_CTRL_B GPIO_Pin_1
#define MOTOR_CTRL_C GPIO_Pin_4
#define MOTOR_CTRL_D GPIO_Pin_5
#define GPIO_PORT_MOTOR GPIOA
#define SET_PIN_HIGH(PORT, PIN) GPIO_SetBits(PORT, PIN)
#define SET_PIN_LOW(PORT, PIN) GPIO_ResetBits(PORT, PIN)
#define MOTOR_FORWARD()   { PAout(0) = 1; PAout(1) = 0; PAout(4) = 1; PAout(5) = 0; }
#define MOTOR_BACKWARD()  { PAout(0) = 0; PAout(1) = 1; PAout(4) = 0; PAout(5) = 1; }
#define MOTOR_STOP()      { PAout(0) = 0; PAout(1) = 0; PAout(4) = 0; PAout(5) = 0; }
void Forward(void);
void Back(void);
void Stop(void);
void TIM3_PWM_Init(u16 arr,u16 psc);
#endif  

l298n.c

#include "timer.h"
#include "l298n.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_rcc.h"
 
void TIM3_PWM_Init(uint16_t arr, uint16_t psc)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
    // Enable clocks
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    // GPIO Configuration
    GPIO_InitStructure.GPIO_Pin = MOTOR_PIN_A | MOTOR_PIN_B;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIO_PORT_MOTOR, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = MOTOR_CTRL_A | MOTOR_CTRL_B | MOTOR_CTRL_C | MOTOR_CTRL_D; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
    GPIO_Init(GPIO_PORT_MOTOR, &GPIO_InitStructure);
    // Reset motor control pins
    SET_PIN_LOW(GPIO_PORT_MOTOR, MOTOR_CTRL_A);
    SET_PIN_LOW(GPIO_PORT_MOTOR, MOTOR_CTRL_B);
    SET_PIN_LOW(GPIO_PORT_MOTOR, MOTOR_CTRL_C);
    SET_PIN_LOW(GPIO_PORT_MOTOR, MOTOR_CTRL_D);
    // Timer base configuration
    TIM_TimeBaseStructure.TIM_Period = arr; 
    TIM_TimeBaseStructure.TIM_Prescaler = psc; 
    TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    // PWM Mode configuration for Channel 1 and Channel 2
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 
    TIM_OC2Init(TIM3, &TIM_OCInitStructure);  
    TIM_OC1Init(TIM3, &TIM_OCInitStructure);  
    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
    TIM_Cmd(TIM3, ENABLE);  
}
void Forward()
{
    MOTOR_FORWARD();
    TIM_SetCompare2(TIM3, 1);  
    TIM_SetCompare1(TIM3, 1);   
}
void Back()
{
    MOTOR_BACKWARD();
    TIM_SetCompare2(TIM3, 1);   
    TIM_SetCompare1(TIM3, 1);   
}
void Stop(void)
{
    MOTOR_STOP();
}  

main.c

#include "delay.h"
#include "usart.h"
#include "l298n.h"
 
int main(void)
{		
    delay_init();	   
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	
    uart_init(115200);	
     
    TIM3_PWM_Init(999,0);  
       while(1)
    {
         Forward(); 
        delay_ms(3000);
        
        Back(); 
        delay_ms(3000);
    }	   
}

2.无PWM控制

接线:

L298N
STM32
OUT1和OUT2
电机1的两个端子
OUT3和OUT4
电机2的两个端子
ENA
PA6
ENB
PA7
IN1和IN2
PA0和PA1
IN3和IN4
PA2和PA3
VSS
5V
GND
GND

此demo为不带PWM的双电机版本的STM32HAL库示例:

#include "stm32f1xx_hal.h"
// 定义引脚
#define ENA_Pin GPIO_PIN_6
#define ENA_GPIO_Port GPIOA
#define IN1_Pin GPIO_PIN_0
#define IN1_GPIO_Port GPIOA
#define IN2_Pin GPIO_PIN_1
#define IN2_GPIO_Port GPIOA
#define ENB_Pin GPIO_PIN_7
#define ENB_GPIO_Port GPIOA
#define IN3_Pin GPIO_PIN_2
#define IN3_GPIO_Port GPIOA
#define IN4_Pin GPIO_PIN_3
#define IN4_GPIO_Port GPIOA
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void) {
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  while (1) {
    // 启动电机1,设置方向为顺时针
    HAL_GPIO_WritePin(ENA_GPIO_Port, ENA_Pin, GPIO_PIN_SET);
    HAL_GPIO_WritePin(IN1_GPIO_Port, IN1_Pin, GPIO_PIN_SET);
    HAL_GPIO_WritePin(IN2_GPIO_Port, IN2_Pin, GPIO_PIN_RESET);
    HAL_Delay(2000);
    // 停止电机1
    HAL_GPIO_WritePin(ENA_GPIO_Port, ENA_Pin, GPIO_PIN_RESET);
    HAL_Delay(2000);
    // 启动电机2,设置方向为逆时针
    HAL_GPIO_WritePin(ENB_GPIO_Port, ENB_Pin, GPIO_PIN_SET);
    HAL_GPIO_WritePin(IN3_GPIO_Port, IN3_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(IN4_GPIO_Port, IN4_Pin, GPIO_PIN_SET);
    HAL_Delay(2000);
    // 停止电机2
    HAL_GPIO_WritePin(ENB_GPIO_Port, ENB_Pin, GPIO_PIN_RESET);
    HAL_Delay(2000);
  }
}
// 时钟配置
void SystemClock_Config(void) {
  // ... (根据具体需求配置时钟)
}
// GPIO初始化
static void MX_GPIO_Init(void) {
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  __HAL_RCC_GPIOA_CLK_ENABLE();
  GPIO_InitStruct.Pin = IN1_Pin | IN2_Pin | IN3_Pin | IN4_Pin | ENA_Pin | ENB_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
// 错误处理
void Error_Handler(void) {
  // ... (错误处理代码)
}
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号