本人是初学者,在看正点原子的KEY实验(基于esp32s3)时,里面有涉及到了上拉电阻及下拉电阻的概念,还是做个小结吧。
咱们先总结一下,加强理解,后面再附上原文档对比。
想象一下ESP32的一个引脚(比如GPIO13),它像一个小开关,可以检测电压是高(接近3.3V)还是低(接近0V)。但是,如果这个引脚什么都不接(悬空),它就不知道自己是高还是低,会变得非常“敏感”,容易受到周围电磁干扰的影响,导致状态乱跳(高-低-高-低...)。这就像一根断线的风筝在天上乱飘,你不知道它要飞向哪里。
上拉电阻和下拉电阻就是用来给这个“风筝”拴根“线”的! 它们的作用就是在引脚没有外部信号输入时,给它一个明确的、稳定的默认电平(高或低),避免它“悬空”乱跳。
1. 上拉电阻 (Pull-Up Resistor)
-
作用: 像一根很轻的“皮筋”,把引脚轻轻地“拉”向电源(3.3V),让它默认保持高电平(HIGH)。
-
工作原理:
-
当引脚什么都不接时:皮筋起作用,引脚稳稳地是高电平(3.3V)。
-
当你想把引脚拉低(比如接一个按钮到地):你需要用点力(按下按钮)克服皮筋的拉力,把引脚拉到地(0V),它就变成低电平(LOW)。
-
-
适用场景: 最常见!比如按钮开关。按钮一端接ESP32引脚,另一端接地(GND)。平时按钮没按(悬空),我们希望引脚是高电平;按下按钮时,引脚接地,变成低电平。
-
优势: ESP32内部自带这个“小皮筋”(上拉电阻)!你不需要额外焊一个物理电阻在电路板上,用代码就能打开它。
2. 下拉电阻 (Pull-Down Resistor)
-
作用: 像一个小小的“重物”,把引脚轻轻地“拉”向地(GND),让它默认保持低电平(LOW)。
-
工作原理:
-
当引脚什么都不接时:重物起作用,引脚稳稳地是低电平(0V)。
-
当你想把引脚拉高(比如接一个按钮到3.3V):你需要提供电压(按下按钮)克服重物的拉力,把引脚拉到电源(3.3V),它就变成高电平(HIGH)。
-
-
适用场景: 比如某些传感器输出高电平有效信号。平时传感器没信号(悬空),我们希望引脚是低电平;传感器有信号时输出高电平。
-
优势: 同样,ESP32内部也自带这个“小重物”(下拉电阻)!代码就能打开。
简单比喻
-
悬空引脚: 断线的风筝,乱飘(电平不确定)。
-
上拉电阻: 给风筝拴一根很轻的皮筋,轻轻拉向天空(默认HIGH)。
-
下拉电阻: 给风筝拴一根很轻的绳子,轻轻拉向地面(默认LOW)。
-
按按钮(接GND): 相当于用力把风筝扯下来(拉到LOW)。
-
按按钮(接3.3V): 相当于用力把风筝吹上去(拉到HIGH)。
代码示例(使用内部上拉电阻 - 按钮)
假设你有一个按钮:
-
按钮一脚接ESP32的GPIO13引脚。
-
按钮另一脚接GND(地)。
-
注意: 我们没有在按钮和3.3V之间接任何物理电阻!全靠ESP32内部的上拉电阻。
const int buttonPin = 13; // 按钮接在GPIO13
void setup() {
Serial.begin(115200); // 打开串口监视器,方便查看结果
pinMode(buttonPin, INPUT_PULLUP); // 关键!设置引脚为输入模式,并启用内部上拉电阻
}
void loop() {
int buttonState = digitalRead(buttonPin); // 读取引脚状态
// 重要:因为启用了上拉,且按钮接地...
// 没按按钮时:引脚被上拉电阻拉到HIGH (3.3V)
// 按下按钮时:引脚被按钮直接拉到GND (0V),变成LOW
if (buttonState == LOW) { // 如果检测到低电平,说明按钮被按下了!
Serial.println("Button Pressed!");
} else {
Serial.println("Button Released");
}
delay(100); // 稍微延迟一下,避免串口打印太快看不清
}
代码解释
pinMode(buttonPin, INPUT_PULLUP);:-
第二个参数
INPUT_PULLUP:设置引脚模式为输入(INPUT),并且启用该引脚内部的上拉电阻(PULLUP)。这就是ESP32的魔法所在,省掉了外部电阻! -
第一个参数
buttonPin:指定要设置的引脚(这里是GPIO13)。 -
pinMode函数用于设置引脚的工作模式。
-
-
if (buttonState == LOW) { ... } else { ... }:-
if (buttonState == LOW):如果状态是LOW(低电平),说明什么?说明按钮被按下了! 因为按下按钮把GPIO13直接连到了GND(0V),强制把它从内部上拉电阻维持的HIGH状态拉到了LOW。 -
判断读取到的引脚状态。
-
delay(100);:-
让程序暂停100毫秒(0.1秒)。
-
作用:避免
loop()循环运行太快,导致串口监视器瞬间刷屏太快你看不清结果。这个延迟对按钮检测的基本功能不是必须的,但在这里让输出更友好。实际应用中可能需要处理按钮消抖,但这里简化了。
-
-
核心要点回顾
-
悬空引脚是坏蛋: 会导致电平乱跳,信号不可靠。
-
上拉下拉是帮手: 给悬空引脚一个稳定可靠的默认状态(HIGH或LOW)。
-
ESP32自带帮手: 大部分GPIO引脚都有内部的上拉(
INPUT_PULLUP)和下拉(INPUT_PULLDOWN)电阻,用pinMode就能激活,省掉外部电阻,非常方便! -
按钮接法逻辑:
-
用上拉(
INPUT_PULLUP)时:按钮通常一端接引脚,另一端接GND。按下=引脚变LOW。 -
用下拉(
INPUT_PULLDOWN)时:按钮通常一端接引脚,另一端接3.3V。按下=引脚变HIGH。代码中把INPUT_PULLUP换成INPUT_PULLDOWN即可。
-
-
代码关键:
pinMode(pin, INPUT_PULLUP);或pinMode(pin, INPUT_PULLDOWN);是启用内部电阻的核心语句。
现在,你可以放心地给你的ESP32引脚接按钮或者传感器了,知道怎么用内部的“小皮筋”或“小重物”让它们乖乖听话,不会乱飘了!
然后再来看正点原子的文档:
上拉电阻:

