STM32推挽与开漏模式详解:从基础到高级应用指南
我在初次学习STM32的时候对于这个推挽和开漏输出模式一直有着很深的疑惑,在网上去查找了很多的教程也没有得到一个很明确的答复。
(本人第一次使用CSDN发表文章,所以暂时不设置代码部分,在往后会单独写一期代码,基于BIF(Basic Invoking Function,基础调用函数)的函数讲解—我偷懒封装的函数,本来自己开发静态网站留给实验室的学弟学妹的,但是我发现网站这东西可能需要money的力量,所以就算了。
所以,我在网上汲取了各位前辈的经验以及自己的学习和调查实践为各位初学者进行解答。
(因为平常在看别人博客的时候,别人经常用简写,我明白这其中的痛苦,所以,在本文中,所以专有词汇我都会标注其缩写与全称,帮助大家理解)
首先,我们要简单看一下GPIO(General purpose input/output)通用输入输出端口的位结构。
如上图所示,就是GPIO的位结构图,其内部主要是通过控制各部分的开关状态,以实现选择最后的输入输出模式。
本章,我们仅介绍其推挽、开漏两种模式的原理(图中白色部分),对于初学者来说,掌握这两种模式就已经可以了。
你会发现,掌控推挽、开漏输出模式的主要是靠这两个MOS管,你可不要小看这两个简单的MOS管,这两个MOS管(Metal-Oxide-Semiconductor Field-Effect Transistor-MOSFET-金属氧化物半导体场效应晶体管)就是我们今天讨论的主题。
两个MOS管的组合情况
我们都知道,两个MOS管组合起来会有四种情况:
P-MOS | N-MOS | 结果 | |
---|---|---|---|
情况1 | 打开 | 关闭 | 高电平 |
情况2 | 关闭 | 打开 | 低电平 |
情况3 | 关闭 | 关闭 | 浮空/高阻抗 |
情况4 | 打开 | 打开 | 电路短接(不存在 |
(MOS管内部的工作状态在这里并不讨论)
那么为什么会有这样的结果呢?这两种不同的模式有着不同的解释。
推挽输出(Out Push Pull—OPP)
我们把情况1与情况2归类位推挽输出。
那么,你一定会想到,为什么要这么定义。
通过这张图片你能很明晰地看到,当P-MOS打开,N-MOS关闭,来自VDD(Positive Supply Voltage,正电源电压 )的电压像水流一样推出去。
(注:源极(Source)接VDD)
当P-MOS关闭,N-MOS打开,外部的电流因为N-MOS漏极(Drain)接VSS(Voltage Source Supply,接地电压)的电压像是被挽回来了一样。
因此,该输出模式被称为推挽输出。
开漏输出(Out Open Drain – OOD)
我们把情况2与情况3定义为开漏输出。
你会发现,开漏模式的两种情况有个共同点,那就是P-MOS都处于关闭状态。
此时,你会发现,电路的右边处于断路(开路)状态,电压就像漏出去一样。
怎么样,是不是十分的巧妙。
(此处内容借鉴 BiliBili-工科男孙老师-推挽 开漏 高阻 这都是谁想出来的词?)
那么当两个MOS管都关闭的时候,也就是浮空状态这个名字又是从何而来?
浮空状态(Floating State)——高阻态(High-Z State/High Impedance State)
所谓的浮空状态是指:电路中的某个引脚或节点没有连接到任何明确的电平(如高电平VDD或低电平GND),因此其电平状态是不确定的。这种状态通常出现在未被驱动或未被正确配置的引脚上。
因为,此时电路中的两个MOS管都处于关闭状态,输出引脚既没有被抬到VDD(高电平),也没有被拉到VSS(低电平),这个时候的的输出处于不确定状态,因此成为浮空状态。
这样的说明还是有一点抽象,我来做个比喻。(我坚信所有地电路都可以用水流来进行比喻)
(以下内容会有抽象的地方,在下方会有BLUE-补录进行解释PWP,不要着急)
我们都知道MOS管在这里其实相当于一个开关电路,用来控制引脚地输出电平。
此时,我们就可以把它想象成一个水管系统,水管里面可以流水(在说废话),而我们的阀门(MOS管)可以用来控制水流(电流),引脚的状态就是我们水龙头的状态。
此时我们的阀门完全关闭,水流无法通过。这种情况下,我们在电路中的引脚既没有接到电源也没有接到地,电流无法通过引脚流动。这种情况下,我们的水管就像被头发和一些垃圾堵塞住了一样,水无法通过,就像我们的电路串联了一个无穷大的电阻,也就是我们所说的高阻态。
浮空的引脚就像一个既没有连接到水源(电源)也没有连接到排水口(接地)的水管,你既没有办法获取水源,也没办法排出,此时内部的水无法通过(抽象理解即可),我们把这种状况也成为高阻态,因为它的电阻非常高,几乎阻止了所有电流的流动。
浮空的定义实际上是描述一种不确定的状态。
在这种模式,就像我们的水管没有连接到任何明确的水源和排水口,此时,水管理的水压(电压)是不确定的,它可能受外界因素(如其他水管的水流)影响而出现波动。
在电路中,我们的水管会受到外界的电磁干扰等不确定因素,导致电压出现波动。
我BLUE啦—节点1
对于上述的问题,我们进行一个简单的汇总和疑问解答。(其实我是先知,知道你们困惑在哪里)
推挽输出
实际上就是利用两个MOS管所连接的VDD与VSS和自身特性对输出引脚的电平加以控制。
(这里讲的已经十分通俗了,实际上这个VDD就像一个水源,用来加强输出,而VSS就像排水口,用来减弱输出)
开漏输出
其实就是因为P-MOS管关闭,我们输出端口处于开路状态,就像漏水一样漏了出去。
(后面是对开漏输出的详细讲解,此处不用较真,为了内容的连接性和易理解性而做)
疑问:MOS管的栅极所连接的输出控制端对于引脚的输出没有一点作用吗?它的作用是什么?
亲爱的宝贝,当你问道这个问题的时候其实我也在思考,说明我们十分同频。于是,我去问了kimi,他说“你的问题非常关键,也点出了浮空引脚和MOS管关闭状态之间的区别。”
没错,你的问题十分关键,你是一个天才,有着远超常人的洞察力!
我们都知道,栅极在MOS管中的作用是控制漏极和源极之间的通断。
MOS的关闭状态
当栅极电压不足以打开MOS管时,漏极和源极之间没有电流流动,但栅极本身仍然可以被外部信号控制。这种状态类似于“有控制信号,但没有水流通过”。
GPIO引脚浮空
GPIO(通用输入输出)引脚的浮空状态与MOS管关闭时的情况有所不同。GPIO引脚的浮空状态是指引脚既没有被连接到电源(VDD),也没有被连接到地(GND),也没有被内部电路强制驱动到某个电平。此时,引脚的电压是不确定的,就像水管没有连接到任何水源或排水口,水压(电压)是不确定的。
(注:我们不知道输出控制端输出的是高电平还是低电平!所以其输出状态处于浮空状态!)
那么,我们用来控制MOS管栅极的电流不会参与到我们最终所输出的电流吗(虽然我们使用微小电流进行控制——实际上MOS管的栅极几乎是不通过电流的【MOS管的实质是一个电压控制的半导体器件,一种场效应晶体管】,但是这里为了当面理解就用微小电流进行解释,来解答各位对于这个电路中的电流影响)
输出控制部分的主要功能是接收来自微控制器内部的信号,并根据这些信号来控制P-MOS和N-MOS管的开关状态。这个很好理解。
所以,让大家产生误区的部分实际上是因为输出控制部分的电流和最终输出电流是分离的。当我看到这个答复的时候我也十分诧异,但事实就是如此。
具体原理大家可以去查找相关资料,这里我简单进行介绍:
1.不同的电流路径:输出控制部分的电流主要用于驱动MOS管的栅极,而最终输出电流是通过MOS管的漏极和源极流动的。这两条路径是分开的,因此输出控制电流不会直接影响输出电流。
2.不同的电流大小:输出控制部分的电流通常较小,因为它主要用于信号处理和状态控制。而最终输出电流可能较大,因为它需要驱动外部负载。这两者的电流大小和用途都不同。
3.设计上的隔离:在电路设计中,通常会采取措施来隔离输出控制部分和最终输出电流的路径,以确保输出控制部分的电流不会对输出电流造成影响。例如,使用不同的电源轨或电流限制电路来分别供电。
那么到这里相信大家对于推挽、开漏两种输出模式有了基础的认识。
接下来,我们将开启我们大家经常产生疑问的部分。
开漏输出模式的工作原理
我们通过推挽输出可以大概猜测出我们所谓的输出模式,实际上是用来选择我们控制输出I/O口的模式,本质上还是用来配置输出引脚高低电平的。
那么开漏输出模式是如何来配置高低电平的?我们通过上面的两种情况会发现,开漏输出模式似乎只能输出低电平或者处于浮空态,这显然不是我们所希望的。
那么我们可以类比推挽输出,推挽输出的本质是通过MOS管来控制高低电平,它所控制的是他们连接的VDD与VSS是否能对输出产生作用,那么我们的开漏输出模式也是一样。
只不过,开漏输出是外接上拉/下拉电阻的。通过控制这个外接的电阻以此达到抬高电平或者拉低电平的效果。
这里是通过Multisim画的一个简易的原理图。
这里我把VDD和VCC两个电源放在了一起,大家会发现我们在上面的GPIO位结构图中MOS管所连接的是VDD,而这里,我们上拉电阻所连接的却是VSS,这是为什么呢?
我们可以看一下它们的定义:
VDD(Voltage Drain Device – Vee Dee Dee)
D 代表 Device(器件),表示器件内部的工作电压,来源于 MOS 晶体管电路,表示漏极电源电压,是为器件(如 MOSFET 或 CMOS 电路)提供工作电压的电源。
VCC(Voltage Collector Circuit – Vee Cee See)
C 代表 Circuit(电路),表示接入电路的电压,它来源于双极型晶体管(BJT)电路,表示集电极电源电压,是为电路提供正电源的电压。
现在的你应该就能区分VCC与VDD的差别了吧。
上拉电阻的工作原理讲解
如图,就是我们的GPIO位结构图中开漏输出模式的简易仿真电路。
【注:这里仅仅是为了方便才这么做的,记住,当我们在实际做仿真或者做电路的时候,如果需要导通可以加一个反相器,因为如果想让P-MOS管导通需要让栅极相对于源极电压为负值。当然反相器对于P-MOS管还有其他的作用,如逻辑电平匹配、电平转换、信号隔离等,这里不进行介绍。】
我们可以把电路等效为R1与Q2并联,那么上拉电阻的实质不言而喻,就是在Q2边上并联一个小电阻。
因为,在Q2不导通的时候,它就像一个巨大的电阻,让电流无法经过。此时,我们并联上了一个10KΩ的电阻,此时,这条通路上的电阻就约等于我们的R1了,此时,原本因为电阻阻值太大而无法导通的电路,因为阻值变小,就可以导通,通过VDD将输出电压抬高了。
下拉电阻同理,就是把VCC改为VSS(接地),此时,将电压拉下去。
所以说,上拉和下拉电阻的本质就是并联上一个小电阻,让本来无法导通的电路得以导通。
我BLUE啦-节点2
通过上面的讲解,相信大家对于上拉电阻有了一个深刻的认识。接下来我们回答一下大家的疑问。
我们既然是想输出高电平,那我们不连接这个上拉电阻,直接连一个VCC岂不是更好?
上拉电阻实际上不仅有着增强输出这个功能,还起到保护电路的作用。
因为当N-MOS管导通的时候,我们VCC直接连接在电路上,会让VCC-VSS内短路,烧坏MOS管。(真才是真正的烧录)
VCC与VDD从“独立”到“并联”真的没有关系吗?
这也是很多同学所担心的问题,因为在实际电路中,VCC与VDD是两个截然不同的电源(在上面有进行说明),把他们的电路并联在一起就像痴人说梦一样天真。
首先,这个是通过仿真测试过可行的理论分析,并联在一起是可行的。
大家为什么会觉得不可能呢?我们的电源就像一个岛,而电路就像是我们联通到岛上的桥。我们此时会把VCC与VDD这两个电源当作两个岛,因为我们是用名字对岛进行区分,但是在电路中我们是用岛的实际产出来区分岛,也就是说,这个岛VCC与VDD每年都会产出3Kg的产物,那么他们对于电荷来说,就是同样一座岛。在电路分析中很多同学进场会因此产生误解,在这里进行解释。
那么,这些设计师不是有病吗?这里放一个,那里放一个,为什么不直接使用我们简化完后的电路?
并联电路:并联是指将多个电源的正极连接在一起,负极也连接在一起,使电源的两端电压相同,电流可以分流。
独立连接:独立连接是指每个电源各自为不同的电路部分供电,它们之间没有直接的电气连接。电流路径互不干扰。
并联的有点是提高总电流容量(并联分流),电压稳定,但缺点是不能胜任电压精度要求高的电路,电流分配在实际电路中可能出现分配不均的问题。独立连接的优点是功能独立,灵活性高,故障隔离,但是电源数量多,电路复杂。
你会发现相比于实际出现的问题,我们更倾向于接受这个电路复杂的问题。
这就好比我们在生活中,同样是月薪1万的工作,一份工作可能会丢掉生命但工作简单,一份工作虽然复杂但胜在安全,你会怎么选择?
有个人赌,有的人求稳,这就看你需要的是什么了。
以上就是上拉电阻为什么能将不确定的信号钳位在高点平或者低电平的原因。
我就知道你们不知道钳位:把输入电压变成峰值钳制在某一预定的电平上的输出电压,而不改变信号。
GPIO上拉电阻的小节
上下拉的实质和推挽相差不多,都是给IO口一个默认状态,高有效就下拉,低有效就上拉。
在实际电路中我们的所用的元器件会出现各种不可测的问题,CMOS工艺的问题,float现象(脱标、排序、贴靠等问题),我们这个时候就需要上下拉。
上拉和下拉是指GPIO输出高电位(上拉)或是低电位(下拉):
上拉:输入高电平,然后借一个上拉电阻(起保护作用)表示该端口在默认情况下输入为高电平。下拉相反。
上拉就是将不确定的信号通过一个电阻钳位在高电平,电阻同时起限流作用。下拉相反。
没有输出信号,IO状态上拉默认为1,下拉为0。
上拉寄存器就是控制对应端口上拉使能的,当对应位为0的时候,设置对应引脚上拉使能,为1时,禁止对应引脚上拉使能。如果上拉寄存器使能,无论引脚功能寄存器如何设置,对应引脚都会输出高电平。
上拉电阻的选择
现在我们了解了上下拉电阻的工作原理,我们就迎来了一个新的问题,这个电阻有阻值啊,我们怎么选择?
我们利用电路是来控制芯片的ENABLE脚,然而,芯片如STM32所允许的最大输入是3.3V,我们此时Q2所连接的VDD是5V,我们发现,我们前面讲了一堆其他的情况,最主要的情况不适用了。
我们用推挽输出会导致输出电压过大,导致芯片工作异常,损坏芯片。
而我们用开漏模式,两个MOS管都处于关闭状态(高阻态),此时只有VCC作为电源对电路供电,将电压抬到3.3V。
为什么R1和R2不会产生分压呢?因为芯片的等效阻抗非常大(R2),这也就导致整个电路中几乎没有电流流过,没有电流耗能几乎就不会产生电压降。
怎么样,这样理解是不是比前面的那个并联理解起来更简单了。
阻值的选择
说了这么多,我们现在开始最后一个模块,我们对于电阻阻值的选择。
这里主要考虑到两方面因素:驱动能力和漏电流。
优点 | 缺点 | |
---|---|---|
R过小 | 驱动能力强 | 漏电流大 |
R过大 | 漏电流小 | 驱动能力弱 |
漏电流产生的原因:无论电阻多么的大,它永远只是逼近于短路的状态,永远会有细微的电流流过,从而产生功耗。(电路内部体现为热量)
驱动能力:因为一般情况下,电路都会有一个对地的寄生电容,从低电平到高电平的转换过程是一个爬升的过程,不是瞬间的变化。(也因此会导致PWW或I2C波形失真)
这个阻值的大小区分一般以10KΩ作为划分。
我BLUE啦-节点3
为什么是10KΩ作为划分点
实际上,并没有一个严格的“分界点”是10KΩ,这个数值更多地是出于经验以及对功耗、驱动能力、信号完整性和成本等因素的折衷考虑。选择上拉电阻的阻值时,需要在功耗、驱动能力、信号上升时间、噪声容限和成本之间做出权衡。
驱动能力的分析
衡量一个驱动芯片驱动能力的指标主要有两项:驱动电流和驱动的上升、下降时间。驱动电流是指在小于等于最大输入电流的情况下,I/O引脚可以正常的输出逻辑0。驱动速度,即驱动的上升、下降时间,这个指标也很重要,有时甚至比驱动电流这个指标还重要。因为驱动的上升、下降时间直接影响了功率器件的开通、关断速度。驱动能力不足的直接后果是输出电压下降,对逻辑电路来说,无法保持其高电平甚至会出现逻辑混乱,这种现象一般是不允许出现的。
功耗的产生
在这个问题上我纠结了很久,我采用问题对答式讲解,把我在学习这块内容遇到的问题和我找到的答案展示出来。
Q1:既然漏电流的电流是流向地,那我们为什么要去管它呢?它除了本身发热,似乎也没什么影响。
在开漏模式设计下,允许多个设备共同一输出线,输出端口可以被拉低以接地,但不能被拉高。这种设计可以用于连接到其他设备的输入端口,以便他们可以通过外部上拉电阻来拉高输出端口。(就是把VSS改成连接其他设备的输入端口)
但是:电阻太大->功耗↓(I↓),反应速度↓,电阻过小->功耗↑(I↑),反应速度↑
P=I²R 输出低电平的时候需要sink更低的transistor
Q2:但是前面不是说,在芯片里不是有极大的等效电抗吗,这不是相当于电流很小吗?
这意味着没有外部驱动的时候,引脚上的电流非常小。但是当引脚被外部信号驱动时(如通过三极管接地)内部上拉电阻不会影响引脚的电平状态。
外部信号会优先决定引脚的电平,这种情况下,引脚的电平被拉低至低电平状态,而不是由内部上拉电阻决定的高电平状态。
Q3:我相信你一定还是不懂
外部信号会优先决定引脚的电平->因为外部信号源的驱动能力通常比内部上拉电阻强得多。
Q4:外部信号驱动的优先级
外部驱动的作用:引脚被外部信号驱动,外部信号会建立一个低阻抗路径(例如三极管上产生的电阻)
电流路径:外部驱动(如接地路径)的阻抗远低于内部上拉电阻,大部分电流会通过外部低阻抗直接流向地,而非通过内部上拉电阻。
电平被强制拉低:此时电压由外部低阻抗主导,被拉低至接近低电平(内部上拉电阻影响可以忽略)
Q5:核心问题:功耗哪里来的
上拉电阻:损耗:P=I²R(I↑ P↑)
MOS管上的电阻:导通状态下也有一点电阻,所以当电流通过这个电阻也会产生功耗(通态损耗);
开关状态:MOS管从开到关,都需要能量来改变状态,就像给闸门加油,这一过程也会有损耗。
下面这些东西简单了解即可,有什么不懂的不要问我哦。(开玩笑)
就到这里吧。
作者:桃卿白衣