STM32 智能小车项目 L298N 电机驱动模块
今天开始着手做智能小车的项目了
在智能小车或机器人项目中,我们经常会听到一个词叫 “H 桥电机驱动”,尤其是常见的 L298N 模块,就是基于“双 H 桥”原理设计的。那么,“H 桥”到底是什么?为什么要用“双 H 桥”来驱动电机?。今天,我们就来深入讲解一种应用极为广泛的电机驱动模块——L298N,了解它的工作原理、引脚功能、接线方式及实际应用。
一、什么是 L298N?
L298N 是一款 双 H 桥电机驱动芯片,内部集成了两个全桥驱动器,能同时控制两个直流电机或一个步进电机。由于其稳定性好、价格低、接线方便,成为 Arduino、STM32、51 单片机等平台中最常见的电机驱动解决方案之一。
二.模块引脚与结构详解
L298N 模块通常包括如下接口:
1. 电源接口
引脚 | 功能描述 |
---|---|
VCC | 给电机供电(5~35V) |
GND | 地线(逻辑地与电源地共用) |
5V | 给控制逻辑供电,或供外部单片机使用(视跳帽而定) |
注意:VCC 是电机电源输入,不是控制电压!
2. 控制引脚
引脚 | 功能 |
---|---|
IN1/IN2 | 控制电机 A 正反转 |
IN3/IN4 | 控制电机 B 正反转 |
ENA | 使能电机 A,同时用于 PWM 调速 |
ENB | 使能电机 B,同时用于 PWM 调速 |
3. 输出接口
引脚 | 功能说明 |
---|---|
OUT1/OUT2 | 电机 A 输出 |
OUT3/OUT4 | 电机 B 输出 |
三, H 桥原理简要回顾
H 桥是一种电路结构,用于改变电流方向以实现直流电机的正转、反转、刹车、停止等控制。
一个 H 桥控制一个电机的两个方向,两组 H 桥可控制两个电机,因此称为“双 H 桥”。
IN1 | IN2 | 电机状态 |
---|---|---|
高 | 低 | 正转 |
低 | 高 | 反转 |
高 | 高 | 刹车 |
低 | 低 | 停止(断电) |
ENA 和 ENB 输入 PWM 信号可以调节电机转速。
四,接线实例:L298N + STM32F103
一、硬件连接说明(以 STM32F103 为例)
L298N 引脚 | 功能 | STM32 引脚 | 说明 |
---|---|---|---|
IN1 | 电机A控制 | PA0 | GPIO 输出 |
IN2 | 电机A控制 | PA1 | GPIO 输出 |
ENA | 电机A调速 | PA2 (TIM2_CH3) | PWM 输出 |
IN3 | 电机B控制 | PA3 | GPIO 输出 |
IN4 | 电机B控制 | PA4 | GPIO 输出 |
ENB | 电机B调速 | PA5 (TIM2_CH1) | PWM 输出 |
GND | 地 | GND | 必须共地 |
二、GPIO 初始化代码
void L298N_GPIO_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
三、PWM 初始化(使用 TIM2)
void PWM_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_5; // PA2 - CH3, PA5 - CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;// 设置计数频率为 1MHz,PWM频率为1KHz
TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // ARR
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // PSC (72MHz/72=1MHz)
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;// CH1 -> PA5 -> ENB
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);// CH3 -> PA2 -> ENA
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_Cmd(TIM2, ENABLE);
}
四、电机控制函数
// 电机A方向控制
void MotorA_Dir(uint8_t dir)
{if (dir)
{
GPIO_SetBits(GPIOA, GPIO_Pin_0);
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
}
// 电机B方向控制
void MotorB_Dir(uint8_t dir)
{
if (dir)
{
GPIO_SetBits(GPIOA, GPIO_Pin_3);
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_3);
GPIO_SetBits(GPIOA, GPIO_Pin_4);
}
}
// 电机A设置速度(0~1000)
void MotorA_SetSpeed(uint16_t speed)
{
TIM_SetCompare3(TIM2, speed); // TIM2_CH3 -> ENA
}
// 电机B设置速度(0~1000)
void MotorB_SetSpeed(uint16_t speed)
{
TIM_SetCompare1(TIM2, speed); // TIM2_CH1 -> ENB
}
五、主函数调用示例
int main(void)
{
L298N_GPIO_Init();
PWM_Init();
while (1)
{
// 电机A正转,速度800
MotorA_Dir(1);
MotorA_SetSpeed(800);
// 电机B反转,速度500
MotorB_Dir(0);
MotorB_SetSpeed(500);
Delay_ms(2000);
// 停止
MotorA_SetSpeed(0);
MotorB_SetSpeed(0);
Delay_ms(1000);
}
}
五、总结
L298N 电机驱动模块是嵌入式开发中最经典的驱动方案之一,尤其适用于智能小车、遥控车、迷你机械臂等项目。虽然存在一定局限,但其稳定性、易用性和教学价值依旧使它成为初学者和高校课程中的首选模块。
如果你正在使用 STM32、Arduino、51 单片机等平台进行小车开发,掌握 L298N 模块的使用,将为你打下坚实的控制基础。