PMOS驱动详解:3.3V GPIO为何关不断12V负载开关?
做硬件的人迟早会遇到这个场景:用单片机的 GPIO 去控制一个 PMOS 做 12V 负载开关,软件里把引脚置高,心想“3.3V 是高电平,PMOS 是 P 沟道,高电平应该关断”。结果上电一看,负载一直通电,把引脚拉低也一样,好像 PMOS 根本没被控制住。问题不在管子坏了,也不在代码写反了,而在你对“高电平”的理解少了一个关键参考点:PMOS 导通和关断,看的从来不是栅极对地有多高,而是栅极和源极之间的电压 Vgs。源极接 12V 时,3.3V 的栅极电压实际让 Vgs 等于 3.3V 减 12V,也就是 -8.7V。常见 PMOS 的开启阈值在 -1V 到 -4V 左右,-8.7V 早就处于深度导通状态,怎么可能关得掉。
这篇文章适合正在写低边开关、高边开关、电池保护、防反接电路的人。我会把原理、正确驱动电路、电阻取值和排查顺序一次讲清楚,尽量让你看完就能照着改。
1. 先搞清 PMOS 到底看哪个电压
1.1 导通条件是 Vgs,不是 Vg
先拉一个最简单的结论。NMOS 和 PMOS 的区别,网上天天有人搜,但真正用得上的差异只有几点:
- NMOS:栅极电位比源极高出一个阈值电压 Vth,管子导通。
- PMOS:栅极电位比源极低一个阈值电压,管子导通。
所以 PMOS 的 Vgs 阈值通常是个负数。datasheet 上常见写法是 Vgs(th) = -2V,意思是栅极要比源极低 2V 以上,导通才明显;要让管子彻底关断,Vgs 应该回到 0V 附近,或者比阈值更“浅”。
判断开关状态只有一个公式:
Vg 是栅极对地电压,Vs 是源极对地电压,两者都以同一个 GND 为参考。不要上手就直接看 Vg,更不要只看 GPIO 输出的高电平。这个公式虽然简单,但能解释掉绝大多数 PMOS 关不掉的问题。
1.2 3.3V 对 12V 源极来说,是负方向 8.7V
回到题目的场景。PMOS 做高边开关,源极接 +12V,漏极接负载,负载另一端接地。MCU 的 GPIO 输出 3.3V,这个 3.3V 是相对于公共地 GND 说的。
那么:
Vg = 3.3V
Vs = 12V
Vgs = 3.3V - 12V = -8.7V
如果是 Vth = -2V 的管子,-8.7V 比开启阈值深得多,管子不仅导通,而且是完全导通状态。换句话说,3.3V 这个“高电平”对于 12V 的源极来说,非但不是高电平,反而是往导通方向又推了一把。
正确的做法是让栅极电位接近源极电位,也就是把栅极抬到 12V 左右,Vgs≈0,PMOS 才真正关断。
用表格看更直观。假设 Vth=-2V,源极固定 12V:
| 栅极对地 Vg | Vgs = Vg - Vs | 状态 |
|---|---|---|
| 0V | -12V | 深度导通 |
| 3.3V | -8.7V | 深度导通 |
| 9V | -3V | 接近临界,半导通 |
| 10V | -2V | 临界 |
| 11V | -1V | 基本关断 |
| 12V | 0V | 完全关断 |
注意:表里的“半导通”状态非常坑。Vgs 落在阈值附近时,PMOS 的导通电阻 Rds(on) 很大,管子既不当开关,也不当完全截止,电流照常过,功耗却全烧在管子上。用手摸一下外壳烫手,基本就是这种情况。
1.3 高电平的参考系和 PMOS 的参考系不一样
MCU 说 GPIO 输出高电平,参考点是 MCU 自己的地,也就是整个电路的 GND。PMOS 说“你要关断我”,参考点却是它的源极。源极在 12V 上时,两个参考系差了整整 12V。
这个电压域错位是很多初学者第一次接触“电平转换”概念的起点。3.3V 的单片机要控制 12V 域里的 PMOS,不能直接把 GPIO 接到栅极,必须先把 3.3V 的逻辑电平转换成一个“能跟随 12V 源极”的栅极驱动信号。最简单的办法,就是后面要讲的 NPN 或 NMOS 反相驱动。
2. 直接拿 GPIO 推栅极,为什么两种电平都关不掉
2.1 直连电路逐个状态过一遍
先把一个错误接法摆出来:PMOS 源极接 12V,栅极直接连 GPIO,漏极接负载到地。
GPIO 输出高电平 3.3V,Vgs=-8.7V,PMOS 导通。GPIO 输出低电平 0V,Vgs=-12V,PMOS 导通得更彻底。GPIO 复位期间变成高阻输入,栅极浮空,电位不定,PMOS 可能开、可能关、可能半开,完全取决于漏电流和走线寄生。
也就是说,只要源极一直挂在 12V 上,你用 0V 和 3.3V 两个普通逻辑电平去推栅极,得到的全是负的 Vgs,PMOS 只会一直导通。这不是写反逻辑能解决的,是驱动方式本身就不成立。想通过软件把引脚电平换来换去来“找感觉”,方向就错了。
2.2 栅极加一个到 12V 的上拉,能救吗
有人会想,那我给栅极加一个到 12V 的上拉电阻,GPIO 输出高阻的时候栅极不就被拉到 12V、Vgs≈0,从而关断了吗?
思路是对的,但这里有个隐患:如果 GPIO 不是高阻,而是主动输出低电平或高电平,结果会变成:
| GPIO 状态 | 栅极节点电压 | Vgs | PMOS |
|---|---|---|---|
| 输出低 0V | 被钳在 0V | -12V | 导通 |
| 输出高 3.3V | 被钳在 3.3V | -8.7V | 导通 |