L298N纯5V供电驱动直流电机:Arduino单电源方案详解
2026/9/16 3:42:57 网站建设 项目流程

之前在做智能小车、机械臂这类需要精确控制电机的项目时,很多朋友都卡在了电机驱动模块的选择和配置上。网上资料要么过于零散,要么直接上复杂电路,对新手极不友好。特别是当手头只有一块 Arduino 开发板和常见的 L298N 模块,想用单一 5V 电源驱动小功率电机时,接线和配置总让人一头雾水。

本文将彻底解决这个问题,手把手教你如何将标准的 L298N 电机驱动模块配置为“纯 5V 版本”,即仅使用一个 5V 电源(如 USB 或 5V 适配器)同时为 Arduino 和 L298N 供电,并稳定驱动两个直流电机。内容涵盖核心原理、硬件改造、代码编写、常见问题排查以及进阶优化,无论你是刚接触 Arduino 的创客,还是使用米思齐(Mixly)图形化编程的爱好者,都能跟着步骤一步步实现。

1. 背景与核心概念:为什么需要“纯5V版本”?

在开始动手之前,我们必须先理解几个核心概念和“纯5V版本”要解决的实际问题。

1.1 L298N 电机驱动模块是什么?

L298N 是一款非常经典的双 H 桥直流电机驱动芯片。所谓“双 H 桥”,意味着它内部集成了两个独立的 H 桥电路,可以同时控制两个直流电机的正反转和速度(通过 PWM)。我们通常购买的是将 L298N 芯片、外围电路(如滤波电容、续流二极管)和便于接线的端子集成在一起的模块。

它的核心功能是:接收来自单片机(如 Arduino)的微弱控制信号(通常为 3.3V 或 5V,电流仅几毫安),然后输出足以驱动电机的强电流(单桥持续电流可达 2A,峰值 3A)。它起到了“信号放大器”和“电源开关”的作用。

1.2 标准 L298N 模块的供电困境

一个标准的 L298N 模块通常有三个电源输入接口:

  1. 12V 供电端子 (VCC / +12V Input):这是给电机供电的主电源。模块的逻辑部分和电机驱动部分的功率都来源于此。电压范围较宽(常见 7V-35V),电压越高,电机转速的理论上限越高。
  2. 5V 供电端子 (5V / +5V Input):这是给模块内部逻辑电路(如 L298N 芯片的逻辑部分、板载 5V 稳压芯片)供电的。如果此处接入 5V,模块会使用这个 5V 为逻辑电路供电。
  3. GND 端子:公共地线,必须与 Arduino 的 GND 连接。

标准用法(双电源):使用一个 7-12V 的电池或适配器接入 L298N 的12V 供电端子,同时将这个电源的正极(通过降压模块或分压)或另一个独立的 5V 电源接入5V 供电端子,并为 Arduino 供电。这种方式稳定,但需要两个电源或一个电源配合降压模块,接线复杂,不适合快速原型开发。

常见误区(单电源接错):很多新手会尝试只用一个 5V 电源(比如电脑 USB 的 5V)直接接到 L298N 的12V 供电端子,希望同时驱动电机和模块逻辑。这通常会导致:

  • 电机不转或无力:5V 电压低于电机启动所需的最低电压(特别是带负载时)。
  • 模块发热严重:L298N 内部的线性稳压部分在压差过大或电流不足时效率极低,大量电能转化为热能。
  • Arduino 重启或失灵:电机启动瞬间电流很大,可能导致 5V 电源被拉低,造成 Arduino 电压不稳而复位。

1.3 “纯5V版本”方案的提出

“纯5V版本”的目标就是:仅使用一个 5V 电源,通过合理的硬件配置,让 L298N 模块和 Arduino 协同工作,稳定驱动小功率直流电机(如 TT 减速电机、N20 微型电机)。

