深谈GPIO及上下拉电阻
品慧电子讯很多人一看到这个标题,相信都会嘴角一扬,鄙视地笑了:GPIO和上下拉电阻有什么好谈的,不就是一个电阻接地或者接电源吗?学电子的第一堂课就学了。实际上,上下拉电阻这里的学问深着呢,各位要是不信,先用下面几个实例自测一下,再决定要不要学一下。
入门题:
1)什么是开漏输出,什么是推挽输出?
2)芯片空余的引脚如何处理,接地?接电源?悬空?
进阶题:
下图1是PLC的输入端口原理图,S1是模拟开关信号输入。软件工程师说按键按下,CPU一直检测不到低电平,一直都是高电平,一口咬定是硬件问题,实测CPU的引脚确实也是3V左右的高电平。请问是软件问题还是硬件问题,原因是什么?(下图R3和C1参数不能改,用于设置输入滤波参数,限制频率高于10HZ的抖动输入。)
PLC产品的输入端口原理图
高级题:
下图2是控制机柜风扇控制电路,控制器输出0~10V电压,控制风扇的转速。目前该控制器存在这个问题:控制一上电,端口处就会输出400mS/5V左右的脉冲,导致上电瞬间风扇突然转动,客户不可接受,需整改。怎么解决?
图2 :风扇转速控制原理图
图3 :风扇控制上电瞬间400mS左右的高电平输出
骨灰题:
下图4是一款智能电表的方案示意图,项目组一共开发了2款电表,高端版和低端版,主板是完全一样的,区别在于高端版带显示器,低端版不带显示器。两款设备在做EMC的ESD测试中,低端版设备做完实验后无法启动,高端版则正常,请问可能的原因在哪里?
图4 :带显示功能的智能电表
一、GPIO的基础知识
GPIO(General Purpose I/O Ports)意思为通用输入/输出端口,通俗地说,就是一些引脚,可以通过它们输出高低电平或者通过它们读入引脚的状态-是高电平或是低电平。GPIO口一是个比较重要的概念,用户可以通过GPIO口和硬件进行数据交互(如UART),控制硬件工作(如LED、蜂鸣器等),读取硬件的工作状态信号(如中断信号)等。几乎所有的CPU、MCU都会具GPIO功能,以下是作者统计的GPIO的种类,几乎囊括了所有的MCU的GPIO类型。
1) 输入浮空:即输入端口既不上拉也不下拉,电平由外部输入决定;这种模式较少,一般模拟量输入、按键扫描输入使用该模式。
2) 输入上拉:即输入端口配置一个电阻到电源端,该电阻可以使芯片内置,也可以是外部电阻。
3) 输入下拉:即输入端口配置一个电阻到地,该电阻可以使芯片内置,也可以是外部电阻。
4) 模拟输入:模拟量信号输入,需要芯片内部支持AD转换功能才可以。
5) 开漏输出: 漏极开路输出(OD) 和集电极开路输出(OC)十分相似,都是无法输出高电平,只能输出低电平,需要高电平时需要外接上拉电阻。
6) 推挽式输出:推挽输出既可以输出高电平也可以输出低电平,无需外配置电阻。
7) 推挽式复用功能:即推挽式输出和输入功能,使用时需要配置具体使用哪一种。
8) 开漏复用功能:即开漏输出和输入功能,使用时需要配置具体使用哪一种。
很多人看到上面一堆IO引脚的功能种类,肯定都是云里雾里的。先不急,看完下面这张“葵花宝典”,可以肯定市面上99%的CPU的GPIO功能都囊括了,拿着这张表,硬件工程师可以说服驱动工程师,驱动工程师可以忽悠软件工程师,就可以责任清晰,和平共处了。
图5:8种GPIO输入输出功能类型内部原理框图
二、上下拉电阻作用
1) 上拉就是将不确定的信号通过一个电阻嵌位在高电平!电阻同时起限流作用!下拉同理,下拉就是将不确定的信号通过一个电阻嵌位在低电平!电阻同时起限流作用!
2) 上拉是对器件注入电流,下拉是输出电流。
3) 弱强只是上拉电阻的阻值不同,没有什么严格区分。
4) 对于非集电极(或漏极)开路输出型电路(如普通门电路)提升电流和电压的能力是有限的,上拉电阻的功能主要是为集电极开路输出型电路输出电流通道。
5) 一般作单键触发使用时,如果IC本身没有内接电阻,为了使单键维持在不被触发的状态或是触发后回到原状态,必须在IC外部另接一电阻。
6) 数字电路有三种状态:高电平、低电平、和高阻状态,有些应用场合不希望出现高阻状态,可以通过上拉电阻或下拉电阻的方式使处于稳定状态,具体视设计要求而定!
7) 一般说的是I/O端口,有的可以设置,有的不可以设置,有的是内置,有的是需要外接。
8) 上拉电阻是用来解决总线驱动能力不足时提供电流的。一般说法是拉电流,下拉电阻是用来吸收电流的,也就是我们通常所说的灌电流。
9) 在I/O引脚悬空时,接电阻就是为了防止输入端悬空,从而提高系统的抗干扰能力。减弱外部电流对芯片产生的干扰。
10) 通过上拉或下拉来增加或减小驱动电流。
11) 上下拉电阻改变电平的电位,常用在TTL-CMOS匹配。
12) 上拉电阻可以为OC门或者OD门提供电流。
三、上拉电阻的应用场景
1) 当TTL电路驱动COMS电路时,若TTL电路输出的高电平低于COMS电路的最低高电平(一般为3.5V),这时就需要在TTL的输出端接上拉电阻,以提高输出高电平值。注:此时上拉电阻连接的电压值应不低于CMOS电路的最低高电压,同时又要考虑TTL电路方电流(如某端口最大输入或输出电流)的影响。
2) OC门或者OD门电路必须加上拉电阻,才能使用。
3) 为加大输出引脚的驱动能力,有的单片机管脚上也常使用上拉电阻。
4) 在COMS芯片上,为了防止静电造成损坏,不用的管脚不能悬空,一般接上拉电阻,降低输入阻抗,提供泄荷通路。
5) 芯片的管脚加上拉电阻来提高输出电平,从而提高芯片输入信号的噪声容限增强抗干扰能力。
6) 长线传输中电阻不匹配容易引起反射波干扰,加上下拉电阻是电阻匹配,有效的抑制反射波干扰。
7) 在数字电路中不用的输入脚都要接固定电平,通过1k电阻接高电平或接地。
四、上拉电阻阻值选择原则
1) 从节约功耗及芯片的灌电流能力考虑应当足够大;电阻大,电流小。
2) 从确保足够的驱动电流考虑应当足够小;电阻小,电流大。
3) 对于高速电路,过大的上拉电阻可能边沿变平缓。综合考虑以上三点,通常在1k到10k之间选取。对下拉电阻也有类似道理。
4) 对上拉电阻和下拉电阻的选择应结合开关管特性和下级电路的输入特性进行设定,主要需要考虑以下几个因素:
a) 驱动能力与功耗的平衡。以上拉电阻为例,一般地说,上拉电阻越小,驱动能力越强,但功耗越大,设计是应注意两者之间的均衡。
b) 下级电路的驱动需求。同样以上拉电阻为例,当输出高电平时,开关管断开,上拉电阻应适当选择以能够向下级电路提供足够的电流。
c) 高低电平的设定。不同电路的高低电平的门槛电平会有不同,电阻应适当设定以确保能输出正确的电平。以上拉电阻为例,当输出低电平时,开关管导通,上拉电阻和开关管导通电阻分压值应确保在零电平门槛之下。
d) 频率特性。以上拉电阻为例,上拉电阻和开关管漏源级之间的电容和下级电路之间的输入电容会形成RC延迟,电阻越大,延迟越大。上拉电阻的设定应考虑电路在这方面的需求。
5) 关于电阻的参数不能一概而定,要看电路其他参数而定,比如通常用在输入脚上的上拉电阻如果是为了抬高峰峰值,就要参考该引脚的内阻来定电阻值的!
6) 一般LED的电流有几个mA就够了,最大不超过20mA,根据这个你就应该可以算出上拉电阻值来了。
7) 对于驱动晶体管,又分为PNP和NPN管两种情况:
a) 对于NPN:毫无疑问NPN管是高电平有效的,因此上拉电阻的阻值用2K~20K之间的。具体的大小还要看晶体管的集电极接的是什么负载,对于LED类负载,由于发管电流很小,因此上拉电阻的阻值可以用20k的,但是对于管子的集电极为继电器负载时,由于集电极电流大,因此上拉电阻的阻值最好不要大于4.7K,有时候甚至用2K的。
b) 对于PNP管:毫无疑问PNP管是低电平有效的,因此上拉电阻的阻值用100K以上的就行了,且管子的基极必须串接一个1~10K的电阻,阻值的大小要看管子集电极的负载是什么,对于LED类负载,由于发光电流很小,因此基极串接的电阻的阻值可以用20k的,但是对于管子的集电极为继电器负载时,由于集电极电流大,因此基极电阻的阻值最好不要大于4.7K。
8) 对于驱动TTL集成电路,上拉电阻的阻值要用1~10K之间的,有时候电阻太大的话是拉不起来的,因此用的阻值较小。但是对于CMOS集成电路,上拉电阻的阻值就可以用的很大,一般不小于20K,通常用100K的。
9) 关于I2C的上拉电阻:因为I2C接口的输出端是漏极开路或集电极开路,所以必须在接口外接上拉。上拉电阻的取值和I2C总线的频率有关,工作在standard mode时,其典型值为10K。在FAST mode时,为减少时钟上升时间,满足上升时间的要求,一般为1K。电阻的大小对时序有一定影响,对信号的上升时间和下降时间也有影响。总之一般情况下电压在5V时选4.7K左右,3.3V在3.3K左右.这样可加大驱动能力和加速边沿的翻转
五、GPIO及上下拉电阻实战
1、进阶题:无法输入低电平问题
我们仍然以文首的问题为例,入门题不举,上述已经有答案。看进阶题。驱动工程师将GPIO的输入配置成上拉模式(其实是出厂默认模式,驱动工程师不知道要修改。),U1关闭时,A电电平为高,U1导通时,A点电压VA=5*R3/(R3+R5)=3V,依然是高电平,所以该配置无法输入低电平。
图6 :PLC开关量输入上拉配置时等效电路图
将GPIO的输入模式配置成下拉时,U1关闭时,A点的电压VA=5*R5/(R3+R4+R5)=电电平为高,U1导通时,A点电压VA=5*R3/(R3+R5)=2.8V,虽然是属于高电平的,但是属于危险区域。如果将GPIO配置成悬空模式时,U1关闭时,A点电压VA=5V,U1导通时,A点电压VA≈0.6V,为低电平,功能正确。
图7:PLC开关量输入下拉配置时实际等效电路图
2、高级题:上电瞬间输出脉冲问题
经过与驱动工程师沟通,他没有在驱动层配置该引脚为模拟量输出,该引脚默认为输入,且是内置上拉,待cpu跑起来以后,才由应用程序配置该引脚为模拟量输出引脚。导致上电瞬间,程序没有跑起来,由于内置的上拉电阻原因,输出一个400ms左右的脉冲。后来在驱动层将该引脚配置为模拟量输出,并且禁用上拉功能,问题解决。
3、骨灰题的原因级解决办法
其实这个EMC的问题和上下拉电阻又扯上关系了,如下图8所示,MSP430内部可以配置上拉或者下拉(通过熔丝的方法),阻值也可以配置,但是我们不要忽略一件事情:厂家提供的这些上下拉电阻,只能保证功能性,其上下拉电阻的封装是相当小的,功率是相当小的,根本无法提供大能量的释放通道,不然厂家也不会建议,为了防止ESD和EMI的破坏,增加外部的较小的下拉电阻。下图8中,高端版智能电表因为外接了显示屏,显示屏可以提供大部分的ESD泄放通道,所以没有损坏到MCU的端口。低端版因为没有显示器,所有的ESD冲击都需要通过内部电路泄放,内部最脆弱的部分就首先被破坏。低端版解决的办法就如图9所示,增加外部的低阻抗的电阻到地,绝大部分的能量都通过下拉电阻泄放的地平面上,从而保护MCU的内部电路。
图8:带显示的智能电表等效原理图
图9:低阻抗电阻提供一个干扰信号的释放通道
六、后记
GPIO引脚以及上下拉电阻,看似简单,实际上几乎所有的电子行业从业人员都吃过这个亏,包括硬件、驱动、软件工程师,如果你了解内部的原理,犯错的几率就会大大降低。希望本文对你有用。
推荐阅读:
谈谈容易被工程师忽略的“电阻”
别再把“泄露电流”与“耐压漏电流”混淆了!
未来维修服务对传感器的需求:用于实施状态监控的智能传感器
了解、测量和使用热敏电阻的热时间常数
MathWorks 在 2018b 版本的 MATLAB 和 Simulink 产品系列中扩展了深度学习功能