0
收藏
微博
微信
复制链接

硬件上下拉电阻怎么选?一文讲清原理与场景

2026-05-08 16:49
77

一、从一次调试经历说起

记得刚工作那会,做一个按键检测电路,照着参考图纸画完,焊好板子上电,按键按下去有时候能检测到,有时候就没反应。示波器一测,发现没按的时候,电平在0.5V到1.8V之间跳来跳去,完全不是预期的高电平。组长过来瞟了一眼,说"你这没加上拉电阻吧?"我当时还纳闷,电阻不是用来限流的吗?为什么还要特意接一个到VCC?

那是我第一次真正理解上下拉电阻的作用。后来做了十年硬件,从消费电子到工业控制,从单片机到FPGA,几乎每个项目都会碰到上下拉电阻。说它简单吧,确实就是一个电阻接电源或者地;说它重要吧,很多奇怪的BUG最后查出来都是上下拉没弄好。

二、上下拉电阻到底是什么

1 基本概念

其实上下拉电阻本身没什么特别的,就是一个普通电阻。之所以叫上拉,是因为它把信号线"拉"向电源电压(VCC);下拉就是把信号线"拉"向地(GND)。本质上,就是给信号线一个确定的默认电平。

aea0c2813213f40431bb4b20df98e1.jpeg

图1 上下拉电阻基本电路结构

很多芯片引脚在悬空的时候,电平是不确定的,处于一种"浮空"状态。这时候引脚的电压可能受到周围电磁干扰、线路寄生电容的影响,在高低电平之间跳来跳去。如果这个引脚是输入脚,就可能导致误触发。

加上拉电阻,就是保证没有外部驱动的时候,信号线稳定在高电平;加下拉电阻,就是保证稳定在低电平。就像给信号找了一个"默认值",没人说话的时候,它就待在这个默认值上。

2 电流路径怎么理解

上拉电阻的电流路径是这样的:当外部信号没有拉低的时候,电流从VCC经过上拉电阻流到信号线,把信号线电压拉到接近VCC。当外部电路把信号线拉低时,电流从VCC经过上拉电阻,再经过外部电路流到地。这时候上拉电阻上会有压降,所以要选合适的阻值,保证低电平足够低。

下拉电阻刚好相反。默认状态下,信号线通过下拉电阻放电到地。当外部电路输出高电平时,电流从外部电路流出,经过下拉电阻到地。这时候要保证高电平足够高,不会被下拉电阻"拖"得太低。

老工程师心得:上下拉电阻不是越大越好,也不是越小越好。太大了,信号上升沿慢,抗干扰差;太小了,电流大,功耗高,可能超过引脚驱动能力。这是一个权衡的艺术。

三、这些场景一定要用上下拉

1 按键输入电路

按键应该是最常见的应用场景了。按键一端接GPIO,另一端接GND,这时候GPIO上需要加一个上拉电阻。按键没按的时候,GPIO是高电平;按下后,按键把GPIO拉到低电平,单片机就能检测到按键按下了。

反过来,如果按键另一端接VCC,那GPIO就要加下拉电阻。默认低电平,按下变高。两种方式都可以,看系统设计习惯。我个人更倾向于上拉方式,因为很多单片机内部自带上拉,省了外部电阻。

2 I2C总线

I2C总线可以说是上拉电阻的"重度用户"。I2C的SDA和SCL线都是开漏输出结构,芯片本身只能输出低电平,高电平完全靠外部上拉电阻拉上去。所以I2C总线不加两个上拉电阻,根本没法工作。

51a6443caf39fe80815a29ab517831.jpeg

图2 I2C总线典型上拉电阻电路

这里阻值选择很关键。常用的是4.7K或者2.2K。3.3V系统用4.7K的话,低电平电流大概是0.7mA,大多数芯片都能承受。如果总线上挂的设备多,或者线比较长,可能需要减小到2.2K甚至1K,保证上升沿够快。

3 复位引脚

大多数MCU的复位引脚都是低电平复位。为了防止上电时误复位,或者运行中受到干扰导致意外复位,复位引脚上一般要加一个上拉电阻。同时配合一个到地的电容,构成RC滤波,提高抗干扰能力。

上拉电阻一般选10K到100K,电容选0.1μF到1μF。这个组合既能保证复位可靠,又能滤掉大部分毛刺干扰。我做工业级产品的时候,一般用10K上拉加0.1μF电容,可靠性很好。

4 SPI总线的片选信号

SPI的CS片选信号,建议都加上拉电阻。因为SPI通信的时候,同一时间只能有一个设备被选中,其他设备的CS必须是高电平。如果不加,上电时CS电平不确定,可能导致多个设备同时被选中,总线数据就乱了。

还有像CAN总线的终端电阻,虽然不是传统意义的上下拉,但原理类似,也是为了保证总线电平的稳定性。高速信号的阻抗匹配,本质上也是在解决信号完整性问题。

四、阻值怎么选?记住这几个维度

1 功耗因素

功耗是第一个要考虑的。上拉电阻的功耗计算公式很简单:P = V²/R。3.3V系统中,1K电阻的功耗是10.89mW,10K就是1.089mW,100K就是0.1089mW。看起来不大,但如果一个板上有几十个这样的电阻,加起来就可观了。

