为什么要用上拉电阻和下拉电阻?——避免输入引脚处于“悬空”状态
下图是一个没有使用上拉电阻/下拉电阻的电路图:
在按键没有按下时,要读取的输入引脚没有连接到任何东西,这种状态就称为“悬空”。
由于附近引脚的电气噪声,从处于“悬空”状态的输入引脚读取到的数值会在高电平和低电平之间来回波动,得到一个不确定的值。
如果用串口监视器将 在没有使用上拉/下拉电阻的情况下 从一个数字引脚读取的输入打印出来,会得到图示的结果:
可以看到此时读取到的输入并不是一个确定的值。
如果换成从模拟引脚读取输入可以更明显地看到输入电压值的波动情况:
只有输入时要考虑上拉电阻和下拉电阻的问题,输出时不用考虑。
上拉电阻
上拉电阻:将输入引脚通过一个10kΩ的电阻上拉到电源上
电路原理图:
- 开关断开:输入引脚通过一个10kΩ的电阻连接到VCC,引脚读到的是逻辑高电平
- 开关闭合:输入引脚被短路,VCC直接连接到地,引脚读到的是逻辑低电平
在串口监视器中打印出的结果为:
使用Arduino I/O口内部上拉功能:
ATmega328P 每个I/O端口都内置了20kΩ上拉电阻(包括数字引脚和模拟输入引脚)(注意:没有内置下拉电阻)。
电路连接:
将按钮的一端接到GND,另一端接到输入引脚(这里是D2),如图所示:
代码:
void setup{ ... pinMode(2,INPUT_PULLUP); ... }
下拉电阻
下拉电阻:将输入引脚通过一个10kΩ的电阻下拉到地
电路原理图:
- 开关断开:输入引脚通过一个10kΩ的电阻连接到地,引脚读到的是逻辑低电平
- 开关闭合:输入引脚直接连接到电源,引脚读到的是逻辑高电平