浮空输入
首先,让我们来看看双向(单刀双掷)开关的情况:
当开关打开时,微控制器输入端将连接到 +3.3V 电压,即高电平。当开关关闭时,微控制器的输入将连接至 0V,即低电平。如果只有一个按钮,会是什么情况呢?
按下按钮时,微控制器输入端将连接至 0V,即低电平。然而,当按钮未被按下时,微控制器输入端并没有真正连接到任何设备:
这就跟什么都没连接一样:
在这种情况下,输入电平是多少?高还是低?因为它没有真正连接到任何东西,所以输入可能是任何水平的值,这取决于环境中的静电或电磁辐射。它可能只是接收无线电波(就像天线一样),并在高电平和低电平这两种定义较弱的状态之间来回摆动。这种微控制器输入没有明确定义,可能是任何(随机)状态被称为浮空状态。
上拉和下拉电阻
为了解决这个问题,要做的是在输入端添加一个上拉电阻或下拉电阻(下图所示的上拉电阻):
当按钮未按下时,上拉电阻会将微控制器输入拉高至 +3.3V,提供一个定义明确的高电平。当按下按钮时,微控制器输入将直接连接(短路)到地(0V),提供一个定义明确的低电平。在这种情况下,会有一些电流流过上拉电阻,但由于电阻值相对较高,所以电流很小。
您可能会注意到电阻符号看起来像一个小弹簧,而这正是它在这种情况下的工作方式。我们都使用过自动关闭的门,例如公共设施中常见的门,除非您主动将门打开,否则有一种机制会再次将其关闭。如果没有自动关闭机制(可以想象一下门没有闩锁机制),门会被风吹来吹去或被进出的人移动,并且它不会默认到任何特定位置。上拉(或下拉)电阻类似于这些门上的自动关闭机制,因为它在未主动驱动时将输入保持在特定电平。因此,上拉电阻就像自动关闭门上的弹簧,除非有人足够强壮并推开门,否则门将默认为关闭位置。
这种情况显然可以反过来,即按钮可以连接到 +3.3V(高电平),而下拉电阻可以用来保持低电平输入:
不过,上拉电阻配置更为常用
开漏输出
某些微控制器输出可设置为开漏(或仅提供为开漏)。开漏输出是一种只能驱动低电平而不能驱动高电平的输出;输出为低电平或浮动输出。从本质上讲,输出只是连接到晶体管的漏极引脚(因此称为开漏)。
当控制线被驱动为高电平时,晶体管会将输出短路至接地(0V),从而将输出拉低。当控制线为低电平时,晶体管为高阻抗(高阻),输出为浮空。
一些通信方案如 I2C 和 CAN使用这种安排,允许多个设备通过相同的通信线路进行通信,而不会出现短路(碰撞,即一个设备试图将线路驱动为高电平,而另一个设备试图将线路驱动为低电平);在这种情况下,当线路未被主动驱动为低电平时,使用上拉电阻器将线路保持为高电平。