当前位置: 首页 > news >正文

【电子通识】开漏输出和推挽输出有什么差别?

在看一些MCU芯片手册的时候,能发现GPIO的功能有开漏输出和推挽式输出。那么这两种输出到底有什么差别?

如下是STM32F10xxx参考手册中对于GPIO的功能描述:

 如下为GPIO内部框图:

在一些其他的芯片规格书中也同样看到不同的GPIO工作模式:

推挽输出

推挽输出的结构是由两个三极管或者MOS管受到互补信号的控制,两个管子始终保持一个处于截止,另一个处于导通的状态。电路工作时,两只对称的开关管每次只有一个导通,所以导通损耗小、效率高、既提高电路的负载能力,又提高开关速度。

推挽输出的最大特点是可以真正的输出高电平和低电平,在两种电平下都具有驱动能力(就是指输出电流的能力)。

对于驱动大负载时,例如IO输出为5V,驱动的负载为10ohm,根据欧姆定律可以得到负载上的电流为0.5A(推算出功率为2.5W)。显然一般MCU的IO不可能有这么大的驱动能力(大概在mA级别),也就是没有办法输出这么大的电流。于是造成的结果就是输出电压会被拉下来,达不到标称的5V。

当然如果只是数字信号的传递,下一级的输入阻抗理论上最好是高阻,也就是只需要传电压,基本没有电流,也就没有功率,于是就不需要很大的驱动能力。

对于推挽输出,输出高、低电平时电流的流向如下图所示。所以相比于开漏输出,输出高电平时的驱动能力强很多。

但推挽输出有也有缺点,如果当两个或多个推挽输出结构的GPIO相连在一起,一个输出高电平,即上面的MOS导通,下面的MOS闭合时;同时另一个输出低电平,即上面的MOS闭合,下面的MOS导通时。电流会从第一个引脚的VCC通过上端MOS再经过第二个引脚的下端MOS直接流向GND。

整个通路上电阻很小,相当于发生短路,进而可能造成端口的损害。这也是为什么推挽输出不能实现" 线与"的原因。
 

开漏输出

开漏输出和推挽输出的区别最普遍的说法就是开漏输出无法真正输出高电平(即高电平时没有驱动能力)需要借助外部上拉电阻完成对外驱动。

首先要了解开漏输出和开集输出。这两种输出的原理和特性基本是类似的,区别在于一个是使用MOS管,其中的"漏"指的就是MOS管的漏极;另一个使用三极管,其中的"集"指的就是MOS三极管的集电极。这两者其实都是和推挽输出相对应的输出模式,由于使用MOS管的情况较多,很多时候就用"开漏输出"这个词代替了开漏输出和开集输出。

左边的电路是开集(OC)输出最基本的电路,当输入为高电平时,NPN三极管导通,Output被拉到GND,输出为低电平;当输入为低电平时,NPN三极管闭合,Output相当于开路(输出高阻)。高电平时输出高阻(高阻、三态以及floating说的都是一个意思),此时对外没有任何的驱动能力。这个电路虽然完成了开集输出的功能,但是会出现input为高,输出为低;input为低,输出为高的情况。

右边的电路中多使用了一个三极管完成了"反相"。当输入为高电平时,第一个三极管导通,此时第二个三极管的输入端会被拉到GND,于是第二个三极管闭合,输出高阻;当输入为低电平时,第一个三极管闭合,此时第二个三极管的输入端会被上拉电阻拉到高电平,于是第二个三极管导通,输出被拉到GND。这样,这个电路的输入与输出是同相的了。

开漏输出的电路如图所示。原理与开集输出基本相同,只是将三极管换成了MOS而已,并且MOS管不会导致电平反相,所以只需要用一个就完成功能。

 开漏输出最主要的特性就是高电平没有驱动能力,需要借助外部上拉电阻才能真正输出高电平,其电路如图所示。

当MOS管闭合时,开漏输出电路输出高电平,且连接着负载时,电流流向是从外部电源,流经上拉电阻RPU,流进负载,最后进入GND。

开漏输出的这一特性一个明显的优势就是可以很方便的调节输出的电平,因为输出电平完全由上拉电阻连接的电源电平决定。所以在需要进行电平转换的地方,非常适合使用开漏输出。

开漏输出的这一特性另一个好处在于可以实现"线与"功能,所谓的"线与"指的是多个信号线直接连接在一起,只有当所有信号全部为高电平时,合在一起的总线为高电平;只要有任意一个或者多个信号为低电平,则总线为低电平。而推挽输出就不行,如果高电平和低电平连在一起,会出现短路电流倒灌,损坏器件。

比如一些充电芯片的STAT状态脚就会是这种开漏输出,这样不管接什么电平的IO脚都可以胜任:

总结

通过以上的分析,最终推挽输出与开漏输出的差别如下所示:

部分参考:​​​​​​GPIO推挽输出和开漏输出模式区别详解_gpio开漏输出和推挽输出输入的区别-CSDN博客

相关文章:

  • Centos7升级openssl到openssl1.1.1
  • Javaweb之SpringBootWeb案例员工管理分页查询的详细解析
  • R语言【paleobioDB】——pbdb_map_occur():通过化石分布记录,创建一个RasterLayer对象,和一个显示取样力度的图
  • 2401vim,vim实现任务列表
  • 【产品人卫朋】硬件产品经理:从入门到精通
  • Scott用户数据表的分析
  • #mysql 8.0 踩坑日记
  • R语言【文章复现】——集成式地绘制高分辨率的多样性分布图,对方法的检验和优化,以及处理思路的思考
  • SpringBoot内嵌Tomcat启动流程
  • 力扣2085-统计出现过一次的公共字符串
  • [E链表] lc83. 删除排序链表中的重复元素(单链表+模拟)
  • 竞赛保研 基于深度学的图像修复 图像补全
  • 【Python_PySide6学习笔记(三十一)】基于PySide6实现自定义串口设备连接界面类:可实现串口连接断开、定时发送等功能
  • 入门Docker1: 容器技术的基础
  • 1 快速前端开发
  • CentOS 7 防火墙操作
  • CSS 三角实现
  • gops —— Go 程序诊断分析工具
  • HTTP--网络协议分层,http历史(二)
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Vue2 SSR 的优化之旅
  • Web标准制定过程
  • 关于 Cirru Editor 存储格式
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 那些被忽略的 JavaScript 数组方法细节
  • 前端面试题总结
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 如何使用 JavaScript 解析 URL
  • 什么是Javascript函数节流?
  • 数组的操作
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • ​ubuntu下安装kvm虚拟机
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #、%和$符号在OGNL表达式中经常出现
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • $.ajax,axios,fetch三种ajax请求的区别
  • (145)光线追踪距离场柔和阴影
  • (ibm)Java 语言的 XPath API
  • (ZT)出版业改革:该死的死,该生的生
  • (八)c52学习之旅-中断实验
  • (八十八)VFL语言初步 - 实现布局
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (利用IDEA+Maven)定制属于自己的jar包
  • (强烈推荐)移动端音视频从零到上手(下)
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .NET gRPC 和RESTful简单对比
  • .net mvc 获取url中controller和action
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .Net 应用中使用dot trace进行性能诊断