目录
[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芯片免受电压尖峰的损害。
工作原理:
- 控制信号输入:微控制器通过IN1 - IN4引脚发送控制信号,经过光耦隔离后输入到L298N芯片。
- 使能控制:通过PWMA和PWMB引脚控制H桥的使能状态,实现电机的启动和停止。
- 电机驱动:L298N芯片根据输入的控制信号和使能状态,通过OUT1 - OUT4引脚输出相应的电压和电流,驱动电机按照预定的方向和速度运行。
- 保护机制:续流二极管保护芯片免受电机反向电动势的影响,确保电路的稳定性和可靠性。
2.6 实际应用注意事项
-
电机电源与控制电源应分开供电
-
大功率电机使用时需加散热片
-
电机两端应并联续流二极管(多数L298N模块已内置)
-
长距离连接时注意信号干扰问题
-
确保良好接地以减少噪声
三、硬件设计
3.1 硬件组成
所需硬件组件:
-
STM32F103C8T6最小系统板
-
L298N电机驱动模块
-
直流电机(12V)两个
-
12V电源(用于电机供电)
-
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 开发环境配置
-
安装Keil MDK-ARM开发环境
-
安装STM32标准外设库
-
创建新工程,选择STM32F103C8T6器件
-
配置系统时钟为72MHz
-
启用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 基本功能实现
-
电机正反转控制
-
PWM调速功能
-
电机启停控制
5.2 功能优化
-
速度平滑控制:实现加速度控制,避免电机突然启动/停止
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);
}
} -
PID速度控制:通过编码器反馈实现闭环控制
-
电流检测:通过ADC检测电机电流,实现过流保护
-
故障检测:监测L298N的故障输出引脚
六、常见问题解决
- 电机不转
-
检查电源连接是否正确
-
确认使能信号(ENA/ENB)是否为高电平或PWM信号
-
检查方向控制信号(IN1-IN4)是否正确
-
测量电机两端是否有电压
- 电机只能单向转动
-
检查方向控制信号是否正常切换
-
检查H桥是否有一侧损坏
- PWM调速不灵敏
-
确认PWM频率是否合适(建议1kHz-20kHz)
-
检查PWM占空比是否从0-100%变化
-
确认使能引脚是否连接正确
- 电机转动时有噪声
-
尝试调整PWM频率
-
检查电源是否稳定
-
添加滤波电容
- L298N发热严重
-
检查电机电流是否超过额定值
-
添加散热片
-
确保电机电源电压不过高
七、总结
本文详细介绍了使用STM32F103C8T6最小系统板通过标准库控制L298N电机驱动模块的完整方案。从硬件连接到软件实现,从基本功能到优化方向,提供了全面的指导。通过本方案,开发者可以快速实现直流电机的控制,为机器人、智能小车等项目的开发奠定基础。
实际应用中,建议根据具体需求进行功能扩展,如添加编码器反馈实现闭环控制、增加电流检测保护电路等。同时,对于大功率电机应用,应考虑使用更高性能的驱动芯片或模块,如TB6612、DRV8833等。
通过本项目的实践,不仅可以掌握STM32的GPIO和定时器PWM输出配置,还能深入理解H桥电机驱动原理,为更复杂的运动控制系统开发积累宝贵经验。