图1:仅仅一根线路就可能发生短路(左),一个上拉电阻就可以防止输入管脚悬空,同时防止不必要短路现象的发生
那么我们怎样选择合适的电阻呢?
正如大多数工程的问题一样,答案取决于你的应用。首先我们以极端条件0Ω或者1mΩ为例,0Ω电阻(值越小上拉能力越强,因为它们允许通过的电流越大)我们已经讨论过,如果电阻值太小就会经过太大的电流,这可能是不安全的,或者说是效率低下的。如果我们采用1mΩ呢,这样也不安全吗?阻值大的电阻上拉能力弱,因为允许流过的电流小,因此答案是肯定的,但是这也是有代价的。在这些具体情况下需要在效率和功耗之间进行权衡处理。
我们将微控制器的I/O管脚看作是电容,电容积累的电压不能够瞬间改变,而是根据定时常熟(T)进行充放电,数学表达式为T=RC,其中R表示电阻值,C表示电容的值。当我们增加一个非常大的电阻时,这就会在现有电流大小的情况下增加了电容器的充电时间。实际上这意味单片机不能立即检测到按下的按钮,因为需要一段时间来检测到单片机规定的从LOW/OFF状态到HIGH/ON状态的变化。从用户的角度来看这样的电路性能是不可接受的,系统似乎没有及时的作出反应。对于I2C串行通信这样的开漏应用来说,时序常数比较大会对I2C总线产生负面影响,从而使其串行数据线(SDA)和串行时钟线(SCL)达到所需的波特率。 从数学上讲以下是计算电阻值的方法:
Rp(min)为可接受的最小电阻值,由下面方式计算得出:
Rp(min) = (Vcc - VOL(max) ) / IOL 其中:
● Vcc是电源电压
● VOL(max)是单片机I2C管脚检测到为低时的最大电压
● IOL是电压为VOL时的电流值
Rp(max)为可接受的最大电阻值,由下面方式计算得出:
Rp(max) = tr / (0.8473 x Cb) 其中:
● tr是SDL和SCL总线在所需波特率下可接受的上升时间,查看你所用器件的数据手册
● Cb是预计要被驱动的电容负载,附带说明一下,共享I2C总线的器件数量取决于电路板(PCB)和器件输入电容总和。根据I2C规范标准和快速操作模式,这个限制为400pF。之后需要一个I2C缓冲芯片,通常会运行很好,最大限制为112个器件以及7位可寻址的I2C实现方案。 下面是一个比较实用的经验法则,你应该考虑测试电路中的电阻值,看看是否达到了预期性能:
● 一般用于采用1kΩ到10kΩ的阻值
● 如果是低功率应用比如器件采用电池供电那么可以采用10kΩ到100kΩ的阻值
最后要考虑的是很多微控制器都有可以通过代码打开的内置上拉电阻,请务必检测器件数据手册,看看内置电阻值是否适合你的应用,如果不适合,那就不得不增加外部上拉电阻了。
本文转自《贸泽电子》