上下拉电阻会增强驱动能力吗?
最近看到一个关于上下拉电阻的问题,发现不少人认为上下拉电阻能够增强驱动能力。随后跟几个朋友讨论了一下,大家一致认为不存在上下拉电阻增强驱动能力这回事,因为除了OC输出这类特殊结构外,上下拉电阻就是负载,只会减弱驱动力。
但很多经验肯定不是空穴来风,秉承工程师的钻研精神,我就试着找找这种说法的来源,问题本身很简单,思考的过程比较有趣。
二极管逻辑
今天已经很难看到二极管逻辑电路了,其实用性也不算高,不过因为电路简单,非常适合用来理解基本概念。
一个最简单的二极管与门如下图。与门实现逻辑与操作Y=A&B,即A或者B任意为L的时候,输出Y为L,只有当A和B都为H时,Y才为H。

上图,基本二极管与门
假设二极管无导通压降,在这个电路中,二极管充当了单向开关的角色,当A和B等于VDD时,两根二极管反向截至,Y被电阻上拉到VDD,这是Y就是H;当A或者B任意一端为GND时,二极管导通,因为二极管导通时电阻很小,远小于上拉电阻,所以Y被拉到了GND,即逻辑L。
至于二极管或门,只要把二极管转一下,再把电阻从拉到VDD改成拉到GND就可以了,非常简单。

上图,基本二极管或门
基本原理
你看,在这么原始的逻辑电路中就已经出现了上下拉电阻,这里面的原理也非常简单粗暴:利用开关的闭合(电阻为0)和开启(电阻无穷大)的特性,配合电阻,就可以轻松实现两种电压的输出。这种电路还有一个变形,就是用恒流源取代电阻,一方面集成电路工艺,恒流源比电阻更容易获得,另一方面恒流源的驱动能力也更好。根据开关和电阻(或恒流源)的相对位置,有以下基本电路:即开关接到GND(L)或开关接到VDD(H)。

上图,几种开关电路接法。
这几种电路都是由开关的闭合或开启决定了VOUT是VDD还是GND。开关的相对位置不同,还决定了电路在某一状态下的驱动能力:开关的导通电阻为0,可视为驱动力无穷大,可是电阻(或恒流源)的驱动能力呢,只有VDD/R(或者恒流I),这就导致了电路在输出H或L的时候驱动能力不对称(换一个说法,就是电路在输出H或者L的时候,输出阻抗不一样)。
除了驱动能力的问题,这种单开关加电阻的模式还会带来静态功耗的问题,因为只要开关闭合,不管外部有没有负载,都会消耗电流。
既然开关的驱动力比电阻强,那么能不能把电阻也换成开关?恭喜你,发现了现代CMOS逻辑电路的基本单元:俩互补的开关。这样不管输出H还是输出L,驱动能力都是无穷大!好的,这时候上下拉电阻就不见了。
这样两个开关的电路还多出来了一种状态:当两个开关都开启时,VOUT即不是VDD也不是GND,而是一个悬空的状态(即高阻态,Hi-Z),这时候外部给什么信号它就是什么状态。这样又出现了一个新的逻辑门大类:三态逻辑门。

上图,互补开关电路。
上下拉电阻增强驱动能力?
很多经验不是空穴来风,只是在流传的过程中丢失了重要的前提条件。上一节也看到了有一些逻辑器件,他们输出高和输出低时的驱动能力差别很大。
TTL(70xx、74Fxx、74Sxx、74LSxx等)家族的器件就属于这种类型,如下图是7404(TTL反相器)的原理图,由于非对称的输出级设计,输出为高时驱动能力只有0.4mA,而输出低时居然能输出16mA的电流(手册中的输出电流不是晶体管或者电路本身的极限,而是超过这个电流以后,输出的电压可能无法满足逻辑族的要求)。

上图,7404的简化电路。
这个时候在输出端口外加一个上拉电阻,就可等效以增强端口在输出H时的驱动能力,但代价是端口输出L时,驱动能力相应地减弱,不过这时候芯片输出能力足够强,用这点代价来换取另一个状态下驱动能力的增强,还是划算。

