L298N双H桥电机驱动详解:从原理到PWM调速实战
2026/9/18 19:33:36 网站建设 项目流程

很多人的第一个智能小车,都是从这块蓝板子开始的。L298N电机驱动模块在圈子里混了几十年,地位有点像一把用了很久的螺丝刀,参数不算惊艳,但就是顺手、便宜、哪里都能见到。我这些年做过不少带电机的东西,从小车轮子、云台云台,到给老打印机电机改装的桌面小设备,前前后后摸过很多驱动方案,回头发现最值得花时间搞清楚的反而是L298N上最基础的"双H桥"到底是什么。

这篇文章不打算停留在"照着接几根线让电机转"的层面。我会把H桥的四个开关逻辑、L298N内部的两级结构、电源和共地的门道、PWM调速的注意事项全部拆开讲一遍。适合两类人:一类是代码已经调通、但总觉得原理没吃透的;另一类是准备从L298N入门,又怕一上来就踩坑的。看完之后,你自己就能判断什么项目选L298N合适,什么项目该换别的芯片。

1. 从整体看L298N:一块老芯片凭什么还是入门首选

1.1 芯片内部到底藏了些什么

L298N是意法半导体早年推出的双H桥电机驱动芯片,常见封装是15脚的MultiWatt,带一块金属散热背板。说"双H桥",就是内部集成了两套独立的H桥功率输出级,每一套都能独立控制一路电机。芯片内部的主干是达林顿晶体管组成的功率开关,前面加了一级TTL兼容的逻辑输入处理电路,所以单片机给它发3V到5V的逻辑信号,它就能去控制电机电源侧的12V大电流通断。

这里有个很容易被忽略的点:L298N不是简单的"逻辑信号放大",它内部是两套地,逻辑地(VSS引脚)和功率地(GND引脚)分开设计,目的是让大电流回路上产生的干扰不至于直接串进逻辑部分。到了模块上,两个地往往通过铺铜连在一起,但真到接系统的时候,共地方式处理不当还是会出问题,这个我放到后面单独讲。

1.2 模块上这些引脚,各自管的什么事

以最常见的L298N模块来看,板子上的引脚不算多,但很多人只是机械地记住"IN1接这里、ENA接那里",从来没想过为什么这么接。

  • VS:电机电源正极,模块上很多标12V输入,实际芯片支持到46V。
  • VSS:逻辑电源,典型5V。很多模块带78M05稳压器,能从VS直接稳压出5V,也可以外供5V。
  • OUT1/OUT2:第一路H桥的输出,接电机A的两根线。
  • OUT3/OUT4:第二路H桥的输出,接电机B。
  • IN1/IN2:控制第一路H桥的方向。
  • IN3/IN4:控制第二路H桥的方向。
  • ENA/ENB:分别给两路H桥输出级的使能开关。

打个比方,IN引脚和ENA的关系,就像家里的电闸和开关。ENA这个总闸先合上,IN开关才有意义;ENA如果是低电平或者悬空,整个桥臂都不工作,电机就是惯性滑行状态。这正是很多新手把电机线接对了、代码也写了,电机却纹丝不动的第一个检查点。

1.3 几个真正要记住的参数

官方手册里L298N的关键参数,做实际项目时真正需要记住的是这几个:

  • 逻辑电压VSS:4.5到7V,典型5V;
  • 电机电压VS:最高46V,但模块上稳压电路更适合6到12V输入;
  • 每通道电流:峰值2A,持续工作按1A左右更稳妥;
  • 达林顿管饱和压降:工作电流1A时约1.8V到2V。

饱和压降这个数,是L298N最该被认真对待的地方。12V电源接到VS后,真正到电机两端的电压扣除掉芯片内部导通压降,可能只剩10V左右。这个压降还会以热量形式在芯片上散掉,所以L298N工作一会儿外壳烫手,不是坏了,是它本来就在干这件事。后面我会专门说怎么算散热和选电源。

2. 双H桥工作原理:四个开关怎么玩出四种状态

2.1 H桥到底是什么东西

H桥,本质上就是四个开关围成一个方形,负载接在中间,看起来像字母H,所以叫H桥。电机接在桥中间两条垂直边上,四个开关分别连接电源正、电源负和左右桥臂。要理解它,最简单的比喻是手动升降晾衣杆,要让晾衣杆上升还是下降,取决于电机转动的方向,而H桥的四个开关,负责决定电流从电机的哪一端流入。

