在这里插入图片描述

在这里插入图片描述

🎬 云泽Q个人主页

🔥 专栏传送入口: 《C语言》《数据结构》《C++》《Linux》《蓝桥杯系列》《笔试算法》《AI赋能》《STM32

⛺️遇见安然遇见你,不负代码不负卿~

前言

大家好啊,我是云泽Q,欢迎阅读我的文章,一名热爱计算机技术的在校大学生,喜欢在课余时间做一些计算机技术的总结性文章,希望我的文章能为你解答困惑~

一、通用推挽输出的名称来源与核心思想

1.1 为什么叫“推挽”?

通用推挽输出(Push-Pull Output,简称 PP)这个名称,其实非常形象地来源于该电路的工作原理。我们可以把它想象成两个人在配合工作:

  • “推”:就像一个人用力把重物往外推。在电路中,这对应着提供电流。当电路需要输出高电平时,它主动把电压“推”向外部引脚。
  • “挽”:就像另一个人用力拉绳子往回拽。在电路中,这对应着吸收或拉取电流。当电路需要输出低电平时,它把外部引脚的电平强行“拉”回到地。
    在这里插入图片描述

这种工作机制是通过一对互补的晶体管来实现的,通常采用 CMOS 工艺制造的 P-MOS 管N-MOS 管。这两个管子就像是两个开关,交替闭合与断开,让外部引脚要么接入电源 VDD(呈现高电压),要么接入地 GND(呈现低电压)。因为电路通路形成了输出电流(推)和吸收电流(挽)的效果,所以得名“推挽”。

1.2 核心控制逻辑

推挽输出的核心思想非常简单,用一句话概括就是:交替闭合或者开启 P-MOS 和 N-MOS 即可。

具体的控制逻辑如下:

  1. 硬件基础:使用 P-MOS 和 N-MOS 这一对互补开关。
  2. 动作本质:通过控制逻辑,让这两个 MOS 管轮流工作,绝不能同时导通。
  3. 最终效果:让外部引脚在 VDD 和 GND 之间切换,从而对外呈现出稳定的高电压和低电压。

二、MCU 内部 GPIO 输出驱动器详解

要真正理解推挽输出,我们需要深入 MCU 内部,看看 GPIO 输出驱动器是如何工作的。这里涉及到 ARM CPU、输出数据寄存器、输出控制电路以及 P-MOS/N-MOS 管的配合。

2.1 输出高电平的过程(“推”的动作)

在这里插入图片描述

当我们需要引脚输出高电平时,整个过程是这样的:

  1. CPU 写入数据:ARM CPU 向 输出数据寄存器 中写入数值 1
  2. 信号传递:这个 1 经过复用器(如果是 GPIO 模式)传递给 输出控制 模块。
  3. MOS 管状态切换
    • P-MOS 管:输出控制电路会给 P-MOS 的栅极(G)施加电压。根据 P-MOS 的特性(低电平导通,或者更准确地说是源栅压差满足条件),此时 P-MOS 管处于导通状态。
    • N-MOS 管:输出控制电路不施加驱动电压给 N-MOS,使其保持断开状态。
  4. 电流路径:电流从电源 VDD 出发,经过导通的 P-MOS 管(从源极 S 流向漏极 D),直接连接到外部引脚。
  5. 结果:外部引脚被接通到 VCC/VDD,对外表现为高电平。此时,如果有负载连接,MCU 就在向外“推”出电流。
    在这里插入图片描述
    P-MOS 导通时,电流方向是从上往下流向引脚的。

2.2 输出低电平的过程(“挽”的动作)

当我们需要引脚输出低电平时,操作正好相反:

  1. CPU 写入数据:ARM CPU 向 输出数据寄存器 中写入数值 0
  2. 信号传递:这个 0 传递给 输出控制 模块。
  3. MOS 管状态切换
    • P-MOS 管:输出控制电路不施加电压,P-MOS 管处于断开状态(截止)。
    • N-MOS 管:输出控制电路给 N-MOS 的栅极(G)施加电压。根据 N-MOS 的特性(高电平导通),此时 N-MOS 管处于导通状态。
  4. 电流路径:外部引脚通过导通的 N-MOS 管(从漏极 D 流向源极 S),直接连接到地 GND。
  5. 结果:外部引脚被拉低到 GND,对外表现为低电平。此时,如果外部有电流流入引脚,MCU 就在“挽”入(吸收)电流。
    在这里插入图片描述

