2026/10/7 13:26:11

推挽输出与开漏输出详解:MOS管驱动、上拉电阻与电平转换实战

推挽输出与开漏输出详解:MOS管驱动、上拉电阻与电平转换实战 1. 先搞清楚三个极MOS管为什么能当开关用1.1 从电压控制讲起栅极、漏极、源极的分工做嵌入式这几年我见过太多人在推挽输出和开漏输出之间栽跟头。最典型的一种情况是把MCU的GPIO配成了推挽输出去模拟I2C结果挂了两块传感器查了半天才反应过来是总线冲突还有一种是用单片机的引脚直接去推一个大功率MOS管结果发现管子不但发热严重开关波形还稀烂。这些问题归根结底都要从MOS管本身的工作方式说起。MOS管MOSFET金属氧化物半导体场效应管是一个电压控制器件。它有三个极栅极Gate、漏极Drain、源极Source。栅极和其他两个极之间隔着一层二氧化硅绝缘层所以栅极几乎没有电流流入或者说静态时输入阻抗极高。真正控制MOS管导通与否的是栅极和源极之间的电压差也就是Vgs。这个特性很像一个水龙头闸门栅极本身不消耗水流但转动手柄Vgs就能决定水管里通不通水。栅极电压超过某个阈值Vgs(th)之后漏极和源极之间的导电沟道才会建立起来。注意这里有个关键点MOS管是电压控制不是电流控制所以它不存在持续给基极灌电流这种问题这也是它开关频率能做得比三极管高的根本原因。1.2 N沟道与P沟道导通条件的差异MOS管按导电沟道分成N沟道和P沟道两大类导通条件刚好相反类型导通条件电流方向常见接法N沟道增强型Vgs Vgs(th)一般为2~4VD→S源极接地漏极接负载P沟道增强型Vgs -Vgs(th)栅压比源压低S→D源极接电源漏极接负载用N沟道管子做低边开关源极接地是最舒服的只要把栅极电压拉到比源极高出一个阈值管子就导通控制逻辑很简单。但如果你要做高边开关负载接地电源从上面切N沟道就麻烦了——源极电压会跟着负载浮动栅极必须比电源电压更高才行。这时候要么用自举电路要么用电荷泵要么直接用P沟道管子。P沟道做高边很自然源极接VCC栅极拉低就导通但P沟道管子的导通电阻一般比同规格N沟道大成本也更高因为空穴的迁移率只有电子的三分之一左右。这就是为什么绝大多数功率电路里N沟道是主流哪怕是高边也要想办法用N沟道。还有一个细节很多新手会忽略MOS管在导通状态下电流方向实际上是可以反向流动的。因为导通的沟道是一个对称的电阻通道D和S之间没有物理上的单向阀。大家常说的电流不能反向其实指的是体二极管的方向约束。这一点在H桥、同步整流电路里非常重要。1.3 体二极管很多人忽略的隐藏通道几乎所有分立MOS管内部都寄生了一个体二极管Body Diode方向是从源极指向漏极对N沟道来说就是S→D或者说二极管的阴极在D端。这个二极管不是你主动想要的但它在实际电路中却经常被利用比如H桥里给感性负载续流全靠这个二极管先顶一下同步Buck电路里下管也是靠体二极管先导通再让沟道接管。但要小心体二极管的反向恢复时间比外接的快恢复二极管慢高频硬开关场合下体二极管的反向恢复会引起额外的损耗和电压尖峰。很多人在电机驱动板子上看到MOS管波形上有毛刺排查半天最后发现是体二极管的反向恢复电荷在作怪。所以高压高频应用里选管子时要看datasheet里的Qrr反向恢复电荷参数或者干脆外加肖特基二极管跟体二极管并联来抢电流。2. 推挽电路的本质两个管子如何交替上班2.1 从图腾柱到推挽结构演进推挽电路英文叫Push-Pull业界也叫图腾柱输出Totem-Pole。标准结构是上边一个管子负责推把输出拉到高电平下边一个管子负责挽把输出拉到低电平两个管子串联在电源和地之间中间抽头作为输出端。数字电路里最常见的推挽是互补MOS结构上管是P沟道源极接VCC下管是N沟道源极接地两个栅极连在一起作为输入。输入为高时N管导通、P管截止输出被拉到地输入为低时P管导通、N管截止输出被拉到VCC。注意这个逻辑是反相的。如果你看到某个芯片的引脚输入高输出低多半内部就是这个结构。为什么叫推挽输出为高时上管导通电流从电源经过上管流向负载这是推输出为低时下管导通电流从负载经过下管流到地这是挽。一个推一个拉所以输出的高低两个状态都有管子主动驱动而不是靠电阻去拉。这在后文对比开漏输出时会显得特别重要。2.2 推挽输出的优点低阻抗、双向驱动推挽输出最大的好处就是输出阻抗低而且高低电平状态下都是低阻抗。低电平靠N管下拉高电平靠P管上拉所以带负载能力强上升沿和下降沿都可以很陡。MCU的GPIO配置成推挽模式之后每个引脚能拉灌几十毫安具体的看芯片手册直接驱动LED、蜂鸣器、小型继电器都没问题。另一个优点是电压摆幅接近满幅。推挽输出高电平时输出接近VCC只差一个很小的压降低电平时接近GND。相比之下后面要讲的开漏输出高电平要靠外部上拉电阻电压取决于上拉接的是哪路电源幅度和沿的速度都受限。在MOS管驱动电路里推挽结构几乎是标配。像TC4420、UCC27524这类栅极驱动芯片内部输出级就是一个推挽结构导通时能灌出几安培的峰值电流快速给栅极充电关断时又能迅速把栅极电荷抽走。栅极驱动器推挽本质上就是用两个管子交替上班把控制信号变成一个低阻抗的强驱动源。2.3 推挽电路的死区问题直通电流推挽结构有一个天然的隐患如果上下两个管子同时导通电源到地之间就短路了这就是直通Shoot-Through。实际电路中两个管子不会那么听话地一个开一个关尤其在开关过程中由于寄生电容和米勒效应的影响关断通常比导通慢很容易出现一个还没关死、另一个已经开始导通的瞬间这时候就会产生一个巨大的电流尖峰。解决办法就是插入死区时间Dead Time在两个管子状态切换之间刻意让上下管都关断一小段时间比如几百纳秒。对于半桥、全桥这种拓扑死区时间甚至要精确到微秒级。死区太小会直通炸管死区太大又会影响占空比精度和波形质量。很多电机驱动芯片内部有死区控制寄存器比如STM32的高级定时器就可以配置互补PWM的死区时间这个参数在实际调试中值得反复试。我自己调试过一个全桥电路一开始没注意死区频率一上到20kHz就听到电源滋滋响一测电流比预期大了好几倍。后来把死区从0调到1微秒电流尖峰立刻消失了大半。这个经验就是只要涉及互补推挽驱动第一个要确认的参数永远是死区。3. 开漏输出为什么非要加上拉电阻3.1 开漏的结构为什么叫开漏开漏输出Open-Drain的结构比推挽简单得多它只有一个N沟道MOS管漏极直接引出作为输出源极接地。栅极收到高电平时管子导通输出被拉到地栅极收到低电平时管子截止输出端悬空——既不是高电平也不是低电平而是高阻态。开漏这个名字很形象漏极是开着的没有内部任何东西去接它。所以输出为高这件事开漏结构自己干不了必须靠外部电阻把输出端拉到某个电压这个电阻就是上拉电阻。三极管时代对应的概念叫开集输出Open-Collector原理一模一样。如果你看到老旧电路图上写着OC门那跟现在的开漏输出是同一个思路只是器件从BJT换成了MOS管。关键点开漏输出的管子只有两个状态——下拉低和悬空高阻。它永远不能主动输出高电平。所以开漏输出经常被理解成只能拉低不能拉高这句话对也不对更准确的说法是开漏输出能主动拉到低但高电平由外部上拉电阻决定。3.2 I2C为什么固执地选用开漏这是面试和实际调试中最常被问到的问题I2C为什么要用开漏加上拉而不直接用推挽答案藏在I2C的总线特性里。首先是多设备共享总线。I2C允许挂多个主设备和多个从设备大家一起用SDA和SCL两条线。如果是推挽输出A设备输出高电平的同时B设备输出低电平那就是电源到地的直接短路轻则逻辑错误重则烧芯片。开漏输出不会出现这个问题谁想发低电平谁就把总线拉低不想发低电平就释放总线高阻。总线电平变成所有设备都不拉低时为高任何一个设备拉低即为低这就是所谓的线与逻辑Wire-AND。其次是多主机仲裁。两个主设备同时想占用总线怎么判断谁优先因为内部是线与逻辑主机在发送数据的同时会回读总线电平。如果自己发的是1但读回来是0说明有其他设备正在拉低总线这个主机就输了仲裁立刻停止发送。这种发送中回读的机制只有开漏结构才能实现推挽结构根本做不了。第三是电平兼容。开漏输出配上不同的上拉电压就能让3.3V的单片机和5V的传感器挂在同一条总线上。总线高电平由接VCC侧的上拉电阻决定低电平大家都通过开漏管子拉到GND逻辑电平天然兼容。如果用推挽电平不匹配就直接冲突了。第四是双向半双工。I2C的SDA在发送和接收之间快速切换开漏结构天然支持方向切换不驱动时就是高阻随时可以转为接收状态。3.3 上拉电阻的阻值怎么选速度与功耗的权衡上拉电阻选大了高电平上升沿太慢信号到不了高电平输入阈值通信就出错选小了灌电流太大会超出器件的吸收能力而且功耗高。所以上拉电阻的取值是一门权衡。定值逻辑不复杂但有两条线要走。第一条是电流限制开漏管子导通时上拉电阻上的电流IOL (VCC - VOL) / RP这个电流不能超过器件标称的灌电流能力。对标准I2C器件来说一般是3mA级别。假设VCC3.3VVOL按0.4V算RP最小值约为(3.3-0.4)/0.003 ≈ 967Ω所以1k基本是下限。第二条是速度限制。开漏输出从低到高的过程其实就是上拉电阻通过总线等效电容Cbus充电的过程电压曲线是典型的RC指数上升V(t) VCC × (1 - e^(-t/RC))。上升到有效高电平阈值对I2C来说是0.7×VCC所需的时间大约是0.85×RP×Cbus。I2C规范对上升沿有明确要求标准模式100kHz要求上升时间不超过1μs快速模式400kHz要求不超过300ns。如果总线电容是200pF要满足400kHz的上升沿要求RP×Cbus不能超过约350ns也就是RP不能大于1.75kΩ选1.5k或1k比较稳妥。如果总线很长、电容很大上拉电阻就要相应减小或者降低通信速率。我平时的经验值3.3V系统、单板内短线I2C上拉选4.7k~10k都能跑100kHz但跑400kHz一般要降到2.2k~3.3k。如果跨接长排线或者板卡互联建议直接上1k并用示波器确认上升沿。另外如果有强下拉器件如ESD二极管上拉太大容易让静态电平偏低。4. 推挽与开漏的选型对比谁适合什么场景4.1 电平不一样怎么办电平转换的两种思路推挽和开漏在日常设计中最大的分歧点就是电平转换。推挽输出做电平转换很麻烦。3.3V单片机的推挽高电平只有3.3V直接接5V芯片的输入端逻辑高电平可能不够反过来5V芯片的推挽输出接3.3V单片机又有过压风险。要处理这种电平转换得用专门的电平转换芯片比如74LVC245单向、TXS0108双向自动方向这类芯片内部本身也是推挽结构只是做了电平搬移。开漏就简单多了。开漏输出的高电平不是自己产生的而是上拉电阻接哪路电源就是哪路电平。3.3V单片机的I2C引脚配成开漏上拉电阻接5V总线高电平就是5V5V的传感器读起来毫无压力。反过来5V器件的开漏输出接3.3V上拉高电平就变成3.3V3.3V单片机也完全兼容。只要两边的输入引脚都能承受对侧的上拉电压注意查看引脚是否5V容忍一套电路就解决了双向电平转换成本几乎为零。注意这个玩法只对开漏有效而且是开漏管子的被动上拉才能这么玩。如果器件内部把输出拉到了某个固定电平那就不能随便改变总线电平了。4.2 线与逻辑开漏独有的多设备仲裁能力开漏输出真正的独门绝技是线与逻辑。多个开漏输出直接并在一起不需要任何额外电路就实现了一个或非关系任何一个输出为低总线上就是低只有全部为高阻总线才被上拉为高。这个特性在硬件上用途极广。典型场景是中断线多个设备的INT引脚都是开漏输出全部并联到MCU的一个外部中断引脚任何一个设备产生中断把总线拉低MCU就能感知到。然后MCU再通过I2C逐设备查询是谁拉低的。这种设计省MCU引脚、省板子空间是工业级板卡上非常常见的做法。推挽输出做不了这件事。两个推挽输出并联一个输出高一个输出低就直接打架了。所以凡是涉及多设备共享一根线的场景开漏几乎是唯一答案。4.3 实战MCU引脚配置怎么选现在主流MCU的GPIO基本都支持推挽、开漏、上拉、下拉这些组合。到底怎么选我归纳成一张场景对照表场景推荐模式理由驱动LED、蜂鸣器推挽输出能力强高电平稳SPI的MOSI/SCK点对点推挽速度要求高推挽沿快UART的TX推挽点对点单端输出不需要线与I2C的SDA/SCL开漏外部上拉多设备线与、仲裁需要共享中断线INT开漏上拉多设备线与电平可调电平转换3.3V↔5V开漏对应上拉高电平由外部决定控制MOS管栅极推挽或专用驱动需要快速充放电有个细节值得提醒STM32的GPIO配置成开漏模式之后如果同时使能了内部上拉那内部上拉电阻约30~50kΩ会参与工作。这个阻值对低速跑跑没问题但高速I2C建议关掉内部上拉用外部精确电阻因为内部上拉阻值偏大且温漂明显高速时上升沿会不达标。另外开漏输出在驱动负载时能力比推挽弱因为它的高电平依赖外部电阻电流能力受上拉限制低电平虽然有管子主动拉但也要看器件的灌电流规格。所以开漏不是万能的别把它当推挽用去驱动重负载。5. 驱动MOS管的那些坑米勒效应、寄生电容与SOA5.1 米勒效应栅极驱动为什么慢半拍用示波器看MOS管栅极驱动波形很多人会看到一个奇怪的平台期Vgs上升到阈值电压附近后会卡在那里停一小段时间然后才继续爬升。这个平台叫米勒平台是栅漏寄生电容Cgd造成的。MOS管内部有三个寄生电容Cgs栅源、Cgd栅漏、Cds漏源。米勒效应指的就是Cgd把输出端漏极的电压变化反馈到了输入端栅极的问题。开关过程中漏极电压在快速变化通过Cgd的耦合会往栅极注入或者抽取电流。具体来说导通时漏极电压下降Cgd要放电这个放电电流是从栅极抽走的也就是栅极驱动源要多付出额外的电流。在驱动源电流有限的情况下Vgs就升不上去形成一个平台。米勒平台的持续时间取决于栅极驱动源能提供多大电流。驱动电流越小平台越长开关过程就越慢。慢开关的直接后果就是开关损耗上升在开关期间MOS管上同时存在较高的Vds和较大的Id两者相乘就是瞬时功率这段时间越长管子越烫。论到波形如果栅极驱动能力不足你会在漏极看到很长的下降沿而不是干脆利落的陡沿。这时候别急着怪管子不好先去查栅极驱动电路。5.2 寄生电容的充放电栅极电阻的玄机MOS管的栅极输入端等效为一个电容网络数据手册里通常给出输入电容Ciss等于CgsCgd。但真正决定驱动难度的是栅极总电荷QgGate Charge它把三个电容的影响合并成了一个具体的电荷量。这是选驱动芯片时最常看的参数之一。驱动一个管子需要多长时间取决于驱动源能供出多大的峰值电流。假设Qg50nC我们希望开关过程做到100ns那需要的平均驱动电流就是I Qg / t 50nC / 100ns 0.5A。MCU的GPIO一般只有几毫安到二十毫安差了整整一个数量级。这就是为什么大功率MOS管不能直接用单片机引脚驱动必须加栅极驱动芯片或者分立推挽缓冲级。栅极串联电阻Rg的作用也在这时候体现。它主要用来抑制开关振铃和EMI栅极回路的分布电感和Cgs构成LC谐振回路如果没有Rg做阻尼栅极波形会剧烈振荡幅度甚至可能超过栅极耐压把氧化层打穿。但Rg也不是越大越好电阻大了栅极充电变慢开关损耗上升。工程上常见的折中取值是4.7Ω到22Ω之间具体要配合示波器看波形调。还有一个经常踩的坑关断速度。开通可以慢一点关断一定要快。原因在下面一节讲米勒误导通的时候会解释。实战中很多设计会用一个电阻并联二极管的方式导通时电流经过主电阻关断时电流抄近路走二极管从而实现开得慢、关得快。5.3 SOA边界管子是怎么烧掉的SOA全称Safe Operating Area安全工作区是MOS管数据手册上的一个关键图表。它画出了管子在不同条件下能承受的电压、电流和时间的边界。横轴是Vds纵轴是Id图上有好几条曲线分别对应直流、10ms脉冲、1ms脉冲、10μs脉冲等。落在曲线左上方的区域内管子就是安全的。MOS管烧毁最常见的两个原因一个是超出SOA一个是热累积。超出SOA的典型场景是管子工作在半导通状态Vds和Id都很大瞬时功率极高。很多人在PWM调速电路里遇到过这种情况MOS管没有完全导通Vgs不够管子处于线性区电阻很大电流又不小结果功耗全烧在管子上。这跟你把水管阀门拧到一半阀体本身发热是一个道理——真正做功的不是用水的地方而是半开的阀芯。另一个被忽视的维度是线性模式Linear Mode。冷启动时给大电容充电、热插拔电路做限流这些场景要求MOS管短暂地工作在SOA边界附近这时不能只看额定电流要看SOA曲线上的直流线。曾经有工程师选了一颗30A的管子做热插拔限流以为余量充足结果一上电就炸原因就是这颗管子直流SOA很小在中间电压区撑不住几瓦的功耗。5.4 PWM驱动MOS管发热的原因排查PWM一接上去MOS管烫得不能摸。这是论坛上最常见的求助帖。按照我的排查顺序基本能覆盖90%的原因。第一查栅极电压。N沟道管子做低边开关Vgs要达到10V左右才能完全导通逻辑电平管子除外。如果单片机只有3.3V直接推栅极很多管子只能半开导通电阻比标称值大好几倍不烫才怪。这是新手最普遍的坑。第二查开关速度。用示波器看栅极波形有没有米勒平台过长看漏极波形下降沿是不是太缓。如果波形边沿超过1μs而频率是几十kHz开关损耗会非常可观。解决办法是加驱动芯片、减小栅极电阻。第三查死区。推挽或H桥结构如果没有死区上下管直通电流脉冲直通电源管子瞬间过流。这种发热往往伴随电源电流异常增大甚至打嗝保护。第四查频率。开关频率和开关损耗成正比频率翻一倍开关损耗翻一倍。高频下如果是硬开关需要考虑谐振或者选用低Qg的管子。第五查dv/dt引起的误导通。这个问题很隐蔽下管关断时半桥中点电压快速上升通过下管Cgd往栅极注入电流把栅极电压顶到阈值以上导致下管重新导通形成直通。解决办法包括栅极加负压比如-5V关断、用米勒钳位电路、降低栅极回路阻抗、选Cgd小的管子。值得一提的还有散热设计。MOS管的额定电流通常是在壳温25℃下测的实际工作温度一高可用的电流就被腰斩。数据手册里的热阻参数、PCB铺铜面积、过孔数量这些看似不起眼的细节往往决定了管子能跑多久。6. 三极管推挽与MOS管推挽从图腾柱驱动到IGBT驱动6.1 三极管电流控制 vs MOS管电压控制三极管BJT和MOS管本质区别在于控制方式BJT是电流控制器件基极必须有持续的电流集电极电流大概是基极电流乘以βMOS管是电压控制器件栅极只需要负责充放电的瞬间电荷导通之后栅极不再需要静态电流。这个差异带来的直接后果是BJT推挽输出天然适合做功率放大级因为它本身就是一个电流放大器基极给一点电流集电极就能流过很大的电流。经典音频功放的末级输出就是BJT推挽Class AB利用两个互补管分别放大正半周和负半周。而MOS管推挽更适合做数字开关级它不追求线性放大追求的是快速饱和和快速截止。BJT还有一个讨厌的特性是存储时间。BJT导通时基区积累了大量的少数载流子关断时需要把这些电荷抽走所以BJT的关断速度比较慢。MOS管没有这个问题关断只需要把栅极电容的电荷放掉就行。在高频开关电源里MOS管几乎完全取代了BJT就是这个原因。6.2 IGBT驱动的实际组合IGBT绝缘栅双极型晶体管可以理解为MOS管和BJT的复合体输入级是MOS结构所以栅极驱动特性和MOS管一样电压控制、有栅极电容输出级是BJT结构所以导通压降低、耐压高。它继承了MOS管好驱动的优点又弥补了MOS管在高压大电流下导通电阻大的不足。IGBT的栅极驱动更讲究。因为IGBT的下管关断时集电极电压变化很快同样会通过米勒电容往栅极灌电流导致误导通。所以大功率IGBT驱动普遍采用负压关断开通时栅极加15V左右关断时栅极拉到-5V甚至-10V确保IGBT在关断期间栅极电压远低于阈值。很多IGBT驱动模块比如车间里常见的驱动板内部就是推挽输出晶体管对配合隔离电源输出正压和负压。集成栅极驱动芯片的内部结构几乎清一色是推挽输出级只是具体晶体管类型不同。像TLP250这种光耦隔离驱动输出就是一个由NPN和PNP组成的图腾柱导通时能输出0.5A左右的电流关断时能抽走同样的电流。这类芯片比用分离元件搭栅极驱动要可靠得多因为分离元件的匹配和布线稍不注意就会出现振铃。6.3 一个完整的MOS管驱动电路设计实例纸上谈兵了半天这里给一个可以照抄的完整设计实例用3.3V单片机驱动一个低边N沟道MOS管控制12V直流电机PWM频率20kHz电机堵转电流约5A。管子选型额定电压留2倍余量选40V以上的管子比如IRFZ44N55V/49A/Rds(on)约17.5mΩ。不过IRFZ44N不是逻辑电平管子Vgs只有3.3V根本开不透所以栅极驱动级必须上。驱动电路单片机PWM输出接到栅极驱动芯片TC4420或UCC27524该芯片内置推挽输出供电接12V峰值驱动电流可达6A。TC4420的输入有施密特触发器直接接3.3V逻辑没问题。输出端串一个10Ω栅极电阻再并联一个1N4148反向二极管阴极朝向栅极实现快速关断。栅极到地再放一个10kΩ电阻防止单片机启动瞬间引脚悬空导致MOS管误导通。负载处理电机两端反并联一个快恢复二极管如BYV26C做续流。这个二极管必不可少——关断瞬间电机电感会产生很高的反向尖峰没有续流二极管尖峰直接打在MOS管的漏极上很容易击穿。测试的时候用示波器同时看栅极和漏极波形。20kHz下栅极波形应该是一个干净的方波边沿不超过几百纳秒漏极波形在导通时为低电平因为导通压降很小关断时为12V。如果漏极波形出现明显的振铃第一步是加大栅极电阻试试比如从10Ω加到22Ω看振铃幅度是否下降。如果振铃还是大就要检查布局布线的寄生电感。如果是高边驱动N沟道就需要自举电路。自举的基本思路是在低边导通期间通过二极管给自举电容充电到VCC高边需要导通时电容放电把高边栅极电压抬到VCC之上。自举电容的容量一般取0.1μF到10μF具体取决于Qg和开关频率Cboot Qg / ΔV其中ΔV是允许的栅极电压跌落一般取0.5V。如果占空比接近100%自举电容没有机会充电高边就没法持续导通这时候就要考虑用隔离电源或者电荷泵。7. 电平转换与双向信号开漏输出的实战姿势7.1 开漏实现的双向电平转换电路用开漏做电平转换最简单的方案就是直接换上拉。3.3V MCU作为主机5V的传感器作为从机SDA和SCL都配成开漏上拉电阻统一接到5V。只要MCU引脚支持5V容忍现代MCU大部分都支持两边就能直接通信。这里的关键约束是MCU引脚的耐压不能在数据手册没标注FT5V容忍的情况下贸然接5V上拉否则长期运行可能损伤引脚。如果要转换更复杂的双向信号比如3.3V MCU和5V SPI或者UART混接可以用两个N沟道MOS管BSS138构成双向电平转换器这也是市面上常见电平转换模块的原理。电路大概是两个MOS管的栅极都接左侧参考电源比如3.3V左侧源极接地、漏极接左侧数据线右侧源极接地、漏极接右侧数据线每边数据线上都有各自的上拉电阻。这个电路的工作原理很有意思当左侧总线被拉低时左侧MOS管的Vgs0管子截止但左侧的漏极也就是右侧的数据线通过外部连接被拉低当右侧总线被拉低时电流先经过右侧MOS管的体二极管把左侧也拉低随后左侧源极电压低于栅极电压管子导通把右侧进一步钳位到低。一句话总结低电平时靠体二极管启动靠沟道保持高电平时两边各自由上拉决定。这个电路能实现双向自动电平转换不需要方向控制引脚是开漏应用的一个典型进阶玩法。7.2 波形分析上升沿为什么是RC充电曲线在示波器上看开漏和推挽信号一眼就能分辨。推挽输出的波形是两个陡峭的边沿上升沿和下降沿都快接近理想的方波。开漏输出的波形就很有辨识度下降沿很陡因为管子主动拉低上升沿是一个圆滑的RC充电曲线——电压按指数规律逐渐爬升。这个特性既是开漏的弱点也是它的身份标识。弱点在于上升沿慢限制了信号速率身份标识在于只要看到这种陡下缓上的波形就知道这是开漏输出配上拉电阻。反过来如果I2C总线上看到的波形是两边都陡的那要么用的是推挽不合规要么上拉电阻太小导致看不到上升沿的坡度都需要警惕。用RC曲线可以反推总线电容。把示波器打到上升沿处测出电压从10%升到90%的时间Tr约为2.2×RP×Cbus已知上拉电阻RP就能算出总线等效电容Cbus Tr / (2.2×RP)。知道总线电容之后就可以反向验证上拉电阻选得对不对目标上升时间应该小于时钟周期的20%。比如400kHz的I2C周期2.5μs目标上升时间应小于500ns实测总线电容200pF上拉电阻该用多少用公式算出来大约是2.2kΩ这时候选2.2k或1k都合理但10k肯定不行。7.3 实测经验与注意事项最后分享几条在调试开漏信号时积累的实战经验。第一注意VOL和灌电流的边界。开漏管子导通时输出端并不是严格0V而是有一个随灌电流增大的压降。如果总线挂的设备多灌电流叠加VOL可能会超过接收端的低电平阈值。标准I2C的VOL要求0.4V以下在3mA灌电流条件下但实际设计时最好留足余量多个下拉同时动作时尤其要算总电流。第二上拉电阻别只按静态算。总线从高到低的边沿是管子在跟RC网络做对抗管子导通内阻一般只有几十欧所以下降沿没问题。但上拉电阻小到一定程度静态功耗就不可忽略了。3.3V总线上挂1k上拉且总线长期被拉低功耗是3.3V×3.3mA约11mW单条线还好如果十几条信号线全这么干板子上的静态电流就不小了。第三长线传输要注意分布电容。排线、FPC软板、线缆的分布电容明显大于PCB铜箔走线。1米长的排线轻松贡献几十到上百皮法的电容。这时候别墨守成规用4.7k直接算一下总线电容300pF、上拉4.7k、上升时间约3.1μs这个速度连100kHz的I2C都够呛。要么换上拉到1k要么降速要么做信号调理。第四内部上拉和外部上拉别叠加。如果MCU既开了内部上拉又在外部加了上拉电阻总线等效上拉电阻是两者并联。看起来上拉更强了但内部上拉的温漂和离散性比较大会造成总线边沿时间不稳定高速通信时建议只用外部电阻。第五开漏输出测波形时不要用高阻探头。示波器探头输入电容一般在10pF以上直接探测高阻上拉的I2C总线等于给总线额外加了一个电容负载测出来的上升沿会比真实情况慢。如果条件允许用有源探头或低电容探头实在不行至少用短的接地弹簧减小地线环路。这些细节看着琐碎但往往就是通信时好时坏换个板子就罢工这类玄学问题的根源。把开漏输出的行为模型吃透——低电平靠拉、高电平靠悬空、沿的速度由RC决定——绝大多数总线调试的问题都能迎刃而解。