当按键开关断开时,即没有被按下时,ESP32S3 的 IO0 通过电阻和 3.3V 电源相连接,产生
高电平,digitalRead(0)函数的返回值为 1。当按键开关闭合时,即按下按键时,ESP32S3 的 IO0
的电压和地相连接,产生低电平,digitalRead(0)函数的返回值为 0。电路中的 1KΩ电阻成为上
拉电阻。
下拉电阻:

当按键开关断开时,即没有被按下时,ESP32S3 的 IO0 通过电阻和地相连接,产生低电平,
digitalRead(0)函数的返回值为 0。当按键开关闭合时,即按下按键时,ESP32S3 的 IO0 的电压和
电源 3.3V 相连接,产生高电平,digitalRead(0)函数的返回值为 1。电路中的 1KΩ电阻成为下拉
电阻。
当数字输入引脚的工作模式设置为 INPUT 时,读取按键值,一定要在电路中设置一个上拉
电阻或者下拉电阻,电阻的阻值一般可以为 1~10KΩ。采用上拉电阻时,当按键断开时
digitalRead(0)函数的返回值为 1。采用下拉电阻时,当按键断开时,digitalRead(0)函数的返回值
为 0。
内部上拉电阻:
除了上述的两种电路外,在 ESP32S3 控制器内部还集成了上拉电阻,
通过在 pinMode()函数中设置 mode 参数为 INPUT_PULLUP 来启动内部上拉电阻。
启动控制器内部的上拉电阻后,按键开关电路就可以省略外接电阻。

从上图可以看出,当开关断开时,digitalRead(0)函数的返回值为 1;当开关闭合时,
digitalRead(0)函数的返回值为 0。
当采用内部上拉电阻电路时,按键的一端和数字引脚相连,另外一端和地相连。
内部下拉电阻:
在 ESP32S3 控制器内部除了集成上拉电阻,还有下拉电阻,通过在
pinMode()函数中设置 mode 参数为 INPUT_PULLDOWN 来启动内部下拉电阻。
启动控制器内部的下拉电阻后,按键开关电路就可以省略外接电阻。

从上图可以看出,当开关断开时,digitalRead(0)函数的返回值为 0;当开关闭合时,
digitalRead(0)函数的返回值为 1。
当采用内部下拉电阻电路时,按键的一端和数字引脚相连,另外一端和 VCC 相连。
怎么样,现在印象是不是就更深了。
2262

被折叠的 条评论
为什么被折叠?



