STM32之L298N电机驱动模块

目录

一、模块概述

二、模块简介

[2.1 模块特点](#2.1 模块特点)

[2.1.1 核心性能特点](#2.1.1 核心性能特点)

[2.1.2 功能特点](#2.1.2 功能特点)

[2.2 结构与工作原理](#2.2 结构与工作原理)

[2.3 电气特性](#2.3 电气特性)

[2.4 模块接口说明](#2.4 模块接口说明)

[2.5 原理图设计](#2.5 原理图设计)

[2.6 实际应用注意事项](#2.6 实际应用注意事项)

三、硬件设计

[3.1 硬件组成](#3.1 硬件组成)

[3.2 硬件连接](#3.2 硬件连接)

四、软件设计

[4.1 开发环境配置](#4.1 开发环境配置)

[4.2 关键代码实现](#4.2 关键代码实现)

[4.2.1 GPIO初始化](#4.2.1 GPIO初始化)

[4.2.2 PWM初始化](#4.2.2 PWM初始化)

[4.2.3 电机速度和反向控制](#4.2.3 电机速度和反向控制)

[4.2.4 主程序流程](#4.2.4 主程序流程)

五、功能实现与优化

[5.1 基本功能实现](#5.1 基本功能实现)

[5.2 功能优化](#5.2 功能优化)

六、常见问题解决

七、总结


一、模块概述

L298N是一种双H桥电机驱动模块,能够驱动两个直流电机或一个步进电机,广泛应用于机器人、智能小车等嵌入式控制项目中。本文详细介绍如何使用STM32F103C8T6最小系统板通过标准库来控制L298N电机驱动模块,实现电机的正转、反转、调速等基本功能。

二、模块简介

模块实物图:

2.1 模块特点

L298N电机驱动模块是经典的直流电机/步进电机驱动解决方案,其特点包括以下方面:

2.1.1 核心性能特点

双H桥设计:

  • 可同时驱动 2个直流电机1个两相四线步进电机

  • 每个H桥提供 2A持续电流(峰值3A),满足中小功率电机需求

  • 内置 续流二极管,防止电机反电动势损坏电路

宽电压支持:

  • 驱动电压范围:+5V~+35V(建议6V-12V常用)

  • 逻辑电压范围:+5V~+7V(兼容3.3V/5V单片机直接控制)

功率特性:

  • 最大功耗:25W(需配合散热片使用)

  • 低静态电流:<36mA(待机时功耗低)

2.1.2 功能特点

灵活的控制方式:

  • 支持 PWM调速(通过ENA/ENB引脚)

  • 支持 方向控制(IN1/IN2和IN3/IN4组合)

保护机制:

  • 过热自动关断(芯片温度>150℃时触发)

  • 逻辑电源与驱动电源隔离(避免电机干扰控制电路)

扩展功能:

  • 提供5V输出接口(可为外部电路供电,最大500mA)

  • 可通过并联H桥提高电流驱动能力(需同步控制信号)

2.2 结构与工作原理

L298N内部包含两个H桥电路,每个H桥可控制一个电机的方向。通过控制输入端的逻辑电平组合,可以实现电机的正转、反转和制动:

IN1 IN2 电机状态
0 0 停止/制动
0 1 反转
1 0 正转
1 1 停止/制动

①非PWM调速

不用PWM调速,就单纯想让电机转动,就给使能脚一个高电平即可(通道使能引脚是5V使能下面那个引脚,上面的引脚就是固定的高电平引脚),可以通过跳线帽将其与高电平输出脚相连,如果给使能脚低电平的话,电机将无法转动。

②PWM调速

如果用PWM调速,那就把跳线帽拔掉,将通道使能脚接入单片机的PWM波输出脚,电机的转速与电机两端PWM信号的占空比成正比,占空比越大,电机转速越快。 ENA控制输出A,ENB控制输出B。

2.3 电气特性

  • 输入电压范围:5V-35V(电机驱动电源)

  • 逻辑电压:5V(可与STM32F103C8T6的3.3V逻辑电平兼容)

  • 每个通道持续输出电流:2A

  • 峰值输出电流:3A

  • 逻辑部分工作电流:≤36mA

2.4 模块接口说明

L298N模块通常具有以下接口:

  • 12V/5V电源输入接口

  • 电机1输出接口(OUT1, OUT2)

  • 电机2输出接口(OUT3, OUT4)

  • 控制信号输入(ENA, IN1, IN2, ENB, IN3, IN4)

  • 5V输出接口(可为外部电路供电)

2.5 原理图设计

电源部分:

  • Power 5V:为逻辑电路提供5V电源,通常由外部电源或单片机系统提供。
  • Power 12V:为电机驱动提供12V电源,根据所驱动电机的电压需求选择合适的电源。
  • 电容(C1, C2, C3, C4):用于电源滤波,减少电源噪声对电路的影响。C1和C3是100μF的电解电容,用于滤除低频噪声;C2和C4是0.1μF的陶瓷电容,用于滤除高频噪声。

逻辑输入部分:

  • IN1 - IN4:逻辑输入引脚,用于接收来自微控制器(如单片机)的控制信号。通过控制这些引脚的电平状态,可以控制电机的转向和速度。
  • TLP521系列光耦:用于电气隔离,防止电机驱动电路的高电压和大电流对微控制器造成干扰。光耦将微控制器的低电平控制信号转换为适合L298N芯片的信号。
  • LED指示灯(LED1 - LED4):用于显示逻辑输入的状态,当对应的输入引脚为高电平时,LED点亮。

L298N芯片:

U1(L298N):核心驱动芯片,内部包含两个H桥电路,可以独立驱动两个直流电机或一个步进电机。

  • IN1 - IN4:逻辑输入引脚,与外部控制信号连接。
  • ENA, ENB:使能引脚,用于控制对应H桥的使能状态。当使能引脚为高电平时,H桥工作;为低电平时,H桥不工作。图中PWMA和PWMB可以用于PWM调速。
  • OUT1 - OUT4:输出引脚,连接到电机的两端,用于驱动电机。
  • VSS:逻辑电源引脚,接5V电源。
  • VS:电机驱动电源引脚,接12V电源。
  • ISEN A, ISEN B:电流检测引脚,可用于监测电机的电流,实现过流保护等功能。

电机输出部分:

  • M1, M2:电机连接端口,分别连接到两个电机的两端。通过控制L298N的输出引脚,可以实现电机的正转、反转和调速。
  • 二极管(D1 - D8):1N4007二极管,用于续流保护。当电机突然停止或改变方向时,电机会产生反向电动势,这些二极管为反向电动势提供泄放回路,保护L298N芯片免受电压尖峰的损害。

工作原理:

  1. 控制信号输入:微控制器通过IN1 - IN4引脚发送控制信号,经过光耦隔离后输入到L298N芯片。
  2. 使能控制:通过PWMA和PWMB引脚控制H桥的使能状态,实现电机的启动和停止。
  3. 电机驱动:L298N芯片根据输入的控制信号和使能状态,通过OUT1 - OUT4引脚输出相应的电压和电流,驱动电机按照预定的方向和速度运行。
  4. 保护机制:续流二极管保护芯片免受电机反向电动势的影响,确保电路的稳定性和可靠性。

2.6 实际应用注意事项

  1. 电机电源与控制电源应分开供电

  2. 大功率电机使用时需加散热片

  3. 电机两端应并联续流二极管(多数L298N模块已内置)

  4. 长距离连接时注意信号干扰问题

  5. 确保良好接地以减少噪声

三、硬件设计

3.1 硬件组成

所需硬件组件:

  1. STM32F103C8T6最小系统板

  2. L298N电机驱动模块

  3. 直流电机(12V)两个

  4. 12V电源(用于电机供电)

  5. 5V电源(或使用L298N模块的5V输出)

3.2 硬件连接

STM32F103C8T6与L298N连接方式:

STM32引脚 L298N引脚 说明
PA0 ENA 电机A使能(PWM调速)
PA1 IN1 电机A方向控制1
PA2 IN2 电机A方向控制2
PA3 ENB 电机B使能(PWM调速)
PA4 IN3 电机B方向控制1
PA5 IN4 电机B方向控制2
GND GND 共地

电机连接:

  • 电机A连接到OUT1和OUT2

  • 电机B连接到OUT3和OUT4

电源连接:

  • 12V电源正极接L298N的12V输入

  • 12V电源负极接L298N的GND

四、软件设计

4.1 开发环境配置

  1. 安装Keil MDK-ARM开发环境

  2. 安装STM32标准外设库

  3. 创建新工程,选择STM32F103C8T6器件

  4. 配置系统时钟为72MHz

  5. 启用GPIO和TIM2外设

4.2 关键代码实现

4.2.1 GPIO初始化

复制代码
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"

// 引脚定义
#define MOTOR_A_ENA_PIN GPIO_Pin_0
#define MOTOR_A_IN1_PIN GPIO_Pin_1
#define MOTOR_A_IN2_PIN GPIO_Pin_2
#define MOTOR_B_ENB_PIN GPIO_Pin_3
#define MOTOR_B_IN3_PIN GPIO_Pin_4
#define MOTOR_B_IN4_PIN GPIO_Pin_5
#define MOTOR_GPIO_PORT GPIOA

// 初始化GPIO
void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    // 配置方向控制引脚为推挽输出
    GPIO_InitStructure.GPIO_Pin = MOTOR_A_IN1_PIN | MOTOR_A_IN2_PIN | 
                                 MOTOR_B_IN3_PIN | MOTOR_B_IN4_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(MOTOR_GPIO_PORT, &GPIO_InitStructure);
    
    // 配置使能引脚为复用推挽输出(PWM)
    GPIO_InitStructure.GPIO_Pin = MOTOR_A_ENA_PIN | MOTOR_B_ENB_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(MOTOR_GPIO_PORT, &GPIO_InitStructure);
}
  • 宏定义L298N模块与STM32连接的引脚,方便后续修改和维护。
  • 方向控制引脚(IN1-IN4)配置为普通推挽输出,直接控制电机转向。
  • 使能引脚(ENA/ENB)配置为复用推挽输出,用于连接定时器的PWM信号。
  • 必须使能GPIOA的时钟(RCC_APB2PeriphClockCmd)。

4.2.2 PWM初始化

复制代码
// 初始化定时器用于PWM输出
void TIM_Configuration(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
    
    // 定时器2时钟使能
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    
    // 定时器基础配置
    TIM_TimeBaseStructure.TIM_Period = 999; // PWM频率=72MHz/(999+1)=72kHz
    TIM_TimeBaseStructure.TIM_Prescaler = 0;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    
    // PWM模式配置
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 0; // 初始占空比为0
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    
    // 通道1配置(PA0-ENA)
    TIM_OC1Init(TIM2, &TIM_OCInitStructure);
    TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
    
    // 通道2配置(PA3-ENB)
    TIM_OC4Init(TIM2, &TIM_OCInitStructure);
    TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
    
    // 使能定时器
    TIM_Cmd(TIM2, ENABLE);
    TIM_CtrlPWMOutputs(TIM2, ENABLE);
}

关键参数

  • PWM频率72MHz / (999 + 1) = 72kHz(适合电机驱动,避免可闻噪声)。

  • 占空比 :通过TIM_SetCompareX()设置,范围0-999(对应0%-100%)。

通道选择

  • TIM2_CH1(PA0)控制电机A的ENA。

  • TIM2_CH4(PA3)控制电机B的ENB。

4.2.3 电机速度和反向控制

复制代码
// 设置电机A速度和方向
void MotorA_Set(int speed, uint8_t direction)
{
    // 限制速度范围
    if(speed > 999) speed = 999;
    if(speed < 0) speed = 0;
    
    // 设置方向
    if(direction == 1) { // 正转
        GPIO_SetBits(MOTOR_GPIO_PORT, MOTOR_A_IN1_PIN);
        GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_A_IN2_PIN);
    } else if(direction == 2) { // 反转
        GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_A_IN1_PIN);
        GPIO_SetBits(MOTOR_GPIO_PORT, MOTOR_A_IN2_PIN);
    } else { // 停止
        GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_A_IN1_PIN);
        GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_A_IN2_PIN);
    }
    
    // 设置PWM占空比
    TIM_SetCompare1(TIM2, speed);
}

// 设置电机B速度和方向
void MotorB_Set(int speed, uint8_t direction)
{
    // 限制速度范围
    if(speed > 999) speed = 999;
    if(speed < 0) speed = 0;
    
    // 设置方向
    if(direction == 1) { // 正转
        GPIO_SetBits(MOTOR_GPIO_PORT, MOTOR_B_IN3_PIN);
        GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_B_IN4_PIN);
    } else if(direction == 2) { // 反转
        GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_B_IN3_PIN);
        GPIO_SetBits(MOTOR_GPIO_PORT, MOTOR_B_IN4_PIN);
    } else { // 停止
        GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_B_IN3_PIN);
        GPIO_ResetBits(MOTOR_GPIO_PORT, MOTOR_B_IN4_PIN);
    }
    
    // 设置PWM占空比
    TIM_SetCompare4(TIM2, speed);
}

参数说明

  • **speed:**PWM占空比(0-999)。

  • **direction:**1=正转,2=反转,其他值=停止。

4.2.4 主程序流程

复制代码
int main(void)
{
    // 初始化硬件
    GPIO_Configuration();
    TIM_Configuration();
    
    while(1)
    {
        // 电机A正转,速度50%
        MotorA_Set(500, 1);
        // 电机B反转,速度30%
        MotorB_Set(300, 2);
        Delay_ms(2000);
        
        // 电机A停止
        MotorA_Set(0, 0);
        // 电机B停止
        MotorB_Set(0, 0);
        Delay_ms(1000);
        
        // 电机A反转,速度70%
        MotorA_Set(700, 2);
        // 电机B正转,速度100%
        MotorB_Set(999, 1);
        Delay_ms(2000);
    }
}
  • 功能:循环演示电机正转、反转、停止和调速。

五、功能实现与优化

5.1 基本功能实现

  1. 电机正反转控制

  2. PWM调速功能

  3. 电机启停控制

5.2 功能优化

  1. 速度平滑控制:实现加速度控制,避免电机突然启动/停止

    void Motor_Smooth_Set(int target_speed, int current_speed, uint8_t motor, uint8_t direction)
    {
    int step = (target_speed > current_speed) ? 10 : -10;
    while(current_speed != target_speed) {
    current_speed += step;
    if(motor == 1) {
    MotorA_Set(current_speed, direction);
    } else {
    MotorB_Set(current_speed, direction);
    }
    Delay_ms(10);
    }
    }

  2. PID速度控制:通过编码器反馈实现闭环控制

  3. 电流检测:通过ADC检测电机电流,实现过流保护

  4. 故障检测:监测L298N的故障输出引脚

六、常见问题解决

  1. 电机不转
  • 检查电源连接是否正确

  • 确认使能信号(ENA/ENB)是否为高电平或PWM信号

  • 检查方向控制信号(IN1-IN4)是否正确

  • 测量电机两端是否有电压

  1. 电机只能单向转动
  • 检查方向控制信号是否正常切换

  • 检查H桥是否有一侧损坏

  1. PWM调速不灵敏
  • 确认PWM频率是否合适(建议1kHz-20kHz)

  • 检查PWM占空比是否从0-100%变化

  • 确认使能引脚是否连接正确

  1. 电机转动时有噪声
  • 尝试调整PWM频率

  • 检查电源是否稳定

  • 添加滤波电容

  1. L298N发热严重
  • 检查电机电流是否超过额定值

  • 添加散热片

  • 确保电机电源电压不过高

七、总结

本文详细介绍了使用STM32F103C8T6最小系统板通过标准库控制L298N电机驱动模块的完整方案。从硬件连接到软件实现,从基本功能到优化方向,提供了全面的指导。通过本方案,开发者可以快速实现直流电机的控制,为机器人、智能小车等项目的开发奠定基础。

实际应用中,建议根据具体需求进行功能扩展,如添加编码器反馈实现闭环控制、增加电流检测保护电路等。同时,对于大功率电机应用,应考虑使用更高性能的驱动芯片或模块,如TB6612、DRV8833等。

通过本项目的实践,不仅可以掌握STM32的GPIO和定时器PWM输出配置,还能深入理解H桥电机驱动原理,为更复杂的运动控制系统开发积累宝贵经验。

相关推荐
网易独家音乐人Mike Zhou1 分钟前
【Linux应用】在PC的Linux环境下通过chroot运行ARM虚拟机镜像img文件(需要依赖qemu-aarch64、不需要重新安装iso)
linux·c语言·stm32·mcu·物联网·嵌入式·iot
GC_June073 分钟前
STM32 + 移远EC800 4G通信模块数传
arm开发·stm32·嵌入式硬件
通信射频老兵35 分钟前
如何优化transceiver芯片的供电
经验分享·单片机·嵌入式硬件·5g·信号处理·射频工程
酷飞飞1 小时前
模电基础-电阻和功率
单片机·嵌入式硬件
CC呢8 小时前
基于单片机宠物喂食器/智能宠物窝/智能饲养
单片机·嵌入式硬件·物联网·宠物喂食
DIY机器人工房8 小时前
关于在VScode中使用git的一些步骤常用命令及其常见问题:
大数据·stm32·单片机·嵌入式硬件·elasticsearch·搜索引擎·diy机器人工房
muub8 小时前
【黄山派-SF32LB52】—硬件原理图学习笔记
单片机·嵌入式硬件·原理图·黄山派·sf32·思澈科技·立创开发板
czhaii8 小时前
开天斧3移植AI8H系列 高级PWM输出(频率可调,脉冲计数)软件方式 C语言
单片机·嵌入式硬件
QL.ql13 小时前
HAL库的串口
单片机·嵌入式硬件