
看完这篇你会明白:芯片的引脚为什么没法自己开关一盏灯。答案是一小块额外电路,它让微弱的信号能控制大东西。
单片机(跑你项目的那块小电脑)的引脚只会说“高”或“低”。LED 灯板、电机、电磁阀要的是完全不同的电压,还有几十倍的电流。夹在中间做翻译的那部分电路,叫驱动电路。
GPIO 的本质
GPIO 是“通用输入输出”的缩写,指芯片上一个既能当输入、也能当输出的引脚。当输入就用来读外面的电压,当输出就往外送高或低电平。高电平大约 3.3V,低电平大约 0V。
要注意的是电流。GPIO 送的是信号,不是电力,大概只能给出 20mA。
MOSFET 本质:电压控制型电子开关
MOSFET 是一个有三个引脚、没有活动部件的开关。你不用给它灌电流,只要在其中一个引脚上加电压,开关就通了。这个引脚叫栅极,也就是 Gate。
单片机之所以能直接驱动它,就是因为只需要给电压。电流由另外一路电源提供:从漏极 Drain 进来,穿过负载,从源极 Source 出去。
所以控制信号和负载电流走的是两条路,它们在源极汇合,而源极和单片机共用同一个地。这不等于隔离。正因为共地,3.3V 的信号才能控制这个开关。真正的隔离要靠光耦或者继电器,后面会讲。
三个引脚分别做什么
| 引脚 | 名称 | 作用 |
|---|---|---|
| G | Gate | 控制输入,几乎无持续电流 |
| D | Drain | 接负载,承载工作电流 |
| S | Source | 电流返回端(NMOS通常接GND) |
记住这三个名字就够了:你控制的是栅极,干活的是漏极到源极这条通路。
为什么 MCU 不能直接驱动 LED?
12V 的灯板要 24W,也就是 2A。而 GPIO 只有 3.3V 下的 20mA,电流差一百倍,电压也不对。
把灯板直接接到引脚上,引脚就撑不住电平,电压会被拉垮,芯片发热。所以要把活分开干:MCU 决定什么时候开关,另一路电源出电流,MOSFET 负责把两边接起来。
NMOS 与 PMOS
MOSFET 有两种极性,这两个名字只是在说开关放在电路的哪一侧。
NMOS:开关放在地这一侧
12V
│
LED
│
NMOS
│
GND
NMOS 接在负载和地之间。它的栅极以地为参考,正好和单片机用的是同一个地,所以 3.3V 的引脚就能直接把它打开。
PMOS:开关放在电源这一侧
12V
│
PMOS
│
LED
│
GND
PMOS 接在电源和负载之间。要打开它,栅极得被拉到比电源更低,也就是要升到接近 12V,3.3V 的引脚够不着。所以我一开始不推荐用它。
PWM 调光
PWM 是“脉冲宽度调制”的缩写。它不改变电压,而是让负载飞快地全开、全关,再改变每次“开”持续多久。平均功率跟着这个比例走,灯看起来就亮一些或者暗一些。
切换速度必须快过眼睛的反应。每秒大约 200 次以上,LED 看上去就是稳定发光的,Arduino 默认的每秒 490 次远在这之上。
太慢会看到闪烁,或者听到电机啸叫。太快则 MOSFET 每个周期有一段时间停在半开状态,这些会变成热。
为什么需要续流二极管?
这一节说的是任何带线圈的东西:电机、风扇、电磁阀、继电器线圈。
线圈通电时会把能量存在磁场里。MOSFET 一关断,磁场就塌缩,反着推出一记电压尖峰,可以是电源电压的好几倍,足以打坏 MOSFET。
办法是在线圈两端并一颗二极管。二极管是电流的单向阀。平时它挡住,只在尖峰来时导通。储存的能量就顺着这条回路放掉。
LED 不是线圈,所以不需要这一颗。
MOS vs 三极管(NPN/PNP)
| 项目 | BJT(NPN/PNP) | MOSFET |
|---|---|---|
| 控制方式 | 电流控制 | 电压控制 |
| 输入阻抗 | 低 | 极高 |
| GPIO持续供电 | 需要 | 几乎不需要 |
| 发热 | 较高 | 较低 |
| 高频PWM | 一般 | 非常适合 |
| 大电流 | 一般 | 优秀 |
三极管是更老的一种晶体管,它靠电流开关,不靠电压。只要你想让它保持导通,就得一直往基极灌电流,这部分电流最后变成热。NPN 和 PNP 就是它的两种极性。
MOSFET 靠电压开关。栅极充好电之后几乎不吃电流,所以单片机几乎不花代价就能让它一直开着。三极管在模拟电路里还有位置,那里电流特性正是它要的东西。
继电器 vs MOS
| MOS | 继电器 |
|---|---|
| 无机械触点 | 有机械触点 |
| 可PWM | 不可PWM |
| 高速 | 较慢 |
| 寿命长 | 有机械寿命 |
| 静音 | 有吸合声 |
| 适合DC | AC/DC均可 |
继电器不是半导体,而是一个机械开关:一小段线圈把一个金属触点吸合。所以它既能开关直流也能开关交流,而且断开时中间是真正的物理间隙,电流漏不过去。
要开关市电交流、要那个物理间隙、或者两侧必须完全分开时,我用继电器。要开关 LED、电机、风扇这类直流负载,并且想要快速、安静、能 PWM 时,我用 MOSFET。
光耦:需要真正的电气隔离时用
光耦用光来传信号。里面一颗小 LED 和一颗光敏元件隔空相对,两侧之间没有任何导线相连。
这就是它在市电旁边安全的原因。3.3V 的单片机可以开关市电设备,而市电那一侧没有导电通路能回到单片机。两侧也就不会共用一个地。
常见的链路是:MCU 引脚、限流电阻、光耦、驱动级,最后是市电负载。
工业产品应用:分析框架
拆开一个产品、想看懂它的功率部分时,我按这个顺序看:
- 电源从哪里进入?
- 哪些是大功率负载?
- 谁负责驱动(MOS/继电器)?
- MCU 如何控制(GPIO/PWM)?
- 有没有保护(续流二极管、电压钳位、保险丝、光耦)?
LED 灯、RGB 灯带、风扇、水泵,基本都是这个套路。
设计注意事项:我踩过的坑
选一个在 3.3V 下就能完全导通的 MOSFET。 很多管子是按 10V 控制信号设计的,3.3V 下只开一半。半开的开关就相当于一个电阻,而电阻上过 2A 会发烫。你要的那种,市面上叫“逻辑电平”。
不要让栅极悬空。 在栅极和地之间接一颗 10kΩ 电阻。否则单片机不驱动它的时候,栅极电压是不确定的,开关可能半开,白白发热。
在栅极前面串一颗小电阻,10~100Ω。 栅极有点像一个小电容,每次翻转都会涌一股电流,这颗电阻把那股电流挡在引脚之外。
感性负载必须加续流二极管。 见上面那节,不能省。
把地接在一起。 单片机的地和电源的地必须直接相连。没有共同参考点,栅极电压就无从谈起,开关根本不会通。这是新手最容易栽的地方。真需要两侧完全分开,就用光耦。
下面这些等你熟练之后再看:
- 选 MOSFET 主要是比数据手册上的四个数:栅极阈值电压、导通电阻、最大电流、最大耐压。
- 续流二极管,小继电器线圈用 1N4148,电流大就用 SS14。
