4、直流电机驱动:H桥原理、L298N/L9110S驱动芯片、PWM调速、正反转控制

好,咱们今天聊聊直流电机驱动。这玩意儿在嵌入式里太常见了,小到玩具车,大到工业机械臂,背后都离不开它。我刚开始做项目那会儿,也在这上面栽过跟头,烧过芯片,也烧过电机。今天就把这些经验掰开揉碎了讲给你听。

4.1 H桥原理:说白了就是四个开关

直流电机怎么正反转?你想想看,电机两端加正向电压就正转,反向电压就反转。那怎么实现反向电压呢?H桥就是干这个的。

H桥这个名字很形象,四个开关管(通常是MOSFET或三极管)摆成"H"形,电机在中间横杠上。四个开关分别叫Q1、Q2、Q3、Q4,位置是左上、右上、左下、右下。

工作模式其实就三种:

  • 正转:Q1和Q4导通,Q2和Q3关断。电流从电源正极→Q1→电机→Q4→地。电机正转。
  • 反转:Q2和Q3导通,Q1和Q4关断。电流从电源正极→Q2→电机→Q3→地。电机反转。
  • 刹车:Q1和Q3导通(或Q2和Q4导通),电机两端短路,利用反电动势快速制动。

关键点:绝对不能让Q1和Q2同时导通,也不能让Q3和Q4同时导通。否则电源直接短路,瞬间冒烟。我管这叫"直通",是新手最容易犯的错误。

⚠️ 我曾经在调试一个四轴飞行器时,代码里有个逻辑漏洞,导致上下桥臂同时导通。电源指示灯瞬间熄灭,MOS管直接炸裂,还带出一股青烟。从那以后,我写H桥控制代码都会加死区时间,哪怕只有几微秒。

4.2 L298N驱动芯片:经典但有点"粗犷"

L298N是个老将了,ST公司出品,双H桥,能驱动两个直流电机或一个步进电机。我大学做智能车比赛时用的就是它,皮实耐造。

它的核心参数:

参数 数值 备注
工作电压 4.5V - 46V 范围很宽
最大输出电流 2A(峰值3A) 实际建议1.5A以下
逻辑电压 5V 兼容3.3V需注意
通道数 2路 可独立控制

L298N的引脚其实不复杂。每个H桥有使能端(ENA/ENB)和两个输入脚(IN1/IN2、IN3/IN4)。使能端接PWM就能调速,输入脚控制方向。

控制逻辑是这样的:

  • ENA=1, IN1=1, IN2=0 → 电机A正转
  • ENA=1, IN1=0, IN2=1 → 电机A反转
  • ENA=0 → 电机A停止(高阻态)

💡 个人习惯:我一般把使能脚接PWM,输入脚接普通IO。这样调速和方向分开控制,代码逻辑更清晰。另外,L298N的压降比较大(约2V),如果电池电压低,电机可能转不动。我建议供电电压至少比电机额定电压高2-3V。

下面是个简单的Arduino控制代码:

// L298N 控制直流电机
#define ENA 9   // 使能A,接PWM
#define IN1 8   // 方向控制1
#define IN2 7   // 方向控制2