三、关键避坑指南:严禁同时导通

在设计和使用推挽输出电路时,有一个绝对的红线:P-MOS 管和 N-MOS 管绝对不能同时导通。

3.1 为什么会短路?

如果我们看电路图会发现,P-MOS 的上端接的是 VDD(电源正极),N-MOS 的下端接的是 GND(电源负极/地),而它们的中间(漏极 D)是连在一起通向外部引脚的。

  • 如果 P-MOS 导通,VDD 就传导到了中间节点。
  • 如果 N-MOS 也导通,中间节点就直接连通了 GND。
  • 后果:一旦两个管子同时导通,VDD 就会直接通过这两个管子连到 GND。这就构成了电源短路
    在这里插入图片描述

3.2 短路的危害

这种短路会产生极大的电流,瞬间的高热量极有可能直接烧毁芯片内部的 MOS 管,甚至损坏整个 MCU。因此,输出控制电路的设计必须保证逻辑互斥,即同一时刻只能有一个管子导通,另一个必须彻底关断。

四、MOS 管的导通条件与电压细节

虽然我们在逻辑上说是写 01 来控制,但在物理层面上,MOS 管的导通是需要满足特定电压条件的。这也是很多初学者容易困惑的地方:既然 MCU 工作电压是 3.3V,为什么还能控制好 MOS 管?

4.1 阈值电压 (Vth)

MOS 管不是只要有电压就导通的,它有一个门槛,叫做阈值电压 V t h V_{th} Vth

  • N-MOS 导通条件:栅极电压 V g V_g Vg 减去源极电压 V s V_s Vs 的差值,必须大于阈值电压。即 V g − V s > V t h V_g - V_s > V_{th} VgVs>Vth。通常 V t h V_{th} Vth 在 0.3V 到 1V 之间。
  • P-MOS 导通条件:源极电压 V s V_s Vs 减去栅极电压 V g V_g Vg 的差值,必须大于阈值电压。即 V s − V g > V t h V_s - V_g > V_{th} VsVg>Vth
    在这里插入图片描述

4.2 实际工作中的电压匹配

以 STM32 为例,它的 IO 口工作电压通常是 3.3V。

  • 当我们要导通 N-MOS 时,输出控制电路会给栅极一个高电平(接近 3.3V),而源极接地(0V),压差远大于 1V,所以能可靠导通。
  • 当我们要导通 P-MOS 时,源极接 3.3V,输出控制电路给栅极一个低电平(接近 0V),压差也远大于 1V,也能可靠导通。

虽然输出控制电路内部的实际驱动电压可能比 3.3V 略小一点,但只要能满足 V g s > V t h V_{gs} > V_{th} Vgs>Vth 这个条件,MOS 管就能正常工作。我们不需要追求完美的线性区,只需要它在开关状态下逻辑自洽即可。

五、通用模式与复用模式的统一性

我们还要理清“通用”和“复用”的关系。

5.1 什么是复用推挽输出?

除了 CPU 直接控制 GPIO 输出高低电平外,MCU 内部还有很多其他外设(比如 UART 串口、SPI、定时器等)也需要控制引脚输出波形。

  • 通用模式:由 ARM CPU 读写 输出数据寄存器 来控制 P/N-MOS。
  • 复用模式:由片上外设(如 UART 发送器)直接接管控制权。外设模块会直接向 输出控制 电路发送 0 或 1 的信号,绕过 CPU 的数据寄存器。
    在这里插入图片描述

5.2 原理完全一致

无论是谁在控制(是 CPU 还是外设),到了最底层的驱动级,原理是一模一样的。都是利用那一对 P-MOS 和 N-MOS 管进行交替开关。所谓的“复用推挽输出”,仅仅是信号的来源变了,底层的“推挽”动作没有任何区别。理解了通用推挽输出,也就完全理解了复用推挽输出。

六、通用开漏输出(Open Drain)详解

6.1 核心思想:只使用 N-MOS

接下来我们学习第二种输出方式,叫做通用开路输出,英文叫 Open Drain Output,有时候简称为 OD。它的核心思想其实非常简单,用一句话就能概括:去掉 P-MOS,让 P-MOS 永远都关闭,只使用 N-MOS

