上拉电阻和下拉电阻

本人是初学者,在看正点原子的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); // 稍微延迟一下,避免串口打印太快看不清
}

代码解释

  1. pinMode(buttonPin, INPUT_PULLUP);
    • 第二个参数INPUT_PULLUP:设置引脚模式为输入(INPUT),并且启用该引脚内部的上拉电阻(PULLUP)。这就是ESP32的魔法所在,省掉了外部电阻!

    • 第一个参数buttonPin:指定要设置的引脚(这里是GPIO13)。

    • pinMode函数用于设置引脚的工作模式。

  2. if (buttonState == LOW) { ... } else { ... }

    • if (buttonState == LOW):如果状态是LOW(低电平),说明什么?说明按钮被按下了! 因为按下按钮把GPIO13直接连到了GND(0V),强制把它从内部上拉电阻维持的HIGH状态拉到了LOW

    • 判断读取到的引脚状态。

    • delay(100);

      • 让程序暂停100毫秒(0.1秒)。

      • 作用:避免loop()循环运行太快,导致串口监视器瞬间刷屏太快你看不清结果。这个延迟对按钮检测的基本功能不是必须的,但在这里让输出更友好。实际应用中可能需要处理按钮消抖,但这里简化了。

核心要点回顾

  1. 悬空引脚是坏蛋: 会导致电平乱跳,信号不可靠。

  2. 上拉下拉是帮手: 给悬空引脚一个稳定可靠的默认状态(HIGH或LOW)。

  3. ESP32自带帮手: 大部分GPIO引脚都有内部的上拉(INPUT_PULLUP)和下拉(INPUT_PULLDOWN)电阻,用pinMode就能激活,省掉外部电阻,非常方便!

  4. 按钮接法逻辑:

    • 用上拉(INPUT_PULLUP)时:按钮通常一端接引脚,另一端接GND。按下=引脚变LOW

    • 用下拉(INPUT_PULLDOWN)时:按钮通常一端接引脚,另一端接3.3V。按下=引脚变HIGH。代码中把INPUT_PULLUP换成INPUT_PULLDOWN即可。

  5. 代码关键: 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 相连。

 

怎么样,现在印象是不是就更深了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FightingFreedom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值