上图,带上拉电阻的7404。
下表是仿真有无上拉电阻时,负载电流与输出电压的关系,可以看到上拉电阻确实增强了在一定负载下的输出电压,不过当负载电流较大时效果并不明显,而且边际效应也很显著,当上拉电阻减小到一定程度以后,增强效果也不太显著,而且会大大增加静态功耗。

上表,带不同上拉电阻的7404输出电压与负载电流的关系。
既然非对称的输出级有这样的问题,那为啥不能把这个驱动器设计成上下对称的呢?
一方面,如果要设计成上下对称的结构,上管需要用P管,而当时的工艺限制,P管各方面性能都不如N管,速度、功耗和成本都不是很划算,所以能看到很多上年代的芯片,内部几乎没有P管(包括MOS工艺的器件也是)。
另一方面,TTL输入结构的特点,输入为H时所需电流很小,而输入为L所需的输入电流很大,这样对输出L时的驱动能力要求就很高,反而对输出H时没有驱动能力要求(TTL输入悬空时等效为H)。
但TTL的这种特点,又会带来一个比较麻烦的问题:下拉电阻值需要很大才能满足要求,而下拉电阻太大则会导致输出高时负载太重以至于无法达到规定电压,所以TTL要尽量避免使用下拉。
下图是仿真结果,因为这是一个反相器,所以下拉时输出高是所期望的,而下拉电阻超过1.8kΩ时已经无法满足TTL定义的最低高电平标准了;而上拉时,就算上拉电阻达到20kΩ,也丝毫不影响输出。

上表,TTL上下拉电阻取值与输出电压的关系。
CMOS电路
相信现在已经没多少人会在设计时选用TTL家族的器件了,可能多数人都没接触过这类器件,最常用的还是CMOS家族(HC、HCT、LVC、CD4000等)。
CMOS家族的东西就比较简单粗暴,上下对称的结构,上下管驱动能力也基本一致,这个时候输出的上下拉电阻对增强驱动能力几乎没有帮助不说,还加重了负载,属于得不偿失(其实多数情况下是无关痛痒)。
下图是基本的CMOS反相器,只需要一对互补的MOS管即可实现(现实中的CMOS反相器一般是三对这种管子级联出来的,为了提高开环增益)。

但是CMOS器件的输入悬空时,不会被拉向任何一个方向,处于一种浮空的状态,这样会造成输出紊乱,不是我们所希望的结果,这种情况下需要在输入端接入上拉或者下拉电阻给电路提供一个确定的状态。一般可拔插的对外接口(如JTAG)需要在I/O上加上上下拉电阻,有三态的总线视工作情况也可能需要上下拉,不过大多数的CMOS电路不需要额外的上下拉电阻。

上图,CMOS器件在使用是一般要加上下来避免输入悬空。
因为CMOS输入是电压控制型,输入阻抗很高,所以上下拉电阻的值可以很大,理论上用MΩ级别的电阻都没问题。
不过理论归理论,工程师得认清现实。现实的CMOS输入结构,为了保护MOS管的栅极,会在栅极上加入ESD二极管,二极管反向偏置的时候是有漏电流的,还会随温度的升高还会指数增长!所以CMOS电路的上下拉电阻一般在100kΩ以下,一些制程比较先进的CPU,I/O口的漏电流或者上下拉电流较大,上下拉电阻一般取在几kΩ级别。所以设计上下拉电阻前一定要仔细阅读芯片手册,查查I/O的输入电流,看看取什么样的电阻值才合理。

上图,CMOS输入有ESD二极管。
其他需要上下拉的情况
开集(Open-Collector)和开漏(Open-Drain)的输出结构往往也需要加上拉电阻:理清推挽、开漏、OC、OD的特点与应用。OC和OD输出结构只有下管,所以只能输出L和高阻(Hi-Z)两种状态,而高阻态是难以被电路识别的,所以需要合适的上拉电阻把高阻态转变为高态。

上图,OC(左)和OD(右)输出结构。
虽然OC和OD输出结构看起来很复古,使用时也需要外接电阻有点麻烦,但这种结构最大的好处就是可以做线与,也就是多个OC或者OD可以接到一起,只要其中一个输出L,总线就是L,这在多外设中断和电源时序控制方面很常用。

