目录
一、模块概述
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 实际应用注意事项
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)是否正确
- 测量电机两端是否有电压
2. 电机只能单向转动
- 检查方向控制信号是否正常切换
- 检查H桥是否有一侧损坏
3. PWM调速不灵敏
- 确认PWM频率是否合适(建议1kHz-20kHz)
- 检查PWM占空比是否从0-100%变化
- 确认使能引脚是否连接正确
4. 电机转动时有噪声
- 尝试调整PWM频率
- 检查电源是否稳定
- 添加滤波电容
5. L298N发热严重
- 检查电机电流是否超过额定值
- 添加散热片
- 确保电机电源电压不过高
七、总结
本文详细介绍了使用STM32F103C8T6最小系统板通过标准库控制L298N电机驱动模块的完整方案。从硬件连接到软件实现,从基本功能到优化方向,提供了全面的指导。通过本方案,开发者可以快速实现直流电机的控制,为机器人、智能小车等项目的开发奠定基础。
实际应用中,建议根据具体需求进行功能扩展,如添加编码器反馈实现闭环控制、增加电流检测保护电路等。同时,对于大功率电机应用,应考虑使用更高性能的驱动芯片或模块,如TB6612、DRV8833等。
通过本项目的实践,不仅可以掌握STM32的GPIO和定时器PWM输出配置,还能深入理解H桥电机驱动原理,为更复杂的运动控制系统开发积累宝贵经验。