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

L298N电机驱动模块的使用与驱动代码

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

L298N电机驱动模块的使用与驱动代码

引用
CSDN
1.
https://blog.csdn.net/m0_75090944/article/details/140700285

L298N电机驱动模块是ST公司生产的一种高电压、大电流双全桥式电机驱动芯片,广泛应用于各种电机驱动场景。本文将详细介绍L298N电机驱动模块的使用方法和驱动代码实现,帮助读者快速掌握这一实用技术。

模块介绍

L298N芯片是ST公司生产的一种高电压、大电流双全桥式的电机驱动芯片。该芯片采用15脚封装,具有驱动能力强,发热量低,抗干扰能力强的特点。

特点

  • 工作电压高,最高工作电压可达46V
  • 输出电流大,瞬间峰值电流可达3A,持续工作电流为2A
  • 低静态电压
  • 过热保护
  • 逻辑0电平高至1.5V(高抗扰度)
  • 在L298N芯片基础上,本模块使用大容量滤波电容,续流保护二极管,可以提高可靠性。

硬件特性

  • 驱动部分端子供电范围 Vs:+5V+35V;如需要板内取电,则供电范围+7V+35V
  • 驱动部分峰值电流 Io:2A(MAX单桥)
  • 逻辑部分端子供电范围 Vss: +5V~+7V(可板内取电+5V)
  • 逻辑部分工作电流范围: 0~36mA
  • 控制信号输入电压范围 低电平:-0.3V≤Vin≤1.5V 高电平:2.3V≤Vin≤Vss
  • 使能信号输入电压范围 低电平:-0.3≤Vin≤1.5V(控制信号无效) 高电平:2.3V≤Vin≤Vss(控制信号有效)
  • 最大功耗 25W(温度T=75℃时)
  • 存储温度 -25℃~+130℃
  • 驱动板尺寸 434327mm
  • 驱动板重量 30g

参数最大值

更多内容见参考手册(移至本博客最后)

引脚接线

共14个接线端

  • A相:通道A输出io1,io2,A相使能,输入1,2
  • B相:通道B输出io1,io2,B相使能,输入3,4
  • 电源:主电源正极,负极,5V输入,内置5V降压器开关

以A相为例来学习接线

输出端口

通道A输出io1,io2接入电机的端口

控制信号

ENA:使能端-高电平使能,接入电源并且ENA接高电平,电机驱动模块才输出电流给电机

如果只是控制电机正反转,那么ENA跳线帽不要断。接入IN1,IN2就可控制转向,具体见下方表格

Motor1 状态

ENA
IN1
IN2
1
1
0
1
0
1
1
1
1
1
0
0
0
X
X

注:Motor2对应ENB,IN3,IN4

如果还要控制转速,有两种接线方式

  1. ENA跳线帽断开,不要接模块的VCC,将其接入单片机IO口
  2. ENA跳线帽不要断,接入IN1,IN2,给IN1或者IN2其中一个端口输入PWM即可

供电说明

接线图最大值表格知道:主电源正极缩写为Vs

5V供电

Vs=5V :单片机引出的5V供电,断开内置5V降压器开关的跳线帽,驱动模块的主电源和5V输入端都接单片机的5V,GND接单片机的GND(这样可以动,但轮子转动的速度不快)

建议使用常规应用的电压范围

常规应用

7V< Vs <12V:(板子背面标识为12V输入,实际可以接受的输入范围是7-12V),插上内置5V降压器开关的跳线帽,使用板载的78M05供给芯片的逻辑电源,可以不用再外接逻辑电源,但是可以引出5V电压供外部使用。

高压驱动的非常规应用

12V< Vs <=24V:(芯片手册中提出可以支持到35V,但是按照经验一般L298保守应用MAX电压支持到24V已经很了不起),比如要驱动额定电压为18V的电机。首先必须拔掉5V降压器开关的跳线帽,不使用板载的78M05供给芯片的逻辑电源,然后在5V输出端口外部接入5V电压对L298N内部逻辑电路供电。

注意事项

L298N供电的5V如果是用另外电源供电的话,(即不是和单片机的电源共用),那么需要将单片机的GND和模块上的GND连接在一起,只有这样单片机上过来的逻辑信号才有个参考0点。板载5V稳压芯片的输入引脚和电机供电驱动接线端子导通的

驱动代码

PWM.h

#ifndef 	__PWM_H_
#define 	__PWM_H_

void PWM_Init(void);
void PWM_SetCompare3(uint16_t Compare3);

#endif

PWM.c

#include "stm32f10x.h"                  // Device header
#include "PWM.h"

void PWM_Init(void)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;  	//PWM
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    TIM_InternalClockConfig(TIM2);
    
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;		//ARR
    TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1;		//PSC
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
    
    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_OC3Init(TIM2, &TIM_OCInitStructure);
    
    TIM_Cmd(TIM2, ENABLE);
}

void PWM_SetCompare3(uint16_t Compare3)
{
    TIM_SetCompare3(TIM2, Compare3);
}

L298N.h

#ifndef __MOTOR_H
#define __MOTOR_H

void L298N_Motor_Init(void);
void L298NMotor_SetSpeed(int8_t Speed);

#endif

L298N.c

#include "stm32f10x.h"                  // Device header
#include "PWM.h"
#include "L298N.h"

void L298N_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_4 | GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    PWM_Init();
}

void L298NMotor_SetSpeed(int8_t Speed)
{
    if (Speed >= 0)
    {
        GPIO_SetBits(GPIOA, GPIO_Pin_4);
        GPIO_ResetBits(GPIOA, GPIO_Pin_5);
        PWM_SetCompare3(Speed);
    }
    else
    {
        GPIO_ResetBits(GPIOA, GPIO_Pin_4);
        GPIO_SetBits(GPIOA, GPIO_Pin_5);
        PWM_SetCompare3(-Speed);
    }
}

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Key.h"
#include "L298N.h"

uint8_t KeyNum;
int8_t Compare=0;

int main(void)
{
    OLED_Init();
    Key_Init();
    L298N_Motor_Init();
    OLED_ShowString(1,1,"Motor:+000");
    while (1)
    {
        KeyNum=Key_GetNum();
        if(KeyNum==1)
        {
            Compare+=30;
            if(Compare>60)
            {
                Compare=-60;
            }
            OLED_ShowSignedNum(1,7,Compare,3);
            L298NMotor_SetSpeed(Compare);
        }
        
    }
}

参考手册:

  • DATASHEET SEARCH SITE | WWW.ALLDATASHEET.COM (szlcsc.com)
  • L298中文数据手册.pdf-原创力文档 (book118.com)
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号
L298N电机驱动模块的使用与驱动代码