其核心思路是

  1. 摒弃模块的 12V 输入:我们不向 L298N 的 12V 端子供电。
  2. 启用板载 5V 稳压器:利用 L298N 模块上一个关键的跳线帽(或开关)。当这个跳线帽接通时,模块内部的 5V 稳压芯片(如 78M05)会开始工作。
  3. 单一 5V 电源输入:将外部唯一的 5V 电源(如 USB 口、5V 移动电源)正极接到 L298N 模块的5V 供电端子,负极接到GND
  4. 电力分配:这个 5V 电源通过模块的 5V 端子,一方面为模块自身的逻辑电路供电,另一方面,模块的5V 输出端子(通常与输入端子物理相连或通过跳线选择)会输出一个稳定的 5V,这个 5V 可以反过来给 Arduino 的VIN5V引脚供电(需谨慎),或者更常见的是,Arduino 也由同一个 5V 电源通过其他方式供电(如都接在同一个面包板电源上),此时只需共地即可。

这样,我们就实现了单一 5V 电源为整个系统(控制+驱动)供电。但需要注意的是,此方案受限于 5V 电压和 L298N 内部稳压器的输出电流能力,只能驱动小功率电机。对于大功率电机,必须回归标准的双电源方案。

2. 环境准备与硬件清单

在开始接线和编程前,请准备好以下硬件和软件环境。

2.1 硬件清单

组件数量说明
Arduino 开发板1如 Arduino Uno R3,本文以 Uno 为例。
L298N 电机驱动模块1确保模块上有12V输入5V输入GND5V输出端子,以及一个关键的5V使能跳线帽
直流电机 (TT马达/N20)2工作电压建议为 3-6V 的小功率电机。这是成功的关键,额定电压12V的电机用5V驱动会非常无力。
5V 电源1能提供至少1A电流的电源。可以是:
• 电脑 USB 口(约 0.5A,可能不足)
• 手机充电器(5V/1A 或 2A)
• 移动电源
• 面包板专用 5V 稳压模块
杜邦线若干公对公、公对母,用于连接 Arduino、L298N 和电机。
跳线帽1L298N 模块通常自带,用于短接 5V 使能引脚。

重要提醒:请务必确认你的 L298N 模块版本。大多数通用蓝色或绿色板都支持此方案。关键是要找到那个标有+5V Enable5V Regulator Jumper或 simply 一个排针(旁边印有Jumper)的位置。这个跳线帽必须插上,才能启用板载 5V 稳压器。

2.2 软件环境

  • Arduino IDE:从 Arduino 官网下载并安装最新版。本文代码将使用 Arduino IDE 编写。
  • Mixly(米思齐):如果你是图形化编程用户,确保安装好 Mixly。其底层逻辑与 Arduino IDE 一致,本文会同时提供思路。
  • 驱动程序:确保电脑能正确识别你的 Arduino 板(如 CH340 驱动)。

3. 硬件连接与配置详解

这是整个项目的核心实操部分,请严格按照步骤操作。

3.1 L298N 模块跳线设置

  1. 找到跳线帽:在 L298N 模块上,找到标有+5V Enable5V Regulator Jumper或位于12V Input端子附近的一个独立的三针排针(通常只有中间和一侧有引脚被使用)。
  2. 插入跳线帽:将这个跳线帽牢固地插在这两个引脚上。这个操作启用了模块内部的 5V 线性稳压器(如 78M05)。这意味着,当外部 5V 电源接入5V Input端子时,稳压器会工作,为逻辑电路提供稳定的 5V。同时,5V Output端子也会有 5V 输出。
    • 如果跳线帽拔掉:则内部稳压器被禁用。此时你必须从外部向5V Input端子提供一个稳定的 5V 电源,且不能从5V Output取电。这常用于外部有更优质 5V 电源的场景。

3.2 电源连接(最关键的一步)

目标:将单一的 5V 电源同时分配给 L298N 模块和 Arduino。

方案A(推荐,使用外部5V电源模块):

  1. 准备一个 5V/1A 以上的电源适配器或移动电源。
  2. 将该电源的正极(+)连接到 L298N 模块的5V Input端子。
  3. 将该电源的负极(-)连接到 L298N 模块的GND端子。
  4. 同时,将电源的负极(-)连接到 Arduino 的GND引脚。
  5. 此时,L298N 模块的5V Output端子会有电。你可以选择:将5V Output连接到 Arduino 的5V引脚,为 Arduino 供电。但更推荐:Arduino 通过其自身的 USB 口或VIN引脚由另一个独立的 5V 供电(只要地与 L298N 共地即可),以避免 L298N 模块的 5V 输出电流不足影响 Arduino 稳定。