上图,OC/OD的线与接法。
I2C也是OC/OD结构,这样很轻松就能在一条数据线上双向传输数据而不需要额外的方向控制信号,而CAN总线则巧妙地利用线与特性来实现总线仲裁。
在处理OC或者OD电路的时候,一定要注意评估总线负载电容、上拉电阻与所需速度的关系,负载电容越大,速度越快,所需的上拉电阻要越小:通俗理解STM32中的上/下拉电阻。比如I2C总线,如果只挂载了一片从设备,使用4.75kΩ的上拉电阻可能就满足400kHz的总线要求了,但如果挂了10片从设备呢,1kΩ的上拉电阻也不一定能搞定100kHz的总线速度,这种时候可能得考虑总线负载隔离或者降低总线速度了。
下图是在200pF负载电容情况下,上拉电阻为500Ω、1kΩ、2kΩ、4.75kΩ和10kΩ下的波形,可以看到上拉电阻越大,对电容充电速度越慢,所以上升沿也越慢,当上拉电阻不合适时上升沿已经严重变形,无法保证正常工作。

上图,OC电路不同上拉电阻对波形的影响。
逻辑反相器可以当成放大器来用!不是开玩笑,我还真见过产品上用这种骚操作的,只需要把反相器接成反向放大器就可以了,不过逻辑器件当线性器件用,性能嘛...

