简介
在数字逻辑电路中,一个信号不是 0
,就是 1
。正是因为这样,数字电路的设计才简单,可靠。
通常,用电压 5v
(或者接近 5V
)代表 on
开状态,代表高电平,对应状态 1
。用电压 0v
(或者接近 0v
)代表 off
关状态,代表低电平,对应状态 0
。
有些开发板是基于 3.3V
的,因此使用 3.3V
作为高电平。
如果一个线路中的电压处于不确定的状态(例如一个引脚不和任何其它回路连通时),那我们就说它的电压是浮动的,他会随着时间不断变化,跳动,而且很容易受到外界环境的影响。处于这种不确定状态的电路会被随机解释为高或者低电平。 这种现象也叫电子噪声。
然而程序必须是严格准确的,所以电路的设计一定要避免线路电压处于浮动状态。
我们可以使用上拉电阻或者下拉电阻将电路的电压在任何时候都保持在确定的状态下,这就是上拉电阻和下拉电阻的作用。
下拉电阻
作用:将一个未知的电平拉低到稳定的低电平状态。
上图中,我们要判定 input 这个引脚 是高电平还是低电平。
当按钮 S2 没按下时,Input 通过 2 个电阻接到 GND,是稳定的低电平 。 当 S2 按下时,+5V ,S2 , R2 ,GND 这条路导通,而 Input 接在 R2 的前面,因此会得到高电平。
因此我么可以通过 Input 端是高电平还是低电平来判断 S2 是否按下。如果没有 下拉电阻 R2,那么 S2 没按下前,Input 没有和任何东西相连,它的电平处于浮动状态,且很容易受环境影响,带来电子噪声。
上拉电阻
作用:将一个未知的电平拉高到稳定的高电平状态。
当 S2 没按下时,Input 通过 2 个电阻和 +5V 连接(注意电路中并没构成回路,因此不会有压降,所以 Input 端依然是高电平),为高电平。当 S2 按下时,+5V,R2,S2,GND 形成回路,R2 电阻大,产生压降大,因此后面的 Input 就是低电平。
因此,可以通过 Input 端的电平来判断 S2 是否按下。
相比下拉电阻,上拉电阻在数字电路中使用的更多。
Arduino 中的拉电阻
Arduino 的数字引脚和模拟引脚都内置了【上拉电阻】,电阻为 20K~50K 欧姆,他们需要使用 代码去激活使能。
提示:
- 如果你需要为 Arduino 自己配置外置的拉电阻,官方建议为 10K 欧姆。
- 不建议使用 13 脚作为输入引脚使用,因为 13 脚配置了一个板载的 LED 灯,即便是你使能了上拉电阻,LED 等的电阻会拉低电压,使得引脚依然是低电平。如果你非要使用 13 作为输入,那就外置拉电阻。
使能 Arduino 上拉电阻的代码:
pinMode(10, INPUT);
digitalWrite(10, HIGH); //激活10号引脚的上拉电阻,因此在没有收到任何输入信号时,10号引脚一直是高电平。
/////////或者
pinMode(10, INPUT_PULLUP) ; //最新的Arduino库支持使用INPUT_PULLUP配置为输入且使能上拉电阻,和上面的2行代码等效。
注意:如果你配置一个引脚为输出,且使能上拉电阻,然后又切换 IO 模式为 OUTPUT,那么此引脚会保持高电平状态。反之:如果一个引脚为原本为输出模式,且输出高电平,切换为输入后,将自动激活上拉电阻。
动手试一试
实验目的:不使用 Arduino 内置的上拉电阻,通过电子器件构造一个外置【下拉电阻】,实现功能:通过 8 号引脚判断按钮释放按下,按钮没按下时,8 号引脚始终接受低电平信号,按钮按下时,接受到高电平信号。每当按钮按下时,反转板载 LED 的状态.
电路连线
代码
void setup() {
pinMode(LED_BUILTIN , OUTPUT); //使用板载LED作为控制对象.
}
void loop() {
if(HIGH == digitalRead(8)){ //如果按钮按下
digitalWrite(LED_BUILTIN , LOW == digitalRead(LED_BUILTIN) ? HIGH : LOW ); //则反转 LED的状态
delay(600);
}
}