推挽输出&&开漏输出

本文详细解析了STM32中GPIO的两种输出模式——推挽输出与开漏输出的工作原理。通过介绍PMOS与NMOS的工作状态,阐述了推挽输出的特点及其为何不能进行“线与”操作,同时解释了开漏输出如何实现“线与”及为何需要上拉电阻。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

33df06521b6a4ecbaf398571eb7b6c05.png

在学习STM32的时候,我发现了一个很值得研究学习的问题,下面,用我的理解来阐述一遍,这其中的原理。


首先请看电路图

97bc1dfe956a40fc9d057e6a88842251.png

在给GPIO配置输出的时候,其有两种工作模式可选,分别是推挽输出和开漏输出。

e437e2f2129a4c5baf47665a7d501644.png


在此之前先得了解mos管的工作原理,为了方便大家理解,我用通俗的语言来阐述

07ad29fdb0be467d998ccc2b9f1ab9d7.png

这是一个PMOS,他可以理解成一个低电平(逻辑0)开启的开关,图中的小圆点是非门的意思,也就给我们提示需要用一个低电平来导通这个pmos管

3fca844c5bc1442998892fcb3309c2ac.png

这是一个NMOS,他可以理解成一个高电平(逻辑1)开启的开关


在有了上面的认知,我们再来理解下面的问题

1、推挽输出

推挽输出的时候,是不需要上拉电阻的,其本身就有足够的驱动能力,但是其缺点是无法进行“线与”,一但进行了高低电平的“线与”, 就会发生短路的现象。

1.1分析其输出(用逻辑0和1来分析)

输入PMOSNMOS输出
0导通不导通1
1不导通导通0

推挽输出时,不管是输入0,还是1,都会有一个mos管是工作在导通状态。 

当输入0时,PMOS导通,那就把上面想成一个导线,NMOS不导通,那就想成电阻无穷大,根据节点电压,或者说分压原理,输出的那一段电压值,其实就是分在下面NMOS两端的电压,由于其阻止很大,因此分的也大,几乎是全部,也就是逻辑1了,

输入1时的情况也可以用我上面说的那种方法来理解,此处就不过多赘述了

1.2分析其不可“线与”

03ad675887464773a45c42abd6943e3a.png

这就是所谓的“线与”,就是把前一个的输出,直接接到后一个作为后一个的输入。而我上面画出的这种情况,也就是在最开始的时候输入一个0,其线与后就会反生如上图所示的短路(图中的叉叉表示不导通),所以我们说推挽输出,不可以“线与”。

2、开漏输出

所谓的开漏就是,没有VDD,也就是如下图所示的状态

6cf5361df2284873bbd282fb8635fb5d.png

由于上面不接VDD了,上面的PMOS也就不工作了,真正工作的只有下面的NMOS,原来的电路也就可以等效成下面这样,其与单个NMOS工作没什么差别。

48b38db6301240cd95ef52a6fffc02e0.png

输入NMOS状态输出
0不导通高阻态
1导通0

在其不导通的时候,nmos管相当于一个很大的电阻,也就是我们所说的高阻态;而在其导通的时候,就相当于直接接地了,所以就是逻辑0。

由于其不导通和导通的时候是高阻和0,所以其可以进行“线与”,就相当于多个电阻进行连接,并没有什么电源,也就不存在什么短路。

因此,为了提高其驱动能力,STM32的线路设计上在后面又给它加了个上拉电阻,也就是下面这个图,这也是为什么开漏输出需要上拉电阻的原因。

 ac57ffbceb0e4900823b9e3bd5754335.png

另外,使用开漏输出,还可以根据上拉电阻的阻值大小不同,控制输出电平的大小,其中原理就是一个很简单的分压原理, 也就是说其可以进行电压转换。

总结

推挽输出:不需要上拉电阻,不可“线与”,不可电平转换

开漏输出:需要上拉电阻,可以进行“线与”,可以电平转换

 

 

 

 

 

 

 

### 推挽输出输出的区别 #### 结构差异 推挽输出是一种通过上下两个关控制的结构,其中高电平输出由上部关完成,低电平输出由下部关实现[^1]。相比之下,输出仅提供了一个用于导通或截止的下拉关,而其高电平状态依赖于外部上拉电阻来维持[^3]。 #### 驱动能力对比 推挽输出由于具备独立的上下关,因此能够高效地驱动负载并快速切换高低电平,具有较强的高低电平驱动能力。然而,输出因其高电平需依靠外部上拉电阻,通常不具备强大的驱动能力,尤其是在高频场景下的表现会受到限制[^4]。 --- ### 应用场景分析 #### 输出的应用场合 输出适合需要灵活调整输出电压的情况,比如当微控制器的工作电压较低(如STM32的3.3V),但实际应用中需要更高的电压信号(如5V)时,可以通过外加上拉电阻到目标电压源来满足需求。此外,输出还广泛应用于总线通信协议中,例如I²C通信中的“线与”特性就需要利用输出配合外部上拉电阻实现[^2]。 #### 推挽输出的应用场合 对于需要高速切换且稳定输出高低电平的任务,推挽输出更为适用。例如,在生成脉宽调制(PWM)信号或串行外设接口(SPI)数据流时,推挽输出可以确保信号质量不受影响。另外,一些通用输入/输出端口默认采用推挽模式以便更好地支持多种功能需求,同时也避免因误配置而导致短路损坏的风险。 --- ### 示例代码展示 以下是两种输出类型的简单模拟实现: #### 设置GPIO为推挽输出 (以STM32为例) ```c // 初始化GPIO为推挽输出模式 void GPIO_Init_PushPull(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 启用GPIOA时钟 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; // PA0引脚 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 输出速度50MHz GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` #### 设置GPIO为输出 (以STM32为例) ```c // 初始化GPIO为输出模式 void GPIO_Init_OpenDrain(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 启用GPIOA时钟 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; // PA0引脚 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD; // 输出模式 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 输出速度50MHz GPIO_Init(GPIOA, &GPIO_InitStruct); // 外加上拉电阻至所需电压 } ``` ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翔在天上飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值