上图,逻辑反相器(非门)当成线性放大器用。
相关文章:
上下拉电阻会增强驱动能力吗?
最近看到一个关于上下拉电阻的问题,发现不少人认为上下拉电阻能够增强驱动能力。随后跟几个朋友讨论了一下,大家一致认为不存在上下拉电阻增强驱动能力这回事,因为除了OC输出这类特殊结构外,上下拉电阻就是负载,只会减…...
题目:小明的彩灯(蓝桥OJ 1276)
题目描述: 解题思路: 一段连续区间加减,采用差分。最终每个元素结果与0比较大小,比0小即负数输出0。 题解: #include<bits/stdc.h> using namespace std;using ll long long; const int N 1e5 10; ll a[N],…...
换元法求不定积分
1.一般步骤:选取换元对象(不一定是式子中的值,也可以是式子中的最小公倍数或者最大公因数),然后将dx换为dt*t的导数,再用t将原式表示,化简计算即可 2. 3. 4. 5. 6....
在Docker容器中启用SSH服务,实现外部访问的详细教程
目录 步骤 1: 安装 SSH 服务器 步骤 2: 配置 SSH 服务器 步骤 3: 设置 SSH 用户 步骤 4: 重启 SSH 服务器 步骤 5: 映射容器端口 步骤 6: 使用 SSH 连接到容器 要在Docker容器中启用SSH服务,以便从外部访问,您需要执行以下步骤: 步骤 …...
Go 模块系统最小版本选择法 MVS 详解
目录 Golang 模块系统简介 包版本管理 最小版本选择(MVS)原理 MVS 的优点 MVS的缺点 实际使用MVS 小结 参考资料 Golang 模块系统简介 Golang 模块系统是 Go 1.11 版本引入的一个新特性,主要目的是解决 Go 项目中的依赖管理问题。在模…...
ifstream读取txt中的中文数据转成QString出现乱码
使用ifstream从txt文本中读取中文数据到string,再将string转成QString输出时出现了乱码。 分析:如果ifstream能成功从txt文本中读出中文数据,那大概率txt用的编码是ANSI编码(GBK就是ANSI的一种),那么在转成…...
UE4 双屏分辨率设置
背景: 做了一个UI 应用,需要在双屏上进行显示。 分辨率如下:3840*1080; 各种折腾,其实很简单: 主要是在全屏模式的时候 一开始没有选对,双屏总是不稳定。 全屏模式改成:Windows 之…...
$sformat在仿真中打印文本名的使用
在仿真中,定义队列,使用任务进行函数传递,并传递文件名,传递队列,进行打印 $sformat(filename, “./data_log/%0d_%0d_%0d_0.txt”, f_num, lane_num,dt); 使用此函数可以自定义字符串,在仿真的时候进行文件…...
【Rust】结构体与枚举
文章目录 结构体struct基础用法使用字段初始化简写语法使用没有命名字段的元组结构体来创建不同的类型没有任何字段的类单元结构体方法语法关联函数多个 impl 块 枚举枚举值Option 结构体struct 基础用法 一个存储用户账号信息的结构体: struct User {active: bo…...
CentOS7 防火墙常用命令
以下是在 CentOS 7 上使用 firewall-cmd 命令管理防火墙时的一些常用命令: 检查防火墙状态: sudo firewall-cmd --state 启动防火墙: sudo systemctl start firewalld 停止防火墙: sudo systemctl stop firewalld 重启防火墙&…...
【无标题】什么是UL9540测试,UL9540:2023版本增加哪些测试项目
什么是UL9540测试,UL9540:2023版本增加哪些测试项目 UL 9540是美国安全实验室(Underwriters Laboratories)发布的标准,名称为"UL 9540: Energy Storage Systems and Equipment",翻译为中文为"能量存储…...
springcloud整合Oauth2自定义登录/登出接口
我使用的是password模式,并配置了token模式 一、登录 (这里我使用的示例是用户名密码认证方式) 1. Oath2提供默认登录授权接口 org.springframework.security.oauth2.provider.endpoint.postAccess; Tokenpublic ResponseEntity<OAuth2AccessToken> pos…...
Oracle常见内置程序包的使用Package
Oracle常见内置程序包的使用 点击此处可跳转至:Oracle的程序包(Package),对包的基础进行学习常见内置程序包的使用Package1、DBMS_OUTPUT包2、DBMS_XMLQUERY包3、DBMS_RANDOM包4、UTL_FILE包5、DBMS_JOB包6、DBMS_LOB包7、DBMS_SQL包8、DBMS_LOCK包9、DB…...
Flutter:视频下载案例
前言 最近在研究视频下载,因此打算一边研究一边记录一下。方便以后使用时查看。 使用到的库有: permission_handler 11.1.0 :权限请求 flutter_downloader 1.11.5:文件下载器 path_provider 2.1.1:路径处理 视频…...
要求CHATGPT高质量回答的艺术:提示工程技术的完整指南
要求CHATGPT高质量回答的艺术:提示工程技术的完整指南 第2章:指令提示技术 现在,让我们开始探索“指令提示技术”,以及如何使用它从ChatGPT生成高质量的文本。 指令提示技术是一种通过为模型提供特定指令来指导ChatGPT输出的方…...
JDK 历史版本下载以及指定版本应用
参考: 官网下载JAVA的JDK11版本(下载、安装、配置环境变量)_java11下载-CSDN博客 Gradle:执行命令时指定 JDK 版本 - 微酷网 下载 打开官网地址 Java Downloads | Oracle 当前版本在这里,但是我们要下载历史版本 选…...
Linux基础项目开发1:量产工具——UI系统(五)
前言: 前面我们已经把显示系统、输入系统、文字系统搭建好了,现在我们就要给它实现按钮操作了,也就是搭建UI系统,下面让我们一起实现UI系统的搭建吧 目录 一、按钮数据结构抽象 ui.h 二、按键编程 1.button.c 2.disp_manager…...
面试就是这么简单,offer拿到手软(四)—— 常见java152道基础面试题
面试就是这么简单,offer拿到手软(一)—— 常见非技术问题回答思路 面试就是这么简单,offer拿到手软(二)—— 常见65道非技术面试问题 面试就是这么简单,offer拿到手软(三ÿ…...
深入理解Redis分片策略:提升系统性能的关键一步
目录 引言 1. 一致性哈希算法 2. 范围分片 3. 哈希槽分片 实战经验分享 结论 引言 Redis作为一款高性能的键值存储系统,为了应对大规模数据和高并发的访问,引入了分片策略,使得数据能够分布存储在多个节点上,实现系统的横向…...
【数据结构(七)】查找算法
文章目录 查找算法介绍1. 线性查找算法2. 二分查找算法2.1. 思路分析2.2. 代码实现2.3. 功能拓展 3. 插值查找算法3.1. 前言3.2. 相关概念3.3. 实例应用 4. 斐波那契(黄金分割法)查找算法4.1. 斐波那契(黄金分割法)原理4.2. 实例应用 查找算法介绍 在 java 中,我们…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