方案B(使用 Arduino 的 5V 引脚,仅适用于极小电流电机):不推荐主力使用,仅用于测试理解原理。

  1. 将 Arduino 的5V引脚连接到 L298N 模块的5V Input端子。
  2. 将 Arduino 的GND引脚连接到 L298N 模块的GND端子。
  3. 警告:Arduino 板载的 5V 稳压器输出能力有限(通常约 500mA-1A),它要供给 Arduino 自身、可能的外设(如屏幕、传感器),现在还要供给 L298N 逻辑电路和电机!极易导致 Arduino 重启或损坏。仅适用于驱动一个空载的微型电机进行原理验证。

本教程后续步骤默认采用方案A,即使用一个独立的、电流能力足够的 5V 电源为 L298N 供电,并与 Arduino 共地。Arduino 可通过 USB 单独供电。

3.3 控制信号连接

接下来,连接 Arduino 的数字引脚来控制 L298N,从而控制电机。

L298N 模块控制两个电机(M1, M2),每个电机需要 2 个控制信号(IN1, IN2)和 1 个 PWM 调速信号(ENA, ENB)。

L298N 模块引脚连接至 Arduino 引脚功能说明
ENAD5(PWM引脚)电机 A 的使能/调速引脚。使用 PWM 输出可调节电机速度。
IN1D2电机 A 的方向控制引脚 1。
IN2D3电机 A 的方向控制引脚 2。
IN3D4电机 B 的方向控制引脚 1。
IN4D7电机 B 的方向控制引脚 2。
ENBD6(PWM引脚)电机 B 的使能/调速引脚。
GNDGND必须连接!确保 Arduino 和 L298N 有共同的参考地。

接线图示(文字描述):

外部5V电源 + ---> L298N.5V Input 外部5V电源 - ---> L298N.GND & Arduino.GND Arduino.D5 ---> L298N.ENA Arduino.D2 ---> L298N.IN1 Arduino.D3 ---> L298N.IN2 Arduino.D4 ---> L298N.IN3 Arduino.D7 ---> L298N.IN4 Arduino.D6 ---> L298N.ENB Arduino.GND ---> L298N.GND (已通过电源共地) 电机A (M1) 两根线 ---> L298N OUT1 & OUT2 电机B (M2) 两根线 ---> L298N OUT3 & OUT4

3.4 电机连接

将两个直流电机分别连接到 L298N 的电机输出端子。

  • 电机 A 连接到OUT1OUT2
  • 电机 B 连接到OUT3OUT4。 电机的正反转取决于 IN1/IN2 的电平组合,接线时无需区分电机线序,如果转向与预期相反,在代码中交换 IN1 和 IN2 的逻辑即可,或者直接调换电机两根线的插口。

4. 核心代码编写与原理剖析

硬件连接好后,我们来编写控制代码。我们将实现一个简单的测试程序:让两个电机先正转 3 秒,然后停止 1 秒,再反转 3 秒,如此循环,并且速度由慢到快变化。

4.1 Arduino IDE 代码实现

在 Arduino IDE 中新建一个项目,输入以下完整代码:

// L298N 纯5V驱动双直流电机测试程序 // 引脚定义 - 请确保与你的实际接线一致 const int ENA = 5; // 电机A使能/PWM const int IN1 = 2; // 电机A方向1 const int IN2 = 3; // 电机A方向2 const int ENB = 6; // 电机B使能/PWM const int IN3 = 4; // 电机B方向1 const int IN4 = 7; // 电机B方向2 void setup() { // 初始化所有控制引脚为输出模式 pinMode(ENA, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); // 初始状态:停止所有电机 stopMotors(); Serial.begin(9600); // 用于调试,可选 Serial.println("L298N 5V Driver Test Start!"); } void loop() { // 阶段1: 电机正转,速度逐渐加快 Serial.println("Forward - Accelerating"); for (int speed = 100; speed <= 255; speed += 50) { // PWM值从100到255 motorForward(speed); delay(800); // 每个速度等级维持0.8秒 } delay(500); // 全速正转维持0.5秒 // 阶段2: 刹车停止 Serial.println("Brake Stop"); motorBrake(); delay(1000); // 停止1秒 // 阶段3: 电机反转,速度逐渐加快 Serial.println("Backward - Accelerating"); for (int speed = 100; speed <= 255; speed += 50) { motorBackward(speed); delay(800); } delay(500); // 全速反转维持0.5秒 // 阶段4: 滑行停止 Serial.println("Coast Stop"); stopMotors(); delay(1000); // 停止1秒 } // ========== 电机控制函数库 ========== // 函数:停止电机(滑行停止) void stopMotors() { digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); analogWrite(ENA, 0); // PWM置0 analogWrite(ENB, 0); } // 函数:刹车停止(快速制动) void motorBrake() { digitalWrite(IN1, HIGH); digitalWrite(IN2, HIGH); digitalWrite(IN3, HIGH); digitalWrite(IN4, HIGH); // ENA/ENB 可以是 HIGH 或 LOW,但通常置为 HIGH 或保持原PWM值。 // 更精确的刹车是设置PWM为255,同时IN1/IN2同相。 analogWrite(ENA, 255); analogWrite(ENB, 255); } // 函数:控制电机正转 void motorForward(int pwmSpeed) { // 电机A正转 digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); // 电机B正转 digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); // 设置速度 analogWrite(ENA, pwmSpeed); analogWrite(ENB, pwmSpeed); } // 函数:控制电机反转 void motorBackward(int pwmSpeed) { // 电机A反转 digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); // 电机B反转 digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); // 设置速度 analogWrite(ENA, pwmSpeed); analogWrite(ENB, pwmSpeed); }

4.2 代码逐行解析

  1. 引脚定义:开头定义了所有连接到 L298N 的 Arduino 引脚。使用const int定义常量,便于修改。
  2. setup()函数
    • pinMode(... , OUTPUT):将所有控制引脚设置为输出模式,因为 Arduino 需要向 L298N 发送信号。
    • stopMotors():初始化时调用自定义函数,确保电机处于停止状态,防止上电瞬间误动作。
    • Serial.begin(9600):初始化串口,用于在电脑上打印调试信息,非必需但强烈推荐。
  3. loop()函数:主循环,定义了电机的动作序列。
    • 使用for循环让 PWM 值从 100 递增到 255,实现加速效果。PWM 值范围是 0-255,0 为停止,255 为全速。低于一定值(如 50-70)电机可能无法启动,所以从 100 开始。
    • motorForward(speed)motorBackward(speed):调用自定义函数控制电机方向和速度。
    • motorBrake()stopMotors():演示两种停止方式。
  4. 核心控制函数
    • 方向控制:通过设置 IN1/IN2(或 IN3/IN4)的高低电平组合来控制 H 桥内 MOS 管的通断,从而改变电流流经电机的方向。
      • IN1=HIGH, IN2=LOW:电机正转。
      • IN1=LOW, IN2=HIGH:电机反转。
      • IN1=LOW, IN2=LOW:滑行停止(电机两端悬空,惯性停止)。
      • IN1=HIGH, IN2=HIGH:刹车停止(电机两端短接,产生反向电动势快速制动)。
    • 速度控制:通过analogWrite(pin, value)向 ENA/ENB 引脚输出 PWM 信号。value决定了在一个周期内高电平的占比,从而控制平均电压,实现调速。
  5. 停止的区别
    • stopMotors():将方向引脚都置为 LOW,PWM 置 0。电机惯性滑行,停止较慢。
    • motorBrake():将方向引脚都置为 HIGH,PWM 置 255。电机两端被短接,产生电磁制动,停止迅速。适用于需要快速停止的场景。

4.3 米思齐 (Mixly) 图形化编程实现

