open-drain, push-pull,MOSFET, MOS管,三极管等基础知识

【open-drain与push-pull】

GPIO的功能,简单说就是可以根据自己的需要去配置为输入或输出。但是在配置GPIO管脚的时候,常会见到两种模式:开漏(open-drain,漏极开路)和推挽(push-pull)。

对此两种模式,有何区别和联系,下面整理了一些资料,来详细解释一下:

 

图表 1 Push-Pull对比Open-Drain

 

Push-Pull推挽输出

Open-Drain开漏输出

原理

输出的器件是指输出脚内部集成有一对互补的MOSFET,当Q1导通、Q2截止时输出高电平;而当Q1截止导通、Q2导通时输出低电平

开漏电路就是指以MOSFET的漏极为输出的电路。

指内部输出和地之间有个N沟道的MOSFET(Q1),这些器件可以用于电平转换的应用。输出电压由Vcc'决定。Vcc'可以大于输入高电平电压VCC(up-translate)也可以低于输入高电平电压VCC(down-translate)。

某老外的更加透彻的解释

Push-pull输出,实际上内部是用了两个晶体管(transistor),此处分别称为top transistor和bottom transistor。

通过开关对应的晶体管,输出对应的电平。

top transistor打开(bottom transistor关闭),输出为高电平;

bottom transistor打开(top transistor关闭),输出低电平。

 

Push-pull即能够漏电流(sink current),又可以集电流(source current)。其也许有,也许没有另外一个状态:高阻抗(high impedance)状态。除非Push-pull需要支持额外的高阻抗状态,否则不需要额外的上拉电阻。

Open-drain输出,则是比push-pull

少了个top transistor,只有那个bottom transistor。

(就像push-pull中的那样)当bottom transistor关闭,则输出为高电平。

此处没法输出高电平,想要输出高电平,必须外部再接一个上拉电阻(pull-up resistor)。

 

Open-drain只能够漏电流(sink current),如果想要集电流(source current),则需要加一个上拉电阻。

常见的GPIO的模式可以配置为open-drain或push-pull,具体实现上,常为通过配置对应的寄存器的某些位来配置为open-drain或是push-pull。

当我们通过CPU去设置那些GPIO的配置寄存器的某位(bit)的时候,其GPIO硬件IC内部的实现是,会去打开或关闭对应的top transistor。相应地,如果设置为了open-d模式的话,是需要上拉电阻才能实现,也能够输出高电平的。因此,如果硬件内部(internal)本身包含了对应的上拉电阻的话,此时会去关闭或打开对应的上拉电阻。如果GPIO硬件IC内部没有对应的上拉电阻的话,那么你的硬件电路中,必须自己提供对应的外部(external)的上拉电阻。

 

而push-pull输出的优势是速度快,因为线路(line)是以两种方式驱动的。

而带了上拉电阻的线路,即使以最快的速度去提升电压,最快也要一个常量的R×C的时间。其中R是电阻,C是寄生电容(parasitic capacitance),包括了pin脚的电容和板子的电容。

但是,push-pull相对的缺点是往往需要消耗更多的电流,即功耗相对大。

而open-drain所消耗的电流相对较小,由电阻R所限制,而R不能太小,因为当输出为低电平的时候,需要sink更低的transistor,这意味着更高的功耗。(此段原文:because the lower transistor has to sink that current when the output is low; that means higher power consumption.)

而open-drain的好处之一是,允许你cshort(?)多个open-drain的电路,公用一个上拉电阻,此种做法称为wired-OR连接,此时可以通过拉低任何一个IO的pin脚使得输出为低电平。为了输出高电平,则所有的都输出高电平。此种逻辑,就是“线与”的功能,可以不需要额外的门(gate)电路来实现此部分逻辑。

原理图

图表 2 push-pull原理图

【整理】open-drain, push-pull,MOSFET, MOS管,三极管等基础知识 - carifan - work and job
 
 

 

 

 

 

 

 

 

图表 3 open-drain原理图

【整理】open-drain, push-pull,MOSFET, MOS管,三极管等基础知识 - carifan - work and job



图表 4 open-drain“线与”功能

【整理】open-drain, push-pull,MOSFET, MOS管,三极管等基础知识 - carifan - work and job

优点

(1)可以吸电流,也可以贯电流;

(2)和开漏输出相比,push-pull的高低电平由IC的电源低定,不能简单的做逻辑操作等。

(1) 对于各种电压节点间的电平转换非常有用,可以用于各种电压节点的Up-translate和down-translate转换
(2)可以将多个开漏输出的Pin脚,连接到一条线上,形成“与逻辑”关系,即“线与”功能,任意一个变低后,开漏线上的逻辑就为0了。这也是I2C,SMBus等总线判断总线占用状态的原理。

(3)利用 外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经R pull-up ,MOSFET到GND。IC内部仅需很下的栅极驱动电流。

(4)可以利用改变上拉电源的电压,改变传输电平:

图表 5 open-drain输出电平的原理

【整理】open-drain, push-pull,MOSFET, MOS管,三极管等基础知识 - carifan - work and job

