不管是单片机的 IO 口,还是一般的上拉下拉电路,都会有灌电流和拉电流的身影。
了解可以帮助我们更好地理解和设计电路。
灌电流,英文 sink current,指被动输入电流,是从输出口流入电流,下图,当 PTB0 输出低的时候,LED 亮,电流的方向就是从 VCC 流进 PTB0 管脚。
拉电流,英文 sourcing current,指主动输出电流,是从输出口输出电流,下图,当 PTB1 输出高的时候,LED 亮,电流的方向就是从 PTB1 流进地。
大致画出 PTB0 的内部结构, 当 INPUT 输出高电平时,LED 亮。
当三极管在饱和状态时,三极管集电极和发射极之间近似为一个开关,PTB0 上的电压为:U=5*R2/(R1+R2)
如下,简易画出 PTB1 的内部结构,当 VF2 输出高电平时,LED 亮。
当三极管在饱和状态时,三极管集电极和发射极之间近似为一个开关,PTB1 上的电压为:U2=5*R4/(R3+R4)
从上述公式可以看出,R3 越小时,拉电流越大,PTB1 电压越大。拉电流越大时,输出端的高电平就越低。逻辑门的高电平有一个 Uihmin,当低于这个值的时候,就无法识别为 1,所以拉电流也是有一个上限的。
如下是一个实际问题,波形是单总线的复位应答信号。
可看出,在主机发送复位信号拉低总线,然后释放,再由上拉电阻上拉至高电平,然后从机拉低总线应答,发现从机的低电平比较高,电压并没有拉低到 0V。
这个原因就是上面说到的,灌电流过大,说明这个上拉选得比较小,如果这个从机的低电平再高一些,可能就无法被主机识别,导致通信失败。