对于使用 Mixly 的用户,逻辑是完全相同的。你需要在图形化界面中完成以下模块的拼接:

  1. “引脚”分类下,拖出数字输出模块,设置引脚号(如 2, 3, 4, 7),状态设置为,用于控制 IN1-IN4。
  2. “引脚”分类下,拖出模拟输出 (PWM)模块,设置引脚号(5 和 6),值设置为变量或具体数字(0-255),用于控制 ENA/ENB 调速。
  3. “控制”分类下,使用延时模块控制动作持续时间。
  4. “变量”分类下,可以创建速度变量,结合数学运算和循环模块来实现加速效果。
  5. “函数”分类下,可以创建自定义函数块,将正转反转停止的逻辑封装起来,就像上面的代码一样,使主程序逻辑更清晰。

Mixly 的优势是直观,但理解背后的代码逻辑对于调试和进阶学习至关重要。建议在完成图形化编程后,点击 Mixly 的“代码”视图,查看生成的 Arduino C 代码,与你上面看到的代码进行对比学习。

5. 上传、测试与现象观察

  1. 连接 Arduino:用 USB 数据线将 Arduino 连接到电脑。
  2. 选择板卡和端口:在 Arduino IDE 中,选择正确的板卡型号(如 Arduino Uno)和对应的 COM 端口。
  3. 上传代码:点击上传按钮。上传成功后,Arduino 会自动运行新程序。
  4. 观察现象
    • 两个电机应该开始按照“正转加速 -> 刹车 -> 反转加速 -> 滑行停止”的序列循环运行。
    • 打开串口监视器(工具 -> 串口监视器,波特率设为 9600),可以看到对应的调试信息输出。
    • 用手轻轻捏住电机轴,可以感受到不同 PWM 值下的扭矩变化。速度越低,扭矩通常越小。

如果电机不转,请立即进入下一章的排查步骤。

6. 常见问题与深度排查指南

以下是使用 L298N 纯 5V 方案时最常见的问题及其解决方法。

问题现象可能原因排查步骤与解决方案
电机完全不转,模块指示灯不亮1. 电源未接通或电压不足。
2. 跳线帽未插或插错位置。
3. 电源线接反。
1. 用万用表测量 L298N5V Input端子电压,确认是否为稳定的 5V。
2.确认 5V 使能跳线帽已正确插入,这是最常见的原因。
3. 检查电源正负极是否接反。
电机不转,但模块指示灯亮1. 控制信号未连接或接错。
2. Arduino 未供电或未共地。
3. 代码引脚定义错误。
4. ENA/ENB 未使能(PWM值为0)。
1. 检查所有杜邦线连接是否牢固,特别是 IN1-IN4, ENA, ENB 到 Arduino 的线。
2.确保 Arduino 的 GND 与 L298N 的 GND 已连接(共地)。
3. 核对代码中的引脚号与实际接线是否一致。
4. 在代码中尝试给 ENA 和 ENB 直接赋值为 255 (analogWrite(ENA, 255)),排除 PWM 问题。
电机抖动、振动或转速极慢1.电源电流不足!这是纯5V方案下最可能的原因。
2. PWM 频率不匹配(罕见)。
3. 电机功率过大,5V 电压无法有效驱动。
1.重点检查:换用电流更大的 5V 电源(如 5V/2A 充电器)。电机启动电流是额定电流的 2-3 倍。
2. 尝试提高 PWM 值(如设为 255)看是否正常。如果全速正常,低速抖动,可能是电源带载能力差。
3. 确认电机是否为 3-6V 的小功率电机。12V 电机在 5V 下会非常无力。
只有一个电机转1. 未使用的电机接线或代码有误。
2. 该电机对应的驱动通道损坏。
1. 检查不转的电机对应的 IN1/IN2/ENA(或 IN3/IN4/ENB)接线和代码。
2. 交换两个电机的接线(将不转的电机接到正常工作的输出端子上),如果电机转了,说明原 L298N 的那个输出通道可能损坏;如果仍不转,则可能是电机本身问题。
电机转向与预期相反电机线序接反。最简单的办法:在代码中交换控制该电机方向的两个 IN 引脚的电平逻辑。例如,正转原本是IN1=HIGH, IN2=LOW,改为IN1=LOW, IN2=HIGH。或者直接调换电机连接在 OUT1 和 OUT2 上的两根线。
L298N 模块发热严重1.未安装散热片且负载较重。
2. 电机堵转或短路。
3. 电源电压过高(但5V方案一般无此问题)。
4. L298N 内部压差大,效率低(线性稳压模式下的通病)。
1. 为 L298N 芯片安装散热片。
2. 确保电机转动顺畅,无机械卡死。
3. 在纯5V模式下,发热主要来自芯片自身功耗和驱动电机的内阻消耗。如果发热异常烫手,请立即断电,检查是否有短路或电机负载过重。驱动大电流电机必须用标准双电源方案
Arduino 自动复位或程序跑飞电源干扰!电机启停产生的大电流波动影响了为 Arduino 供电的 5V 电源。1.强化电源:使用更强劲、更干净的 5V 电源,并在 Arduino 的5VGND引脚之间并联一个100uF 或更大的电解电容,以稳定电压。
2.电源分离:确保电机电源(接 L298N)和 Arduino 逻辑电源(接 Arduino USB)在源头(如电池)处并联大电容滤波,并保证导线足够粗。
3.共地:务必确保所有部分的 GND 都可靠连接在一起。