IC的逻辑电平由电源Vcc1决定,而输出高电平则由Vcc2决定。这样我们就可以用低电平逻辑控制输出高电平逻辑了。

缺点

一条总线上只能有一个push-pull输出的器件;

 开漏Pin不连接外部的上拉电阻,则只能输出低电平。

 

当输出电平为低时,N沟道三极管是导通的,这样在Vcc'和GND之间有一个持续的电流流过上拉电阻R和三极管Q1。这会影响整个系统的功耗。采用较大值的上拉电阻可以减小电流。但是,但是大的阻值会使输出信号的上升时间变慢。即上拉电阻R pull-up的阻值 决定了逻辑电平转换的沿的速度  。阻值越大,速度越低功耗越小。反之亦然。

特点

在CMOS电路里面应该叫CMOS输出更合适,因为在CMOS里面的push-pull输出能力不可能做得双极那么大。输出能力看IC内部输出极N管P管的面积。

push-pull是现在CMOS电路里面用得最多的输出级设计方式。

 

 

【open-drain和push-pull的总结】

对于GPIO的模式的设置,在不考虑是否需要额外的上拉电阻的情况下,是设置为open-drain还是push-pull,说到底,还是个权衡的问题:

如果你想要电平转换速度快的话,那么就选push-pull,但是缺点是功耗相对会大些。

如果你想要功耗低,且同时具有“线与”的功能,那么就用open-drain的模式。(同时注意GPIO硬件模块内部是否有上拉电阻,如果没有,需要硬件电路上添加额外的上拉电阻)

正所谓,转换速度与功耗,是鱼与熊掌,二则不可兼得焉。

 

【MOS管的分类】

图表 6 MOS管分类

MOS管

JFET

(结型场效应管)

 

 

MOSFET

(金属绝缘栅型场效应管)

 

N(Negative)

沟道

增强型

耗尽型

P(Positive)

沟道

增强型

耗尽型

 

MOSFET是在JFET基础上发展起来的,两者结构上存在一些差异,但使用方法和特点基本类似。

 

【MOS管和三极管的比较】

图表 7 MOS管和三极管的比较

 

MOS管

三极管

控制方式

电压控制器件

电流控制器件

输入阻抗

特别高

相对小

输出电阻

驱动能力强

相对大

截止频率

通过电流能力

功率大,要找一个小电流的MOS很不容易

稳定性

可以工作在极高的频率下

相对不好

击穿电压

非常容易受静电影响,管脚不用的话一定要接地或者接电源。

有些管脚不用的话,把脚悬空都问题不大

易用性

不好

用法要稍微复杂一点,比如P沟道的MOS管,需要负电压来控制,相对三极管中的PNP管,明显要复杂得多。

电子初学者中熟悉三极管用过三极管的要远远多于熟悉MOS管的,小功率塑封三极管比如9000系列,8050,8550之类的非常容易买到,而且价格便宜,在信号放大和简单开关方面都用得很多,也非常方便。 

总结

现在的集成电路多半使用MOS为基础

 

      

 

【三极管,PNP,NPN】

P是positive阳极,N是negative阴极;

P极中空穴多显正极性,N极中电子多显负极性;

PNP和NPN就是三级管的叠放次序,P和N靠在一起会形成PN结,所以三极管中会有两个PN结,所以又称为双极结晶体管。

 

【场效应管与三极管】

场效应管和三极管的功能、作用一样,可以用于放大、振荡、开关电路。

N沟道场效应管和NPN三极管类似,工作条件是在栅极加正向极性控制电压,在漏极加正极性电源电压,改变栅极电压就可以改变漏极与源极之间的电流大小。

P沟道场效应管和PNP三极管类似,工作条件是在栅极加负极性控制电压,在漏极加负向极性电源电压,改变栅极电压就可以改变漏极与源极之间的电流大小。

目前应用比较广泛的是N沟道场效应管,就像三极管NPN型应用比较多一样。

 

【参考资料】

1. question: push-pull or open-drain mode

http://www.edaboard.com/thread97365.html

2. open-drain and push-pull

http://blog.21ic.com/user1/2873/archives/2008/49225.html

3. Open drain & push pull 原理(转)

http://blog.csdn.net/asdfasdfhhh/article/details/4289514

4. 谁能告诉我三极管,mos管和mosfwt到底怎么区分啊??

http://zhidao.baidu.com/question/102122419.html

5. MOSFET和三极管的主要区别

http://blog.ednchina.com/cym_anhui/99752/message.aspx

6. 场效应管和三极管的NPN, PNP是什么意思,他们在电路中有什么作用

http://zhidao.baidu.com/question/234717192.html?pt=dwso_1_pg

7. 教你通俗易懂的理解三极管

http://bbs.dianyuan.com/index.php?do=tech_info_show&cate_id=0&id=11970&page=2

8. 场效应管的工作条件,通俗易懂点!最好类比三极管NPN和PNP以及N沟道和P沟道的

http://zhidao.baidu.com/question/115497382.html?fr=qrl&cid=86&index=3

9. The difference in open-drain and push-pull

http://www.electro-tech-online.com/general-electronics-chat/5535-difference-open-drain-push-pull.html

