很多年以前我刚接触数字电路的时候,一直没搞明白一个问题:同样是作为输出级,为什么有些芯片引脚可以又拉高又拉低,有些却只能拉低,高电平还得靠外部电阻“帮忙”。后来跟着项目调了一块I2C接口的传感器板子,才真正把MOS管、推挽输出、开漏输出这几个概念串到一起。回头再看,这东西其实不难,难的是没有人把从“管子怎么导通”到“实际波形长什么样”这条线完整地讲通。这篇文章我就用最直白的方式,把手把手带你把推挽和开漏(OD/OC)这两种输出结构从原理到仿真完整过一遍,全程用Multisim搭电路验证,保证你看完能自己动手复现。
1. 先花10分钟把MOS管当开关这件事彻底想明白
1.1 为什么讲输出结构之前必须先聊MOS管
推挽和开漏这两种结构,说白了就是MOS管的两种不同接法。很多新手上来就看电路图,看到两个管子一上一下就说这是推挽,看到一个管子漏极空着就说这是开漏,但真要问他“为什么这么接能行”,他就卡住了。问题出在根基没打牢,MOS管最基本的开关特性没吃透。
MOS管有3个极:栅极(G)、漏极(D)、源极(S)。在输出结构里,你完全不需要关心放大区那套静态工作点的计算,只用关心一件事:怎么让它在“导通”和“截止”两种状态之间切换。
对于增强型NMOS,判断标准就一条:Vgs大于阈值电压Vth时导通,否则截止。这里的Vgs是栅极相对源极的电压,注意是相对源极,不是相对地。很多人画电路时习惯默认源极接地,就忽略了这一点,一旦管子用在高端驱动或者电平转换电路里,立马翻车。
PMOS的判断逻辑正好反过来:Vgs小于阈值电压(Vth通常是负值)时导通,否则截止。也就是说,要让PMOS导通,栅极电压要比源极电压低至少|Vth|那么多。
1.2 把MOS管当理想开关看,电路分析会轻松十倍
在实际输出结构分析中,我强烈建议你先把MOS管等效成一个单刀开关来看,等理解了整体逻辑再用导通电阻、寄生电容这些参数去修正细节。
- 导通时:相当于开关闭合,D和S之间有一个很小的导通电阻(称为Rds(on))
- 截止时:相当于开关断开,D和S之间基本是绝缘的
为什么要这么简化?因为推挽和开漏这两种结构的核心逻辑,就是“谁把输出节点接到电源,谁把输出节点接到地,或者谁都不接”。你只要把每个MOS管看成开关,拿到任何一张输出电路图都能在5秒内说出它的工作逻辑。
举个例子,一个典型的推挽输出级,上面是PMOS,下面是NMOS。你想让输出为高时,PMOS导通把输出点接到VCC,NMOS截止;想让输出为低时,NMOS导通把输出点接到GND,PMOS截止。这不就是两个开关交替闭合和断开吗?
1.3 补充一个关键细节:MOS管的体二极管
分析输出结构时还有一个容易忽略的元件——体二极管(寄生二极管)。MOS管的D和S之间天然存在一个二极管,方向因管子类型而异。
这个体二极管在某些应用里是隐患,比如H桥电路里如果你不处理它,关断时感性负载的电流会通过体二极管形成通路,导致关不断。但在推挽和开漏结构里,它通常会帮倒忙,因为它会让电流在管子截止时也能单向流过。所以实际芯片内部的输出级,往往会做特殊处理,或者外部电路要提前考虑到这一点。
2. 推挽输出:一个管子往上推,另一个管子往下拉
2.1 从“能灌能拉”这个需求引出推挽结构
数字电路输出高电平就是给负载提供电流,这个能力叫拉电流(sourcing current);输出低电平就是从负载吸收电流,这个能力叫灌电流(sinking current)。
最简单的单管输出,比如一个NMOS下拉、外部上拉电阻抬高的电路,你会发现它的拉电流能力很差,因为拉电流全靠上拉电阻提供,电阻稍微大点,高电平就被拉垮了。而推挽结构天生就是为了同时解决“拉得动”和“灌得进”这两个问题。
推挽输出级的形式是这样的:PMOS管接在VCC和输出节点之间,NMOS管接在输出节点和GND之间。两个栅极接到一起作为输入端。这里需要特别注意,PMOS的源极接VCC,NMOS的源极接地,这就是为什么前面强调Vgs是相对源极的,因为两个管子的源极电压完全不同。
2.2 推挽的完整工作过程:高低电平切换
假设VCC=5V,两个管子都选阈值电压1V的型号。输入信号Vin=5V时:NMOS的Vgs=5V减去源极0V,大于1V,导通;PMOS的Vgs=5V减去源极5V,等于0V,PMOS的Vgs不满足“小于负阈值”的条件,截止。输出节点被NMOS直接拉到接近0V。
输入信号Vin=0V时:NMOS的Vgs=0V,截止;PMOS的Vgs=0V减去源极5V,等于-5V,远小于-1V,导通。输出节点被PMOS拉到接近VCC。
发现没有,无论输入是高还是低,总有一个管子处于导通状态,输出节点要么被“推”上去,要么被“挽”下来,所以叫推挽。这种情况下,输出阻抗非常低,驱动能力强,这就是为什么单片机GPIO、运算放大器输出级、电源芯片的驱动级都用推挽结构。
2.3 交越失真:推挽结构最经典的坑
推挽结构有一个绕不开的问题,就是交越失真。上面分析时我故意理想化了——假设“只要Vgs等于0V,PMOS就立刻完全截止”,但实际情况没这么干净。
MOS管的转移特性不是阶跃的,而是有一个渐变区域。当输入电压正好在中间附近时,PMOS的Vgs可能还没达到完全导通的负阈值,NMOS的Vgs又已经超过正阈值了,或者反过来。说白了,存在一个输入的小区间,在这个区间里两个管子的导通程度都不够,输出波形在过零点附近会变得平缓甚至出现平台,和理想输入信号相比就产生了失真。
在音频功放这种模拟应用里,交越失真是大问题,所以会有甲乙类放大器这种加静态偏置的解法。在数字信号传输里,信号边沿变缓会导致时序裕量下降,严重时会在高速通信中产生误码。
2.4 推挽结构的另一个隐患:绝对不能让两个管子同时导通
推挽电路的死区问题比交越失真更致命。如果驱动信号在切换瞬间出现PMOS还来得及关断、NMOS已经导通的窗口,那结果就是VCC通过两个管子的导通电阻直接对地短路,瞬间电流可以大到烧毁芯片,这个现象叫穿通(shoot-through)。
实际芯片在设计驱动电路时,都会在切换瞬间加入死区时间,确保一个管子完全关断后再打开另一个。你在Multisim里做纯数字仿真时可能看不到这个问题,因为理想模型切换是瞬时的,但真实器件一定有切换时间,这点必须心里有数。
2.5 推挽结构的应用边界
推挽输出在绝大多数场景是好用的,但有一条硬限制:它不能直接并联使用。推挽输出天然是“强驱动”的,如果两个推挽输出引脚直接连在一条线上,一个想输出高电平,另一个想输出低电平,两个管子会直接对拉,轻则逻辑错误,重则烧毁IO。这就是为什么多设备共享一条总线的场景,几乎都选择开漏结构。
3. 开漏输出:我漏极开路,高电平你自己想办法
3.1 开漏结构到底长什么样
开漏(Open Drain)结构比推挽简单得多,核心就一个NMOS管,漏极直接作为输出引脚,什么都不接。如果对应双极型三极管,就是集电极开路,叫Open Collector,原理完全一样。
这个结构的一个关键点是:开漏输出本身根本没有拉高能力,高电平全部由外部上拉电阻提供。这听起来像是缺陷,但恰恰是它最大的优势。
运用前面说的“MOS管当开关”思维:开漏输出只有两种状态,NMOS截止时,输出引脚悬空,电位全靠外部电路决定;NMOS导通时,输出引脚被拉到地。你如果什么都不接,这个引脚读到的就是随机电平,毫无意义。所以开漏输出必须配合一个上拉电阻使用,电阻一端接电源,一端接输出引脚。
3.2 上拉电阻的值怎么选,为什么是4.7k和10k用得最多
上拉电阻的取值直接关系两个指标:功耗和信号边沿速度。
当NMOS导通时,电流路径是VCC→上拉电阻→NMOS→GND。假设上拉电阻用1k,VCC=5V,导通时就有5mA电流从电阻流过,这个电流本身不产生任何功能,纯粹是损耗。10k电阻对应的电流只有0.5mA,功耗就小得多。
当NMOS截止时,等效于VCC通过上拉电阻对总线上的寄生电容(Cbus)充电。阻值越大,充电时间常数τ=R×C越大,信号沿越慢。I2C标准模式(100kHz)通常要求上升沿不超过1μs,如果总线电容是100pF,10k电阻的τ就是1μs,已经很临界了,通常建议用4.7k。
我总结一个工程经验:
- 低速信号(几百kHz以内)长度短,用10k,省功耗
- 标准I2C 100k-400kHz,用4.7k
- 高速、长总线,用1k甚至更小
- 具体计算看允许的最大上升时间。用示波器直接测实际波形最靠谱
3.3 为什么I2C总线偏偏要用开漏
I2C用开漏不是因为省钱,而是因为开漏结构天然支持**线与(Wire-AND)**和多主机仲裁。
想象一下,如果I2C用推挽输出,两个设备一个想发高电平、一个想发低电平,直接打架烧管子。而开漏输出不存在这个问题,因为开漏的管子只会拉低,不会拉高。多个开漏输出直接并联在一条总线上,只要任何一个设备拉低,总线就是低电平;只有所有设备都释放总线(让NMOS截止),总线才在上拉电阻作用下回到高电平。
这个特性在总线仲裁时太方便了:多个主机同时在时钟线上发数据,如果一个主机发现它发送的位电平是1但总线上是0,就知道自己仲裁输了,立刻退出。这一整套机制完全建立在开漏结构之上,换成推挽根本无法实现。
3.4 开漏还有个隐藏技能:电平转换
因为开漏输出的高电平完全由外部上拉电阻的电源决定,所以天然能做电平转换。比如一个3.3V的单片机IO要驱动5V的器件,就用开漏输出配上拉到5V的电阻,输出高电平时引脚被拉到5V,输出低电平时拉到地,双向兼容,完美。
我在实际项目中做过类似设计:一颗5V的EEPROM,挂在3.3V主控的I2C总线上,全部设备的SDA和SCL引脚都配置为开漏模式,上拉电阻统一接到5V电源,结果非常稳定。前提是3.3V器件的IO能承受5V电压,选型时要看芯片手册里的耐压值,那些标注“5V tolerant”的引脚才能这么用。
3.5 开漏输出的代价
上面把开漏夸了一顿,但它也有明显短板:高电平驱动能力弱、信号边沿慢、输出频率普遍不高。所以开漏结构几乎只用于低速总线和电平转换场景,真正追求高速和强驱动的场合,还是得用推挽。
4. Multisim仿真验证:把理论拉到示波器上看
4.1 仿真工程准备与器件选型
Multisim是我用得比较顺手的仿真工具,画电路快,虚拟示波器也直观。这次仿真我用的器件如下:
- 信号源:函数发生器,输出方波,幅度5V,频率10kHz
- 推挽结构:PMOS用IRF9540,NMOS用IRF540,这俩模型好找,参数也典型
- 开漏结构:NMOS用2N7000,上拉电阻先取4.7k
- 电源:VCC用5V直流源
打开Multisim新建工程,先提醒一句:如果你打开Multisim提示“访问数据库发生错误”或者“主数据库无法访问”,大概率是安装路径或者权限问题,后面我会专门讲排查方法。
4.2 第一步:搭推挽电路并观察交越失真
推挽电路接线方式如下:
- IRF9540(PMOS)的源极接VCC(5V),漏极接输出节点A
- IRF540(NMOS)的源极接地,漏极接输出节点A
- 两个栅极短接,接函数发生器的正极
- 函数发生器负极接地
- 示波器通道A接输入信号,通道B接输出节点A
连线完成后点运行,你会看到输出波形大体跟随输入翻转,但如果你把示波器的水平时基调大,把波形过零点附近放大,就能看到输出波形在上升沿和下降沿交界处有一小段“迟疑”,这个就是交越失真的痕迹。
想更直观地观察,把输入信号改成1kHz低频正弦波,在波形过零点附近,你会看到输出正弦波有一段明显的平台,看起来像是被“夹扁”了,这就是交越失真最典型的特征。
4.3 第二步:搭开漏电路并观察上拉电阻的影响
开漏电路接线要更简单:
- 2N7000(NMOS)的源极接地,漏极作为输出节点B
- 栅极接函数发生器
- 上拉电阻Rp从VCC(5V)接到节点B
- 示波器通道A接输入信号,通道B接节点B
先用10k电阻跑一次,再用4.7k跑一次,对比输出波形上升沿的斜率,你会发现低阻值上拉时上升边明显更陡。再试一下1k,波形会更漂亮,但是节点B为低电平时示波器上可以看到低电平被抬高了一点,这个是因为2N7000导通时漏源间还有导通电阻,1k上拉的导通电流更大,Vds压降也更大,所以低电平并不完全是0V。
这个细节特别重要,很多人仿真开漏时只看高低电平是否翻转,忽略了低电平的Vol电平。实际项目中,IO输出低电平如果太高,超过了接收端的VIL阈值,就会误判为高电平,通信直接崩。
4.4 第三步:验证线和逻辑
在刚才开漏电路的基础上,再复制一个完全相同的NMOS支路,两个漏极都接到节点B。两个栅极分别接两个不同的信号源,一个输出方波,一个输出固定高电平。你会看到:只要任何一个NMOS导通,节点B就是低电平;两个NMOS都截止时,节点B才是高电平。
这个仿真结果就是线与逻辑的直观体现。你甚至可以尝试把两个信号源都换成方波,一个10kHz一个7kHz,观察总线上的叠加波形,那一刻你会对开漏“多设备共享总线”的理解完全成型。
4.5 Multisim仿真速度太慢怎么提速
大电路仿真卡顿是常态。如果你只是验证逻辑,可以把仿真方式从“交互式”改成“单步”或者把虚拟示波器的采样率调低。Multisim里双击示波器,把Timebase里的Sample Rate调低,波形会变粗糙但速度能快不少。
另外,Multisim对复杂模型的计算开销很大,比如IRF540这种级别器件的仿真速度要明显慢于理想开关模型。如果只是看逻辑,可以先把PMOS和NMOS换成Multisim自带的“理想N沟道MOSFET”和“理想P沟道MOSFET”,等确认逻辑无误后再换回真实型号做细节验证,这属于仿真效率优化里最见效的一招。
5. 仿真到实际,你还得知道这些坑
5.1 Multisim常见报错问题排查方法
第一个高频问题是安装或启动时提示“访问数据库发生错误”。我遇到过的原因有两种:一种是软件安装路径包含中文或者特殊符号,导致数据库文件路径解析异常;另一种是使用绿色版或者精简版,数据库文件和程序目录对应不上。解决办法是先卸载干净,用官方安装包重新安装到纯英文路径,如果还是不行,去软件安装目录下找到数据库文件master_db,右键属性确认它没有被设为只读,同时用管理员身份运行程序。
第二个高频问题是“主数据库无法访问”,这个多半是杀毒软件把数据库文件隔离了。去杀毒软件的恢复区里把被隔离的文件恢复,然后加入白名单。这类问题其实是Multisim老用户天天见的问题,有个快速验证方法:把Multisim安装目录整个加入杀毒软件信任区,再重新启动,成功率很高。
第三个常见问题是我前面提到的:想用的元件在元件库里找不到。Multisim自带的库虽然全,但有些新出的型号确实没有。这时可以选同系列参数接近的替代型号,比如没有2N7002,就用2N7000; 没有SI2302,就用IRF540或者BSS138。仿真的重点本来就在验证电路逻辑,不必拘泥于具体型号参数完全一致。
5.2 仿真和现实的差距到底有多大
Multisim里的MOS管模型虽然比理想开关精细,但还是有局限的。它主要体现的是直流和低频特性,对器件在高频下的寄生参数模拟能力有限。真实MOS管的寄生电容、封装电感、PCB走线寄生参数,才是高频电路设计的真正敌人。
最典型的例子就是米勒效应。MOS管的栅漏极之间存在寄生电容,在开关的瞬间,输入信号变化会通过这个电容耦合到栅极,导致栅极电压波形出现一个平台期,开关速度被拖慢。Multisim用某些模型是可以看到这个现象的部分特征的,但和真实电路对比,幅度和持续时间都有差距。
实际项目中,当你的MOS管开关频率在几百kHz以上时,米勒效应的影响就完全不能忽略了,需要专门的栅极驱动芯片来快速充放电。栅极串个小电阻也能减缓振铃,代价是牺牲开关速度。
5.3 从仿真落地到实际选型的几条经验
仿真确认了电路逻辑之后,真正做硬件时你还要做几件事:
第一件是确认驱动能力。仿真的管子型号按数据手册查一下最大连续漏极电流,留出至少1.5倍的裕量。MOS管的Rds(on)会随温度升高而增大,如果你的电路要长时间工作,按最热的时候计算都不超限才算稳。
第二件是关键信号的波形测量。仿真好看不等于实际好用,实际板子上一定要用示波器实测栅极波形和输出波形,对比是否和仿真一致。我见过好些人仿真好好的,实际板子一上电就烧MOS管,最后查出来是栅极振铃导致管子工作在放大区,功耗爆表。
第三件是功耗估算。MOS管开关时的功耗包含导通损耗和开关损耗,高频下开关损耗占比很高。如果芯片烫手,优先检查开关频率、栅极电阻和米勒平台持续时间,而不是换更大电流的管子硬扛。
5.4 推挽和开漏到底怎么选
最后给一个非常直接的选型建议表,是我做项目时常用的判断逻辑:
| 场景 | 推荐结构 | 原因 |
|---|---|---|
| 单片机GPIO驱动LED、蜂鸣器 | 推挽 | 驱动能力强,高低电平都干脆 |
| I2C、SMBus等多设备总线 | 开漏 | 支持线与,天然支持仲裁 |
| 不同电压域之间的信号对接 | 开漏 | 上拉电源决定高电平电压 |
| 高速通信接口(SPI等) | 推挽 | 边沿快,时序裕量充足 |
| 多个输出并联驱动一个负载 | 开漏 | 避免两个推挽输出互相对拉 |
| 音频功放输出级 | 推挽(加偏置) | 交越失真可通过外部电路消除 |
6. 写在最后:我的一点体会
推挽和开漏这些东西,说实话不算难,但真正吃透它们需要把“MOS管开关特性—输出结构—总线协议—实际波形”这条链路完整走一遍。我见过不少工程师会用I2C,但问他为什么SDA要接上拉电阻,他会说“习惯性接的”,这种状态其实是危险的,因为一旦总线出问题,他不知道该往哪个方向排查。
Multisim仿真的价值就在于它能把抽象的管子导通条件变成屏幕上看得见的波形,让你亲手验证“为什么开漏必须加上拉”“为什么推挽会交越失真”这些平时只能靠想象的问题。我建议你拿到这篇文章后,不要只看不动手,每个电路都在Multisim里搭一遍,然后把上拉电阻从10k换到1k,感受一下波形上升沿的变化,这种肌肉记忆比背一百遍公式都管用。
如果后续你有兴趣,还可以在这个基础上继续做三件事:一是给推挽加死区控制逻辑,看看穿通电流是怎么被消除的;二是把I2C跳变到400kHz高速模式,实测一下不同上拉电阻下的波形完整性;三是用真实芯片(比如STM32的GPIO和AT24C02)搭一个最小I2C通信系统,用逻辑分析仪验证数据和时钟线的时序关系。每一步都能让你对数字电路的理解深一层。