7. 最佳实践、优化与进阶思路

成功驱动电机只是第一步,以下是让项目更稳定、更专业的建议。

7.1 电源系统优化(重中之重)

  • 独立供电:强烈建议为电机驱动部分(L298N)和控制部分(Arduino)使用独立但共地的 5V 电源。例如,用一个 5V/2A 以上的 DC-DC 降压模块单独给 L298N 供电,Arduino 则通过电脑 USB 或另一个 5V 电源供电。两者之间仅用一根导线连接 GND。
  • 大容量电容:在 L298N 的5V InputGND之间,以及 Arduino 的5VGND之间,都并联一个100-470uF 的电解电容和一个0.1uF 的陶瓷电容。这可以极大吸收电机启停产生的电流尖峰,防止系统复位。
  • 导线规格:连接电源的导线要足够粗,以减少压降。

7.2 代码结构与可维护性

  • 使用函数封装:如示例代码所示,将motorForward,stopMotors等操作封装成函数,使主loop逻辑清晰。
  • 定义结构体或类:如果需要控制多个电机,可以定义电机结构体,将引脚和状态封装在一起。
  • 加入安全限制:在函数中加入对 PWM 值的范围检查,防止误写入超出 0-255 的值。

7.3 性能与功能扩展

  • 调速曲线优化:简单的analogWrite是线性调速。对于小车,可以设计加速和减速曲线,使启停更平稳。
  • 加入传感器反馈:结合编码器(测速模块)实现电机的闭环 PID 控制,可以精确控制转速和位置,这是制作平衡车、巡线小车的核心。
  • 使用更高效的驱动模块:L298N 效率相对较低(压降大、发热多)。对于追求效率和体积的项目,可以考虑TB6612FNGDRV8833等 MOSFET 桥驱动芯片,它们支持更低的电压(2.5V-10V+),效率更高,体积更小。
  • 无线控制:结合蓝牙模块(如 HC-05/06)或 WiFi 模块(ESP8266/ESP32),用手机或电脑遥控你的小车。

7.4 从 Arduino 到 51/32 位单片机

原理完全相通。无论是 STM32、ESP32 还是 51 单片机,控制 L298N 的本质都是:

  1. 将单片机的 GPIO 引脚配置为推挽输出模式,连接至 L298N 的 IN1-IN4。
  2. 使用单片机的 PWM 输出功能(定时器产生),连接至 L298N 的 ENA/ENB。
  3. 确保共地。
  4. 代码逻辑(高低电平组合、PWM 占空比)与 Arduino 完全一致。你只需要将digitalWriteanalogWritepinMode替换成对应单片机的库函数或寄存器操作即可。

通过本文的详解,你应该已经掌握了 L298N 模块在纯 5V 供电模式下的全套使用方法。从理解跳线帽的作用,到完成硬件连接,再到编写控制代码和系统调试,这个过程涵盖了电机驱动最核心的实践环节。记住,电源是这类项目的“血液”,务必保证其充足和稳定。当你的小车跑起来,机械臂动起来的那一刻,所有的调试都是值得的。接下来,你可以尝试将多个传感器集成进来,或者挑战 PID 闭环控制,进入更精彩的嵌入式世界。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询