电池供电的产品对功耗特别敏感,这时候上下拉电阻可以选大一点,比如100K甚至1M。但也要注意,阻值太大的话,引脚的漏电流可能会导致电平不准确。大多数CMOS引脚的漏电流在μA级,1M电阻上的压降就是几mV,一般问题不大。

2 信号速度

信号上升沿时间和电阻阻值、负载电容成正比:tr ≈ 2.2 × R × C。信号线上总有寄生电容,再加上各个芯片引脚的输入电容,加起来可能有几十pF甚至上百pF。

比如10K电阻配合50pF电容,上升沿时间就是2.2×10K×50pF = 1.1μs。如果是I2C标准模式(100KHz),周期是10μs,这个上升沿还能接受。但如果是高速I2C(400KHz),周期只有2.5μs,1.1μs的上升沿就占了将近一半,通信很容易出错。

3 驱动能力

芯片引脚灌电流(吸收电流)的能力是有限的。比如普通GPIO引脚,灌电流能力一般是几个mA到二十几个mA。上拉电阻太小,低电平时流过的电流就大,可能超过引脚的承受能力。

举个例子,3.3V系统中,1K上拉电阻的电流就是3.3mA。如果引脚的最大灌电流是4mA,那这个就接近极限了。如果是5V系统,1K电阻就是5mA,很多引脚就受不了了。所以计算的时候,一定要看芯片datasheet里的电气参数。

4 抗干扰能力

电阻越大,越容易受到干扰。因为大电阻意味着高阻抗,空间中的电磁干扰更容易在高阻抗线上感应出电压。工业环境或者电磁环境复杂的地方,上下拉电阻不要选太大,一般10K以内比较稳妥。

有次做一个电机驱动板,附近有大功率继电器,一开始按键用了100K上拉,结果继电器一吸合,按键就误触发。后来把上拉改成10K,问题就解决了。有时候不是原理错了,是环境太恶劣。

五、实际工程中踩过的坑

做了这么多年硬件,上下拉电阻的坑真没少踩。说几个印象深的,大家避避坑。

有一次做一个多板卡系统,同一个信号在A板上加了上拉,B板上又加了下拉。两个电阻并联,结果电平被拉到1.5V左右,刚好在高低电平的阈值中间,导致信号有时候判高,有时候判低,查了整整两天才找到问题。所以跨板连接的信号,上下拉只能在一边加,最好定义清楚哪边是主机,负责提供默认电平。

还有一次是内部上下拉和外部上下拉冲突。有些MCU的GPIO可以配置内部上拉或者下拉。如果软件配置了内部下拉,硬件又加了外部上拉,两个电阻就打架了。如果内部下拉是40K,外部上拉是10K,那电平就被拉到(10/(10+40))×3.3V = 0.66V,系统就乱了。所以硬件和软件一定要沟通好,哪些引脚内部有上下拉,哪些需要外部加。

第三个坑是开漏输出忘记加外部上拉。前面说过I2C是开漏输出,必须加外部上拉。但有些其他芯片的输出脚也是开漏结构, datasheet上写得很隐蔽。有次用一个接口扩展芯片,它的中断输出是开漏的,我没注意,没加上拉,结果中断一直没反应。查了半天才发现中断脚一直是低电平,不是没触发,是根本上不去。

血泪教训:看到Open Drain或者OD字样,条件反射一样先找哪里加了上拉电阻。开漏输出不加上拉,就像汽车没加油,看起来好好的,就是跑不起来。

六、给大家的经验总结

说了这么多,最后给大家一些实用的建议。这些都是我这么多年攒下来的经验值,直接拿去用就行。

一般数字电路,不确定选什么的时候,10K是一个很安全的选择。功耗不大,速度也够用,抗干扰也还行。大多数情况下都能用。

I2C总线,3.3V系统用4.7K,设备多或者线长就降到2.2K。5V系统可以用10K,因为电压高,同样的电阻,电流更大,上升沿反而更快。

按键输入,如果是普通应用,10K上拉足够。工业环境或者有强干扰的地方,用4.7K甚至2.2K。电池供电想省电,就用100K,但要注意软件去抖做好一点。

复位电路,10K上拉加0.1μF电容是标配。要求高的场合,可以再加一个TVS管或者小电容到电源,提高抗ESD能力。

高速信号,比如SPI、SDIO这些,上下拉电阻不要太大,一般4.7K以内。如果是几十MHz的信号,可能还要考虑阻抗匹配,用更小的电阻。

最后说一句,上下拉电阻看起来简单,其实是硬件设计中最基础也最容易出错的地方。画原理图的时候,每一个输入引脚都要想:这个引脚默认状态是什么?浮空会不会有问题?需不需要加上下拉?养成这个习惯,很多低级错误就能避免了。

硬件设计就是这样,越是基础的东西,越能看出功底。把上下拉这些细节做好,整个系统的稳定性就有了坚实的基础。希望这篇文章能帮到正在学习或者工作的你。

登录后查看更多
0
评论 0
收藏
侵权举报
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表凡亿课堂立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。

热门评论0

相关文章

开班信息