void setup() {
  pinMode(ENA, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
}

void loop() {
  // 正转,50%速度
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  analogWrite(ENA, 128);  // 0-255,128约50%
  delay(2000);

  // 反转,75%速度
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  analogWrite(ENA, 192);
  delay(2000);

  // 停止
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  analogWrite(ENA, 0);
  delay(2000);
}

4.3 L9110S驱动芯片:小身材,大能量

L9110S是国产芯片,合泰出品。它比L298N小得多,SOP-8封装,但驱动能力也不弱。我最近做的小型机器人项目都在用这个,性价比很高。

它的参数:

参数 数值 备注
工作电压 2.5V - 12V 低压也能工作
最大输出电流 800mA(峰值1.5A) 适合小型电机
逻辑电压 2.5V - 5V 3.3V直接兼容
通道数 2路 双H桥

L9110S的控制方式更简单。每个通道只有两个输入脚(IA/IB),没有单独的使能脚。控制逻辑:

  • IA=1, IB=0 → 正转
  • IA=0, IB=1 → 反转
  • IA=0, IB=0 → 停止
  • IA=1, IB=1 → 刹车

注意:L9110S没有独立的PWM使能脚。调速怎么办?其实很简单,直接对IA或IB脚输入PWM信号就行。比如正转时,IA接PWM,IB拉低。PWM占空比越大,转速越快。

代码示例:

// L9110S 控制直流电机
#define IA 5   // 接PWM
#define IB 6   // 接普通IO

void setup() {
  pinMode(IA, OUTPUT);
  pinMode(IB, OUTPUT);
}

void loop() {
  // 正转,逐渐加速
  for (int speed = 0; speed <= 255; speed += 5) {
    analogWrite(IA, speed);
    digitalWrite(IB, LOW);
    delay(50);
  }

  // 反转,逐渐加速
  for (int speed = 0; speed <= 255; speed += 5) {
    digitalWrite(IA, LOW);
    analogWrite(IB, speed);
    delay(50);
  }
}

4.4 PWM调速:占空比决定一切

PWM调速,说白了就是快速开关电源,让电机"吃"到平均电压。占空比越高,平均电压越高,转速越快。

频率选择有讲究。我一般遵循这个原则:

  • 低频(几十Hz):电机噪音大,会"嗡嗡"响,但扭矩大。适合大惯性负载。
  • 中频(几百Hz到1kHz):平衡点,噪音和扭矩都适中。我大部分项目用500Hz。
  • 高频(几kHz以上):噪音小,但开关损耗大,驱动芯片容易发热。适合精密控制。

💡 我建议:对于普通直流电机,PWM频率选在500Hz到2kHz之间。太低会听到明显噪音,太高驱动芯片发热严重。你可以用示波器看看电机电流波形,调到一个平滑又不烫手的频率。

4.5 正反转控制:别让电机"打架"

正反转控制看起来简单,但实际项目中容易出问题。我遇到过最典型的情况是:电机在正转和反转切换时,由于惯性,电流会瞬间反向,产生很大的反电动势。

这个反电动势如果不处理,轻则让单片机复位,重则烧毁驱动芯片。怎么办?

  • 加续流二极管:L298N和L9110S内部都有,但外部最好再加一组肖特基二极管,比如SS34。
  • 加死区时间:切换方向时,先让所有开关关断几毫秒,等电流衰减后再切换。代码里加个delay(5)就行。
  • 加电容:在电机电源两端并联一个100μF电解电容,吸收尖峰电压。

⚠️ 我曾经在做一个自动窗帘项目时,电机正反转切换太频繁,结果L298N的使能脚被反电动势打坏了。后来加了死区时间和续流二极管,问题才解决。记住,电机是感性负载,电流不能突变,切换方向时一定要给电流一个"泄放"的路径。

4.6 实战建议:选型与布局

最后给几个实战建议,都是我用真金白银换来的经验:

  • 小电流(500mA以下):用L9110S,便宜又小巧,适合玩具、小风扇。
  • 中电流(1-2A):用L298N,皮实耐造,适合智能车、小型机器人。
  • 大电流(2A以上):别用集成芯片了,自己搭分立H桥,用IRF520之类的MOSFET。
  • 电源布线:电机驱动是大电流回路,电源线要粗,地线要短。别和信号线走一起,否则干扰大。
  • 散热:L298N最好加散热片,我见过有人用L298N驱动两个电机连续工作,半小时后芯片烫得能煎鸡蛋。

嗯,今天就聊到这儿。直流电机驱动看起来简单,但细节不少。你动手做一次,烧一两个芯片,就什么都明白了。下次咱们聊聊步进电机,那个更有意思。