电流从左往右流过电机,电机正转;从右往左流过,反转。四个开关只允许"对角导通"的组合,绝不允许同侧两个开关一起导通,否则电源正直接连到电源负,就是短路,行业内管这叫"直通",轻则驱动芯片过热,重则直接烧毁。

2.2 正转、反转、刹车、滑行这四种状态

以H桥的四个开关为基准,可以把工作状态归纳成一张表:

状态左上开关右上开关左下开关右下开关电机效果
正转导通断开断开导通电流正向流过电机
反转断开导通导通断开电流反向流过电机
刹车断开断开导通导通电机两端接地制动
滑行断开断开断开断开电机断电,惯性自由转

这里说的刹车,是两个下桥开关导通、电机两端都接地的情况。电机这时候相当于一个发电机,外力如果还在让它转动,绕组里就会感应出电流,通过两个下桥形成回路,产生制动力矩。这种方式叫下桥制动。还有一种方式是让两个上桥导通,把电机两端都接到电源正,同样能制动。落到L298N的输入逻辑上,IN1=IN2=0对应下桥制动,IN1=IN2=1对应上桥制动。两种都能停,但制动手感略有差异,日常代码里写双LOW就够用。

滑行状态和刹车完全不同。四个开关全断开,电机完全断电,靠惯性继续转,靠摩擦慢慢停。PWM调速的核心概念就藏在这里:当ENA上给的是脉冲信号而不是恒定高电平时,H桥在导通和断开之间快速切换,电机实际得到的平均电压等于占空比乘供电电压,转速也随之变化。

2.3 真值表与L298N实际输出对应

落到L298N模块上,简化成用户能直接操作的引脚组合,对应关系如下:

ENAIN1IN2电机状态
正转
反转
刹车(上桥制动)
刹车(下桥制动)
任意任意滑行

从这张表能看出来,ENA管的是H桥输出级是否有工作电压。ENA一但变低,输出级的功率管全部关断,IN怎么折腾电机都不会转。反过来,ENA保持高电平,IN1和IN2决定桥臂组合。

这也解释了为什么PWM调速在L298N上通常有两种接法:一种是把ENA接单片机的PWM口,IN1和IN2固定方向;另一种是ENA直接拉高,IN1给PWM,IN2给固定电平。两种接法理论上都成立,但实践下来我更推荐把PWM接到ENA,这样调速和方向完全解耦,写代码和排查问题都清爽很多。

3. 从原理到实操:接线、供电和调速

3.1 电源方案是第一个坑

L298N模块的供电,是新手最容易翻车的地方。模块上一般有一个跳线帽,用来决定VSS是从VS那里通过板载稳压器取电,还是外部单独供5V。当你用12V给VS供电,并且需要给Arduino也供5V时,可以把跳线帽保着,让板载78M05从12V降压出5V给VSS。但要注意,这个5V是给逻辑用的,顺便带个小电流外设可以,想靠它驱动舵机、给多个传感器板供电,就等着系统反复重启吧。

我常用的供电方案是分开供:电机电源用独立的电池或开关电源,逻辑电源用Arduino的5V输出,同时把两个电源的GND连在一起。模块上如果有跳线帽,按实际情况决定是否拔出。原则很简单,VSS这一路只负责逻辑,别让大电流走它。

VS端还应该并联一个大电解电容,容量100uF到470uF,尽量靠近模块的电源端子。电机启动瞬间电流是正常运转的好几倍,电源会被瞬间拉低,这个电容就是给电流突变一个缓冲。很多小车跑起来单片机随机重启,加了这个电容就好了,不信你可以试试。

3.2 Arduino控制一路直流电机的完整接线

以Arduino Uno控制一个额定6V、1A的直流减速电机为例,接线几步就能完成。

  • 保留模块上ENA的跳线帽,让使能默认有效;
  • 电机两根线接OUT1和OUT2;
  • IN1接Arduino数字口D8,IN2接D7;
  • 6V电池正极接VS,电池负极接模块GND,同时电池GND再接一条线到Arduino的GND;
  • 如果模块上VSS跳线帽没有拔,板载稳压会通过VS供电,不需要额外接5V。

对应的Arduino代码可以这么写:

