当前位置: 首页 > news >正文

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 模块的使用,将为你打下坚实的控制基础。

相关文章:

  • C. Basketball Exercise
  • H3C 交换机基本命令详解
  • 功能结构整理
  • 关于人工智能指令
  • 优化WP外贸建站提升用户体验
  • C# 异常处理进阶:精准获取错误行号的通用方案
  • AIGC 基础篇 高等数学篇 01函数与极限
  • 使用Python进行函数作画
  • JavaSwing中使用JxBroser与JavaScript进行异步通信
  • 详解什么是call、apply、bind
  • mysql专题上
  • 高效视频倍速播放插件推荐
  • (LeetCode 每日一题)135. 分发糖果 ( 贪心 )
  • C++17新特性 函数对象包装器
  • OIer常用的软件
  • win32相关(虚拟内存和物理内存)
  • 【linux 入门】第六章 磁盘分区+网络配置
  • linux 的devmem2 调式使用说明
  • AI入门——AI大模型、深度学习、机器学习总结
  • docker可视化工具
  • 中国十大餐饮品牌策划公司/廊坊seo推广
  • 网站建设合同附件/指数基金什么意思
  • 动漫网站建设/北京首页关键词优化
  • 凡科做的是网站吗/2022适合小学生的简短新闻
  • 重庆专业网站建设公司排名/营销网络怎么写
  • 易企秀做的网站/互联网营销方法有哪些