虽然在我们的物理器件内部,P-MOS 和 N-MOS 是同时存在的,但在逻辑上,当你把输出引脚配置为“通用开漏输出”时,硬件电路会默认让你对应的 P-MOS 管直接失效。也就是说,它会让 P-MOS 管永远处于关闭状态,只保留 N-MOS 管来工作。

这就相当于在原理图上,把 P-MOS 那部分直接去掉了(物理上还在,但逻辑上不生效),整个输出电路就只剩下下半部分的 N-MOS 结构了。

6.2 寄存器控制逻辑与电平表现

在只有 N-MOS 工作的情况下,我们往寄存器里写 0 和写 1,逻辑会有什么变化呢?

6.2.1 写 0:导通 N-MOS,输出低电平

当你往寄存器写 0 时,这会激活 N-MOS 管。这和我们之前学的通用推挽输出是一样的:写 0 意味着 N-MOS 管导通。此时,引脚通过导通的 N-MOS 管直接连接到 GND(地),因此对外输出低电平

6.2.2 写 1:断开 N-MOS,呈现高阻抗

当你往寄存器写 1 时,情况就不同了。在推挽模式下,写 1 会导通 P-MOS;但在开漏模式下,P-MOS 已经被禁用了。所以,写 1 的效果仅仅是让 N-MOS 管直接断开

这时候,引脚与 MCU 内部的连接就彻底断开了。这种状态我们称之为高阻抗(High-Z)
在这里插入图片描述

⚠️ 重要结论
在纯粹的开漏模式下(不接外部电路),MCU 只能输出低电平和高阻抗,无法主动输出高电平

6.3 深度解析:什么是“高阻抗”?

很多初学者对“高阻抗”这个概念感到困惑,觉得它是不是代表某种高电压?其实不是。

所谓高阻抗,只是一种说法。真实的情况是:MCU 和外部引脚彻底断开了,相当于开路了。或者说,是 N-MOS 的 D 极(漏极)和外部引脚互相悬空了。

我们可以用一个简单的电路模型来理解:

  • 开路状态:就像电路中的开关 S 断开了。
  • 等效电阻:断开的开关,在电学上可以等效为一个阻值无穷大的电阻。
    在这里插入图片描述

因为阻值无穷大,电流无法流过,MCU 就不再驱动引脚,引脚的电平完全由外部电路决定。这就是为什么叫“高阻抗”——因为它对地或对电源都呈现出极大的电阻特性。

6.4 为什么叫“开漏”(Open Drain)?

这个名字其实非常形象。在推挽输出中,P-MOS 和 N-MOS 的漏极(Drain)是连在一起的,彼此互为负载。

而在开漏模式中,我们把上面的 P-MOS “拿掉”了。这时候,N-MOS 的漏极(Drain)就没有连接任何有源器件了,它只是连接到了一根导线(引脚)上。因为漏极是“开放”的,没有接负载设备,所以被称为漏极开路,简称开漏

6.5 如何输出高电平?——上拉电阻的作用

既然开漏模式自己发不出高电平,那我们在实际应用中怎么让它输出高电平呢?答案必须在外部找:我们需要在引脚外部接一个上拉电阻到 VDD(比如 3.3V)。
在这里插入图片描述

6.5.1 工作原理推导

让我们结合欧姆定律来详细推导一下这个过程。为了方便解释,我们定义几个参数:

  • 上拉电阻阻值为 R P U L L R_{PULL} RPULL
  • 引脚本身是一根导线,阻值 R 1 R_1 R1 无限趋近于 0 Ω 0\Omega
  • 开漏位置(即断开的 N-MOS)等效电阻为 R 2 R_2 R2,阻值无穷大
    在这里插入图片描述

当我们要输出高电平(寄存器写 1,N-MOS 断开)时:

  1. 电路通路:从 VDD (3.3V) 经过上拉电阻 R P U L L R_{PULL} RPULL,经过引脚 R 1 R_1 R1,最后到达开漏处 R 2 R_2 R2 (GND方向)。
  2. 电流计算:根据欧姆定律 I = V / R t o t a l I = V / R_{total} I=V/Rtotal。因为 R 2 R_2 R2 是无穷大,所以总电阻无穷大,导致整个回路的电流 I ≈ 0 I \approx 0 I0
  3. 电压计算
    • 上拉电阻上的压降 V d r o p = I × R P U L L V_{drop} = I \times R_{PULL} Vdrop=I×RPULL。因为 I = 0 I=0 I=0,所以压降为 0V。
    • 引脚处的电压 = 电源电压 - 上拉电阻压降 = 3.3 V − 0 V = 3.3 V 3.3V - 0V = 3.3V 3.3V0V=3.3V