10. Open drain and push-pull

http://www.motherboardpoint.com/open-drain-and-push-pull-t89968.html

<think>好的,我现在需要帮助用户解决.NET MAUI项目8.0升级9.0后,在8.0环境下编译报错的问题。首先,我得理解用户的具体情况。用户已经将项目升级到了9.0,但可能在配置中没有正确设置多目标框架,导致在8.0环境下出现编译错误。 首先,我应该考虑项目文件中的目标框架配置。在.NET MAUI中,通常需要指定目标框架为特定版本,比如net8.0net9.0。如果用户升级9.0后,项目文件可能只引用了net9.0,而原来的环境还是8.0,这时候如果其他依赖项或构建工具仍然指向8.0,就会导致兼容性问题。因此,用户可能需要检查项目文件中的<TargetFramework>或<TargetFrameworks>标签是否正确设置为net9.0,或者是否需要多目标支持。 接下来,关于SDK和工具的版本问题。升级9.0需要安装对应的.NET 9.0 SDK,并且Visual Studio或MAUI工具也需要支持该版本。如果开发环境中没有正确安装9.0的SDK,或者构建服务器上仍然使用8.0的工具链,可能会导致编译错误。用户应该检查开发环境和CI/CD管道中的工具版本是否一致。 依赖项兼容性也是一个关键点。升级后,NuGet包可能需要更新到支持9.0的版本。如果某些包在9.0下没有兼容版本,或者用户手动引用了特定于8.0的包,这会导致冲突。用户需要检查所有依赖项是否支持9.0,并更新它们到最新兼容版本。 另外,条件编译符号可能影响代码在不同版本下的编译。如果代码中有针对特定版本的预处理指令,比如#if NET8_0升级9.0后可能需要调整这些条件,或者添加针对NET9_0的符号,以确保代码在不同环境下正确编译。 构建缓存的干扰也可能导致问题。有时候旧的构建缓存没有清理干净,会导致新配置未能生效。建议用户执行清理操作,删除bin和obj目录,然后重新构建项目。 最后,用户可能还需要参考微软的官方迁移指南,或者使用升级助手工具来确保所有必要的更改都已正确应用。例如,引用中提到的.NET Upgrade Assistant可以帮助自动化部分升级步骤,减少人为错误。 综合这些可能的原因,我需要逐步引导用户检查项目配置、工具版本、依赖项、条件编译以及清理构建缓存,并提供具体的操作步骤和示例,帮助他们解决问题。同时,生成相关问题可以帮助用户进一步处理其他可能的升级障碍,比如依赖冲突或API变更。</think>### 分步解决方案 **问题原因分析:** .NET MAUI项目8.0升级9.0后,若在8.0环境下编译报错,主要与以下原因相关: 1. **目标框架版本冲突**:项目文件(`.csproj`)中未正确配置多目标框架(Multi-Targeting),导致编译环境无法适配旧版本[^2][^3]。 2. **SDK或工具链版本不匹配**:开发环境未安装.NET 9.0 SDK,或构建工具链仍指向旧版本。 3. **依赖包兼容性问题**:升级后部分NuGet包未适配.NET 9.0,或版本锁死在.NET 8.0[^1]。 --- **解决方案步骤:** #### 1. **检查并修正目标框架配置** 在项目文件(`.csproj`)中确认目标框架是否已正确设置为`net9.0`: ```xml <!-- 升级后应明确指定目标框架 --> <TargetFramework>net9.0</TargetFramework> <!-- 或支持多目标(如需兼容旧版本) --> <TargetFrameworks>net9.0;net8.0</TargetFrameworks> ``` 若需同时支持.NET 8.09.0,需使用多目标配置,并通过条件编译符号区分版本(如`#if NET8_0`)[^2]。 #### 2. **更新开发环境与工具链** - 安装最新.NET 9.0 SDK(需从微软官网或Visual Studio Installer获取)。 - 在Visual Studio中更新MAUI工作负载: ```bash dotnet workload install maui ``` - 确保CI/CD流水线中使用的构建工具链也升级.NET 9.0。 #### 3. **验证依赖包兼容性** - 检查所有NuGet包是否支持.NET 9.0,通过NuGet包管理器更新至最新兼容版本。 - 移除或替换明确不支持.NET 9.0的依赖包(如某些旧版本社区库)。 #### 4. **处理条件编译与API变更** - 若代码中使用了版本相关API,需通过预处理指令隔离差异: ```csharp #if NET9_0 // .NET 9.0特定代码 #elif NET8_0 // .NET 8.0兼容代码 #endif ``` - 若遇到API废弃或变更,参考[.NET 9.0迁移文档](https://learn.microsoft.com/dotnet/core/compatibility/9.0)进行调整。 #### 5. **清理构建缓存** 旧版本的构建缓存可能导致冲突,执行以下命令清理: ```bash dotnet clean rm -rf bin/ obj/ # 手动删除生成目录(适用于Unix系统) ``` --- **示例配置修正:** ```xml <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net9.0</TargetFramework> <!-- 或 --> <TargetFrameworks>net9.0;net8.0</TargetFrameworks> </PropertyGroup> </Project> ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值