int IN1 = 8; int IN2 = 7; int ENA = 9; void setup() { pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(ENA, OUTPUT); } void loop() { // 正转,占空比约80% digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); analogWrite(ENA, 200); delay(2000); // 反转,占空比约80% digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); analogWrite(ENA, 200); delay(2000); // 快速停止 digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); delay(1000); }

这里必须提醒一句,IN1和IN2接普通数字口没问题,但ENA要接支持PWM的口,Uno上是3、5、6、9、10、11这几个。如果接到D8这种普通口,analogWrite不生效,电机会要么全速转、要么完全不动,很多人在这里耗了半天。

3.3 PWM调速的工程取舍

Arduino的analogWrite默认频率只有490Hz左右,正好落在人耳可听频段,电机转起来会吱吱叫。我试过把Timer0的预分频器调整到1,PWM频率能提高到约4kHz,噪声明显变小,但代价是millis和delay的时间精度会受影响。所以大多数小车项目我懒得动它,把几百赫兹的噪声当成系统的"工作音"就好。

调速另一个容易踩的坑是占空比和转速不是线性的。由于电机内部有摩擦和换向损耗,占空比在30%以下时,电机可能根本不转,到了某个点突然就转起来,这叫死区效应。实际使用中,低速段的调速曲线需要自己做标定,比如占空比从0到50之间多取几个点测转速,记下来做映射。我做过一个小车,标定之后,同样一个占空比数值,轮子上的实测速度就一致多了。

4. 双H桥的延伸场景:差速转向和两相步进电机

4.1 两路电机的差速转向是怎么实现的

L298N最大的一个实用点就是同时控制两个电机,做差速转向。小车左边电机接第一路H桥,右边电机接第二路H桥,两个桥独立控制速度和方向,就能实现各种运动:

  • 两个电机都正转且速度一样,直行;
  • 两个电机都反转且速度一样,倒车;
  • 左正转、右正转但速度不同,车偏向慢的那一侧转弯;
  • 左正转、右反转,速度一致,小车原地旋转。

这种控制模式在Arduino里只需要把第一路代码复制一份,更换成IN3、IN4、ENB就行。再往下做,PID巡线和蓝牙遥控,都是在这个基础上加逻辑。

4.2 双H桥驱动两相四线步进电机

双H桥不仅可以驱动两个直流电机,也可以驱动一个两相四线的双极性步进电机,比如常见的42步进。接线方式是把电机的A+、A-接到OUT1、OUT2,B+、B-接到OUT3、OUT4,然后用四根IO按相序给IN1到IN4发脉冲序列,ENA和ENB拉高。

一个简单的4相整步序列可以写成:

int IN[4] = {8, 7, 10, 9}; void setup() { for (int i = 0; i < 4; i++) { pinMode(IN[i], OUTPUT); } } void stepOnce(int s) { // 4相整步序列:A, A+B, B, -A+B int seq[4][4] = { {1, 0, 0, 0}, {1, 0, 1, 0}, {0, 0, 1, 0}, {0, 1, 1, 0} }; for (int i = 0; i < 4; i++) { digitalWrite(IN[i], seq[s % 4][i] ? HIGH : LOW); } } void loop() { stepOnce(millis() / 5); }

注意,步进电机驱动电流是持续性的,L298N的热损耗会比驱动直流电机更大,需要加强散热。另外,如果是BYJ系列的28BYJ-48这类单极性步进电机,公共端要接电源正,本质上是低边开关驱动的,更适合ULN2003而不是L298N。如果你手头只有L298N也能凑合,把公共线接VS,四根相线分别接四个输出,控制时序时让需要导通的相对应输出为低,其余为高,但效率一般,不推荐长期用。我这里提一嘴,就是不想大家跟风用错方案。

4.3 和L293D、DRV8833这些芯片怎么选

很多新手会问,L298N和L293D、DRV8833到底什么区别。我整理了一个对比表:

参数L298NL293DDRV8833
每通道峰值电流2A0.6A1.5A
最大工作电压46V36V10.8V
导通压降约2V约1.4V约0.3V
内部续流二极管无,模块上额外加
适用场景6到12V减速电机、双H桥步进微型玩具电机、小风扇低压电池供电的小车

L293D是四通道半桥方案,持续电流偏小,适合那种小型玩具电机,直接插面包板挺方便。DRV8833是低压MOS方案,压降低,效率高,适合两节锂电池供电的小型机器人。L298N的优势在于电压范围宽、电流能力大、皮实耐造,缺点是压降大导致发热,效率偏低。选型其实就是先定电机电压和电流,再倒推驱动芯片能不能扛得住。

5. 常见问题与排查技巧实录

5.1 电机不转,按顺序查这四个地方

电机不转是最常见的问题,我遇到过的原因里,按概率排序大概是这样的:

  • 跳线帽掉了。ENA和ENB是靠跳线帽默认接高电平的,很多板子出厂带跳线帽,运输或拔插过程中掉了,桥臂根本没使能,电机自然不转。
  • 共地没做。模块GND和单片机GND没有连在一起,IN脚的电平没有参考点,芯片看不懂逻辑信号。这个我见过太多次,代码和接线看似都对,就是少了这根地线。
  • 供电电流不够。尤其是用电池供电时,电机启动瞬间电流很大,劣质电池瞬间电压会被拉垮,模块的欠压保护或逻辑混乱会直接罢工。用万用表量一下VS和GND之间的电压,再看它在电机启动瞬间跌到多少。
  • PWM接错口。ENA接到了不支持PWM的普通数字口,analogWrite不生效,电机要么全速要么不转。

排查顺序我建议是:先看跳线帽,再量VS和VSS电压,接着确认共地,最后用万用表量IN脚在代码运行时的电平有没有变化。

5.2 芯片烫手,这是正常现象还是故障

L298N用一会儿摸芯片背面发烫,很多人担心是不是坏了。其实只要不超过手册里的结温,这属于常态。按前面说的参数算一算,芯片内部饱和压降约2V,流过1A电流时,单路H桥的功耗就有2W,双路一起用就是4W以上。你用功率公式P=U×I就能算出来,4W的热量集中在一个15脚封装上,不烫才奇怪。

解决办法几选一:加散热片,这是最直接的;降低供电电压,电压低一点压降也会低一点;降低PWM频率,过高的频率会增大开关损耗;再就是换芯片,比如DRV8833这类低压MOS方案,压降只有0.3V左右,同样1A电流热损耗只有0.6W。L298N适合对效率不敏感的教学和原型验证场景,真要长时间重载跑,就该换方案了。

5.3 小车一跑就复位,串口乱码,问题出在共地

小车跑起来单片机随机复位、串口打印乱码,多半是共地方式出了问题。电机是大功率负载,电流突变时会在地线上产生压差,如果逻辑参考地和大电流地走的同一条细线,这个冲动就会窜进单片机。

我在项目里习惯星型接地。电机电源正负极走粗线,模块的GND直接回到电源负极,Arduino的GND也单独拉一条线回到电源负极,两边只在电源端汇合。同时,在电机电源端并联一个470uF大电容,吸收瞬态冲击。这样处理之后,原来三天两头复位的小车,基本就没再犯过。

5.4 续流二极管和反电动势,这个细节不能省

L298N内部的达林顿管本身没有反并联二极管,也就是说,如果没有外部续流通道,电机断电瞬间产生的反电动势没有地方释放,电压尖峰可能远远超过电源电压,直接击穿功率管。所以裸芯片方案必须接续流二极管,每个功率管反并联一个快恢复二极管,通常是8个。

好在市面上绝大多数L298N模块上已经预装了这8个二极管,这也是为什么成品模块用起来省心。但如果你是买裸片自己画板子,这个细节千万别省。我接过一个自制驱动板,就是省了二极管,第一块板子通电烧了三个管子,换成模块后一切正常,教训很直接。

最后说一个实际体会

做电机驱动这事,原理通了,后面换什么芯片都是一个思路。L298N这模块虽然老,但作为学习H桥原理的载体,它比任何更高端的驱动芯片都直观,因为你必须亲手处理供电、共地、续流,才能感受到大电流电路和纯数字电路之间的差距。

我个人的习惯是:无论用哪块驱动板,上电之前一定用万用表确认一遍VS和GND、VSS和GND这两组电压,再看一眼跳线帽和共地线。看起来是笨功夫,但能省掉后面一大半的排查时间。下次遇到电机不转,先别急着换芯片,拿万用表量一圈再说。

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

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

立即咨询