ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

L298N电机驱动模块接线与PWM调速:Arduino智能小车五大常见坑详解

L298N电机驱动模块接线与PWM调速:Arduino智能小车五大常见坑详解 1. 先把L298N这件事彻底讲明白接好线、烧好程序小车就是不动或者电机只会嗡嗡叫轮子卡死又或者一上电就跑根本不受控制。这三个场景几乎每个做Arduino智能小车的人都遇到过而罪魁祸首多半不是代码而是L298N电机驱动模块的接线和用法出了问题。L298N是ST公司生产的双H桥电机驱动芯片内部集成两个完整的H桥电路可以同时独立控制两路直流电机每路最大输出电流2A左右。它之所以在Arduino生态里这么流行是因为接口简单、逻辑直观、皮实耐造而且支持PWM调速和正反转控制。一套标准接法下来你就能用Arduino的数字引脚控制电机方向用PWM引脚控制电机速度这就是智能小车底盘控制的最核心基础。这篇文章我会从实际操作角度把L298N从接线到PWM调速过程中最容易踩的5个坑从头到尾拆一遍。对应的代码、接线表、排查流程都是我自己反复验证过的适合刚入门Arduino小车、或者已经被L298N折磨到怀疑人生的朋友参考。看完之后你至少能少烧两三个驱动模块少走一整晚弯路。2. 五大高频错误逐一拆解每一个都是硬坑2.1 错误一只接电机电源不接逻辑电源板子看着通电实际罢工很多人第一次用L298N会直接把电池正负极接到模块的12V和GND端子上然后发现Arduino怎么发指令都没反应模块上的电源指示灯如果带稳压版本会亮不带稳压版本连灯都不亮。原因在于L298N芯片内部的逻辑电路需要5V供电才能正常工作。市面上的L298N模块分两种一种带板载5V稳压芯片可以从12V输入降压出5V给逻辑部分用另一种不带稳压必须在5V端子上额外接5V。即便带稳压的版本这个5V稳压芯片的压降和负载能力也比较有限如果电机电流一大逻辑电压跟着抖动模块状态就会变得非常不稳定。我建议的做法是永远把Arduino的5V引脚接到L298N的5V端子同时把GND接好形成稳定的逻辑供电。如果你用的是带稳压的模块跳帽默认插在5V使能位此时5V端子会向外输出5V也有人拿这个去给Arduino供电但我很不推荐因为电机启动瞬间的大电流会导致稳压输出跌得很厉害Arduino随时可能重启。提示判断你的模块是否带稳压直接看模块上有没有一个AMS1117-5.0或者7805样子的芯片。没有的话老老实实从外部引5V过去。2.2 错误二EN跳帽不摘PWM调速直接失效这是我见过最多的问题几乎每周都有新手来问为什么我代码里写了analogWrite电机还是全速转是不是PWM坏了大概率是你没摘跳帽。L298N模块上一般有两组跳帽分别标着ENA和ENB出厂默认插着作用是把使能端直接接到5V高电平。在这种状态下使能端被强制拉高H桥全开外部给到ENA引脚的PWM信号根本没有意义因为引脚已经被跳帽钉死在5V了。你写的analogWrite实际上是接到了EN引脚上但它被跳帽短路到高电平等于白写。正确用法是把ENA和ENB的跳帽都拔掉然后用杜邦线把Arduino的PWM引脚分别接到模块的ENA、ENB引脚上。这样PWM信号才能进入使能端通过占空比控制MOS管实际上是达林顿管的导通时间实现调速。顺带说一个细节L298N的调速并不是通过IN1、IN2实现的IN1和IN2只管方向真正决定转速的是ENA/ENB上的PWM占空比。比如你想让电机正转半速正确的组合是IN1HIGH、IN2LOW、ENA接PWM(128)如果你把IN1也接了PWM那是把方向脚当调速脚用行为会变得不可控这是另一个容易混合的地方。注意拔下来的跳帽别弄丢后面如果你临时想测试电机全速转插回去就行了。我习惯用透明胶带把跳帽粘在模块背面既不丢又不会误装回去。2.3 错误三Arduino和L298N没有共地控制信号全部无效排查完使能端电机还是乱转或者不动那就检查共地。所谓共地就是Arduino的GND引脚必须和L298N的GND端子用导线连在一起。因为Arduino输出的控制信号是高电平5V、低电平0V这个0V是相对Arduino自己的GND而言的。如果两个板子的GND不在同一个电位上Arduino输出的数字信号到了L298N那里参考地不同电平判断就会乱套轻则信号无效重则引脚电流倒灌烧坏主控。共地是单片机和外部驱动模块之间最基本也最容易被忽略的问题。很多时候你看到的现象是电机偶尔转一下但完全不受控或者某个方向能转另一个方向不能转量一下电压发现控制引脚电平飘忽不定基本就是地没接好。实操中我习惯把所有GND连成一个星型结构电池负极接到L298N的GND端子再从L298N的GND端子拉一根线到Arduino的GND所有模块的地都汇聚到同一个点避免形成地环路造成干扰。2.4 错误四电源选型太随意电压一掉整个系统重启电源是L298N项目里最容易被低估的一环。L298N内部是达林顿管结构两个管子串联压降通常在2V到3.6V之间这取决于电流大小。也就是说如果你用6V电池给电机供电实际到电机两端的电压可能只有3V出头电机转速会明显低于预期。更麻烦的是电机启动瞬间电流很大。普通N20减速电机堵转时电流也可能到1A以上如果是大一点的370电机启动瞬间冲到2A甚至3A都很正常。这时候如果电池供电能力不足电压会瞬间跌到很低Arduino主控跟着掉电重启整个系统进入死循环。我见过一个典型场景用两节18650锂电池串联标称7.4V满电8.4V给L298N供电同时从L298N的5V输出给Arduino供电结果每次电机一启动Arduino就重启。原因就是电池内阻和线阻导致的压降加上L298N稳压输出能力本来就很弱Arduino一吃电流电压就崩了。解决方案很明确电机电源和控制电源分开用3S锂电池11.1V或者2S锂电池7.4V给电机供电Arduino用USB或者单独的5V降压模块供电两边的GND依然共地。电机电源线上最好并联一个470uF以上的电解电容靠近L298N的电源端子可以吸收启动瞬间的尖峰电流。2.5 错误五PWM引脚和频率没搞对电机要么不动要么飞车L298N的PWM调速本身不挑频率但Arduino Uno的analogWrite在不同引脚上的PWM频率并不一样这一点直接影响了电机的运行噪音和调速手感。Uno上支持PWM的引脚是3、5、6、9、10、11其中5、6、9、10默认490Hz3、11默认980Hz。对于普通的直流减速电机这两个频率都能用实际听感上980Hz会略尖锐一点。真正要注意的是你千万别把PWM信号写到非PWM引脚上比如A0、2、4这些脚。analogWrite写到非PWM引脚上不会有任何效果等效于digitalWrite(HIGH)电机直接全速飞车。另一个和PWM强相关的坑是死区问题。直流电机本身存在启动电压PWM占空比太低时等效平均电压不足以克服电机静摩擦力和电感压降电机根本不会动。比如12V供电的电机可能PWM到60左右才开始缓慢转动这个临界值就是死区。做精确调速时如果不处理死区会出现小车启动时一抖一抖、低速时一顿一顿的现象。我常用的做法是在代码里加一个最小PWM阈值低于这个阈值直接输出0高于阈值再按比例映射这样电机启停会更干脆。后面的代码示例里我会给出具体实现。3. 从零到一完整接线与PWM调速实操3.1 接线一张表电机、电源、控制信号全对照以最常见的双电机小型智能小车底盘为例两个电机分别叫M_A左和M_B右接线方式如下L298N端子接往哪里说明OUT1、OUT2左电机两个引脚方向由IN1、IN2决定正反接无所谓软件里可以交换OUT3、OUT4右电机两个引脚同上12V端子电池正极建议7.4V~12V电机主供电GND端子电池负极并同时接到Arduino GND共地关键点5V端子Arduino 5V引脚可选但推荐逻辑供电保证模块状态稳定ENAArduino引脚5PWM调速左电机ENBArduino引脚6PWM调速右电机IN1Arduino引脚7左电机方向控制IN2Arduino引脚8左电机方向控制IN3Arduino引脚9右电机方向控制IN4Arduino引脚10右电机方向控制注意我把两个PWM引脚放在5、6上这两个引脚在Uno上的PWM频率都是490Hz左右对称不会出现一侧声音比另一侧尖的情况。如果你用3、11也可以但两侧频率不同会导致同样的PWM值对应的实际速度有细微差别。3.2 PWM调速代码从正反转到占空比控制下面这段代码实现双电机独立正反转和速度控制我把死区处理也写进去了可以直接照着用。// 定义引脚 #define ENA_PIN 5 #define ENB_PIN 6 #define IN1_PIN 7 #define IN2_PIN 8 #define IN3_PIN 9 #define IN4_PIN 10 // 电机死区阈值低于这个PWM值电机不转 // 具体数值跟电机和供电电压有关可自行调整 #define PWM_DEAD_ZONE 60 void setup() { pinMode(IN1_PIN, OUTPUT); pinMode(IN2_PIN, OUTPUT); pinMode(IN3_PIN, OUTPUT); pinMode(IN4_PIN, OUTPUT); pinMode(ENA_PIN, OUTPUT); pinMode(ENB_PIN, OUTPUT); // 初始停止 digitalWrite(IN1_PIN, LOW); digitalWrite(IN2_PIN, LOW); digitalWrite(IN3_PIN, LOW); digitalWrite(IN4_PIN, LOW); analogWrite(ENA_PIN, 0); analogWrite(ENB_PIN, 0); } // 左电机控制 // speed范围-255~255正数正转负数反转0停止 void setMotorA(int speed) { if (speed 0) { digitalWrite(IN1_PIN, HIGH); digitalWrite(IN2_PIN, LOW); } else if (speed 0) { digitalWrite(IN1_PIN, LOW); digitalWrite(IN2_PIN, HIGH); } else { digitalWrite(IN1_PIN, LOW); digitalWrite(IN2_PIN, LOW); } int pwmValue abs(speed); if (pwmValue PWM_DEAD_ZONE) { pwmValue 0; } analogWrite(ENA_PIN, pwmValue); } // 右电机控制逻辑同上 void setMotorB(int speed) { if (speed 0) { digitalWrite(IN3_PIN, HIGH); digitalWrite(IN4_PIN, LOW); } else if (speed 0) { digitalWrite(IN3_PIN, LOW); digitalWrite(IN4_PIN, HIGH); } else { digitalWrite(IN3_PIN, LOW); digitalWrite(IN4_PIN, LOW); } int pwmValue abs(speed); if (pwmValue PWM_DEAD_ZONE) { pwmValue 0; } analogWrite(ENB_PIN, pwmValue); } void loop() { // 左电机全速正转 setMotorA(255); // 右电机半速反转 setMotorB(-128); delay(3000); // 刹车停止 setMotorA(0); setMotorB(0); delay(2000); }这段代码的核心逻辑很简单方向由IN引脚的高低电平组合决定速度由ENA/ENB上的PWM占空比决定。刹车和滑行是两回事把IN1和IN2都拉低电机相当于断路会靠惯性滑行如果你想快速刹车可以把IN1和IN2都拉高L298N内部的H桥会形成制动回路电机会立刻停下来不过对机械结构和驱动模块的冲击也更大。3.3 顺手做个双电机差速转向智能小车版做智能小车绕不开差速转向原理不复杂左轮和右轮速度不一样车就会转向。最简单的差速实现是这样的设定一个基础速度baseSpeed转向时左轮和右轮在这个基础上加减一个turn值。比如小车需要左转左轮减速、右轮加速车头就会往左偏。更激进一点可以让左轮反转、右轮正转小车就能原地转圈适合狭窄空间掉头。// 基础速度 int baseSpeed 150; // 转向增量 int turnSpeed 80; // 直行 void goForward() { setMotorA(baseSpeed); setMotorB(baseSpeed); } // 左转左慢右快 void turnLeft() { setMotorA(baseSpeed - turnSpeed); setMotorB(baseSpeed turnSpeed); } // 右转左快右慢 void turnRight() { setMotorA(baseSpeed turnSpeed); setMotorB(baseSpeed - turnSpeed); } // 原地左转两轮反向 void pivotLeft() { setMotorA(-baseSpeed); setMotorB(baseSpeed); }这里有一个经验点两个电机的个体差异会造成直行跑偏。哪怕你给两个电机相同的PWM值实际转速也可能差出10%到20%因为电机的绕组电阻、碳刷摩擦、轮子阻力都不一样。解决思路有两种一种是在代码里做速度校准给左右轮设置不同的基础偏移量另一种是给电机加上编码器用闭环PID控制那是更高阶的玩法但底层控制逻辑仍然是L298N加PWM这套东西。4. 上电前必查清单与排查技巧4.1 三分钟快速排查表我在帮别人看L298N问题时基本按照下面这张表逐项排查大部分问题三分钟内能定位。这里整理出来你调试的时候可以直接对照现象可能原因排查方法上电后模块完全不工作逻辑电源没接或接反测量5V端子对GND电压确认有5V电机全速转PWM无效ENA/ENB跳帽没拔检查跳帽拔掉后重新测试电机只会一个方向转IN1/IN2接线或程序逻辑问题检查IN引脚电平组合是否正确电机不动但有嗡嗡声电机电源电压过低或电流不够用万用表量电机两端电压确认在额定范围内一启动Arduino就重启共地不良或电源跌落检查GND连接电机电源加电容控制电源分开电机速度不均匀一顿一顿PWM死区未处理或频率不合适按上文代码添加死区阈值模块发热严重电流超过L298N承受范围换大功率驱动模块或加散热片电机反转不受控控制信号没有参考地检查Arduino GND与L298N GND是否连通这里面最值得多说一句的是模块发热。L298N本身压降大2A电流时功率损耗可能到5W以上发热是正常的但如果你发现模块烫到不能用手摸那就要考虑电流是不是太大了。解决办法要么换低内阻的MOS管驱动模块比如后面会讲的TB6612要么给L298N加装散热片并做好通风。4.2 实测中遇到的特殊现象和原因这里面有几个现象比较冷门但碰到了会特别头疼我单独拎出来讲。第一个是电机反转比正转慢。这个现象很多人会怀疑是代码问题但实际上是电机本身的结构造成的。直流电机内部碳刷和换向器的接触电阻在正反两个方向上有细微差别加上L298N内部两个达林顿管对的饱和压降不完全对称导致正反转的等效电压不同。如果你的项目对正反转对称性要求比较高最好的办法是在代码里做标定分别测出正转和反转的最小PWM和速度曲线然后做补偿。第二个是电机线太细导致的不稳定。有些卖家配的电机线只有0.2平方毫米电流一大线上就有压降如果你把电机线拉得很长线损会非常明显。我量过一次两根30厘米的细杜邦线在1A电流下能吃掉0.4V电压这是不小的损耗在小电压供电系统里足够让电机没力气。电机线尽量用粗一点的硅胶线越短越好。第三个是PWM频率和电机啸叫的问题。L298N工作在490Hz时人耳能听到明显的嗡嗡声这是PWM方波里包含的高次谐波和电机电感的机械共振共同造成的属于正常现象。如果你觉得吵可以考虑用TimerOne库把PWM频率提高到20kHz以上超出人耳听觉范围。不过要注意L298N的达林顿管开关速度有限频率太高会导致开关损耗急剧上升模块发热更严重而且普通直流电机对20kHz响应的改善也有限所以大多数情况下保持默认即可。5. L298N和TB6612怎么选从实际项目出发的思考5.1 参数对比很多人在选驱动模块时会在L298N和TB6612之间纠结我把两者的核心参数放在一起做个对比帮你快速做决策对比项L298NTB6612FNG驱动芯片达林顿管H桥MOSFET H桥最大持续电流2A/路1.2A/路导通压降约2V~3.6V约0.5V~0.8V最低工作电压4.5V2.7VPWM支持支持支持发热情况较高大电流需要散热较低接线复杂度偏高需要跳帽处理较低引脚清晰价格便宜稍贵5V输出部分版本有无适合场景大电流、入门学习、皮实耐造电池电压低、效率敏感的小车单看参数的话TB6612在效率、体积、发热上全面占优尤其是对2S锂电池供电的小车来说L298N那2V以上的压降会让本来就捉襟见肘的电压雪上加霜。但TB6612的电流上限只有1.2A超过这个值模块就可能过热甚至烧毁如果你用的是大功率电机L298N反而更合适。5.2 我的选型建议我的建议是分场景对待。如果你做的是学习型项目不追求续航和体积手头的电机也是普通的N20或者TT马达那就无脑用L298N皮实、便宜、资料多就算接错了也不容易烧L298N芯片十几块钱一片换起来不心疼。如果你做的是比赛小车、长时间运行的项目用的是2S锂电池电机额定电流在1A以下那就用TB6612效率高、发热小、体积也紧凑。我自己实际做项目时两种模块都在用。桌面测试和课程设计用L298N功耗和体积不那么敏感调试起来直观做需要长时间跑的小车时换TB6612同样的电池能让续航多出一截。这里面的逻辑不是哪个更好而是哪个更适合你的场景把压降、电流、体积这几个因素放在一起权衡之后结论自然就出来了。顺带提一句还有人会用分立元件搭H桥或者用继电器正反转前者适合学习功率电子后者只适合开关频率极低的场合完全不适合PWM调速这里就不展开了。6. 最后分享一个我坚持了多年的习惯每次上电之前我都会用万用表快速测三处电压电池输出端、L298N的5V端子、电机供电端OUT1和OUT2之间。三处电压只要正常基本可以确认电源链路没有问题然后再用极短的测试程序验证每个引脚的动作。这个习惯了养成之后我几乎再没有遇到过烧模块的事排查问题的时间也大幅缩短。刚开始玩Arduino的时候我也经历过电机飞车、模块冒烟、代码改了又改还是不明白为什么的狼狈阶段。现在回头看大部分问题都不是“难”而是细节上没有想清楚地线有没有共跳帽有没有拔电压够不够引脚是不是PWM脚就这么简单。如果你照着这篇文章能一次把L298N跑通那这字就写得值了。
返回列表