结论:正是因为电流几乎为零,上拉电阻上没有分压,所以引脚处的电压就被“拉”到了和电源 VDD 一样的电平,从而实现了高电平的输出。

6.5.2 一个常见的认知误区(欧姆定律的本质)

这里有一个很容易让人纠结的问题:

“既然开路了,电流 I = 0 I=0 I=0,根据 V = I R V=IR V=IR,那整个电路电压不也应该是 0 吗?为什么引脚处反而是 3.3V?”

这个问题的根源在于对欧姆定律的理解偏差。
就好比水龙头里不流水难道就没有水压吗?

我们需要区分两个概念:“承压”“单点电压”

  • 欧姆定律算的是“承压” V = I R V=IR V=IR 计算的是电流流过某个元件时,该元件两端产生的电压差(即电压下降了多少)。
  • 单点电压是电位:引脚处的 3.3V 是指该点相对于地的电位

举个通俗的例子
假设有一个 10V 的电池,串联了三个电阻 R1(2Ω), R2(3Ω), R3(5Ω)。
在这里插入图片描述

  • 总电流 I = 10 V / ( 2 + 3 + 5 ) Ω = 1 A I = 10V / (2+3+5)\Omega = 1A I=10V/(2+3+5)Ω=1A
  • R1 承担的电压(压降)是 1 A × 2 Ω = 2 V 1A \times 2\Omega = 2V 1A×=2V
  • 但这不代表 R1 左边的电压是 2V。实际上,R1 右边接正极是 10V,流过 R1 后下降了 2V,所以 R1 左边的电压是 10 V − 2 V = 8 V 10V - 2V = 8V 10V2V=8V

回到开漏电路:
当 N-MOS 断开( R 2 R_2 R2 无穷大)时,虽然回路电流 I = 0 I=0 I=0,导致上拉电阻 R P U L L R_{PULL} RPULL 上的压降为 0(即它不消耗电压),但这恰恰意味着电源的 3.3V 没有被“消耗”掉,而是完整地传递到了引脚处。所以引脚处的单点电压就是 3.3V。

6.6 上拉电阻的必要性:防止短路

你可能会问,既然 N-MOS 断开时靠外部电阻拉高,那如果我不接这个电阻,或者 N-MOS 导通时会发生什么?

上拉电阻还有一个至关重要的作用:限流保护。

  • 当输出低电平时(N-MOS 导通):引脚通过 N-MOS 直接连通 GND。如果此时外部没有电阻,而是直接接了 VCC,那么 VCC 就会直接对地短路,瞬间的大电流会烧毁芯片。
  • 有了上拉电阻:当 N-MOS 导通接地时,电流从 VCC 流经上拉电阻再到 GND。电阻限制了电流的大小( I = 3.3 V / R P U L L I = 3.3V / R_{PULL} I=3.3V/RPULL),避免了电源直接对地短路,保护了 MCU。

所以,开漏输出必须配合上拉电阻使用,既是为了实现高电平输出,也是为了电路安全。通常这个电阻由 PCB 设计者在硬件层面添加,一般不由意法半导体官方提供。
在这里插入图片描述

6.7 复用模式下的开漏与推挽

最后,我们把视野拉回到“复用”这个概念上。

前面我们讲的都是“通用”模式,也就是由 ARM CPU 直接控制 GPIO 寄存器来操作 MOS 管。但实际上,GPIO 的输出电路还可以受其他外设控制,这就是复用模式
在这里插入图片描述

  • 复用推挽输出:本质上和通用推挽一样,只是控制权交给了外设(比如串口 UART)。串口想发 0 或 1,就直接通过复用线路控制 P-MOS 和 N-MOS 的交替导通。
  • 复用开漏输出:同理,当配置为复用开漏时,外设接管了控制权,但硬件逻辑依然是“禁用 P-MOS,只用 N-MOS”。

总结一下
所谓的“复用”,仅仅是改变了谁来控制这个开关(是 CPU 还是外设),而开关本身的物理结构(是推挽还是开漏)是完全不变的。只要把通用的推挽和开漏彻底搞懂了,复用的情况也就是换个控制源而已,原理完全一致,随着后面文章具体外设(如 I2C、串口)时,大家自然会有更深的体会。


结语

在这里插入图片描述

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