ESP32:如何在深度睡眠期间保持引脚为高电平(RTC GPIO 上拉太弱)?

电器工程 ESP8266 睡觉
2022-02-06 00:57:43

我在电池供电的设备中使用 ESP32。ESP 大部分时间都处于深度睡眠状态以节省电量。该设备还有一些 5V 供电的传感器,我从 MCP1640 升压转换器馈电,该转换器在短暂的活动部分期间打开,并在深度睡眠期间通过其“启用”引脚关闭。原理图的相关部分是:

示意图

模拟此电路- 使用CircuitLab创建的原理图

所以,我需要在睡眠期间将第 4 针保持高电平。由于这部分测试马虎,我不知道ESP32在深度睡眠期间关闭了它的GPIO,所以pin #4没有保持高电平,传感器保持活跃。这会以比预期快得多的速度耗尽电池。

我想知道是否可以通过软件补丁解决这个错误(当然,只需在引脚 4 上添加一个外部上拉电阻很容易 - 但我在现场有一些设备,我不想拥有行驶几百公里只是为了焊接一个电阻!而且周围的人自己并不精通技术;相反,远程软件修补很容易且经过良好测试)。

例如,我尝试了 RTC 的上拉电阻:

gpio_num_t pin = (gpio_num_t) PIN_DISABLE_5V;
rtc_gpio_set_direction(pin, RTC_GPIO_MODE_INPUT_OUTUT);
rtc_gpio_pulldown_dis(pin);
rtc_gpio_pullup_en(pin);                     // set the pin as pull-up
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, 
                    ESP_PD_OPTION_ON);       // keep the RTC IO domain powered

在进入深度睡眠之前执行此操作几乎可以正常工作,但事实证明弱上拉太弱:如果是电阻,可能约为 38k,如果是电流源,则可能为 90µA。这不足以驱动 ULN2003 的引脚。我也尝试过 RTC_GPIO_MODE_OUTPUT_ONLY + rtc_gpio_set_level() ,但这似乎并没有增加驱动能力。另一种可能性是浅睡眠,我会避免这种情况,因为它前段时间有问题,我不想让我的设备变砖。

所以我的问题真的是:我是否用尽了所有软件选项(因为硬件选项也需要燃烧一罐汽油)?

4个回答

好吧,很抱歉让我接受哈里·斯文森的回答!而且我真的不应该添加到现在已经 14 个月大的问题。

但是我刚刚找到了完美的软件解决方案,它可以节省我最终烧掉的一罐汽油(对不起,大自然!)。

您可以使用引脚保持功能将引脚保持在睡眠前的任何状态,而不是将引脚设置为在深度睡眠期间上拉:

#include "soc/rtc_cntl_reg.h"
#include "soc/rtc.h"
#include "driver/rtc_io.h"
...
digitalWrite(pin, HIGH);
gpio_hold_en(pin);
...

这就是你所需要的!该引脚将保持为 CMOS 输出,并根据您的需要强烈驱动至高或低。

我用下面的示意图验证了它:

示意图

模拟此电路- 使用CircuitLab创建的原理图

运行时,测得的电流约为 110µA(如预期的那样)。在深度睡眠期间,使用旧代码(在问题中,设置弱上拉),电流下降到 ~50µA(因此上拉电阻值在 30k 范围内)。使用此处建议的代码,它保持 110µA。

目前尚不清楚更改您建议的电阻器是否能有效解决您的问题。

MCP160 要求使能输入低于 Vin 的 20%,才能有效关闭器件。如果 Vin 是(比如说)5 伏,那么 20% 就是 1.0 伏,并且由于 ULN2003 是达林顿,它可能无法可靠地切换到这个低电平。但是,假设它确实切换到低于 1 伏,那么我对 5 伏 Vbatt 值的猜测仍有可能不涵盖该范围的低端。

例如,如果 Vbatt 预计会下降到 2 伏,那么只有在使能引脚低于 0.4 伏时才能关闭 MCP160。这听起来很合我的胃口,我建议你多考虑一下这个问题。

这是其他两个尝试过的人的链接。失败可能失败

因此,正如您所尝试的那样,用软件解决它看起来并不乐观。所以现在有 3 个失败,你和 2 个链接。

建议的解决方案:

  • A) 燃烧一罐汽油
    • 优点:您修复的每台设备都会正常运行。
    • 缺点:你的很多时间和金钱都会浪费在油和开车上。

  • B) 修复附近的 1 个设备,并为获得您的设备的人制作一个小教程,付钱让他们焊接一个上拉电阻,例如按照教程进行操作。是的,付钱给他们,因为他们会做一些你在产品测试阶段没有做的工作。

    • 优点:这会更便宜,拥有这些设备的人可能在专业上对你的评价更低,但在信任方面对你的评价更高。
    • 缺点:有些人……只是因为简单的事情而失败,包括焊接。所以有可能有人会毁了他们的设备,不得不从你那里再买一个,你会免费赠送,这可能是一个巨大的损失。

  • C) 和B做同样的事情,但不要告诉让你的设备来做这项工作的人,而是雇佣一些住在附近并且可以为你做的随机人。

    • 优点:拥有这些设备的人会觉得你很专业
    • 缺点:任何解决您问题的随机人现在都知道如何正确地弄乱您的乐器。

  • D) 与C做同样的事情,但使用朋友(可能住在附近)或一些同事而不是随机数。

    • 优点:拥有这些设备的人会觉得你很专业
    • 缺点:你的朋友会认为你不专业。

  • E) 执行用户DoxyLover的建议,“在本地修复一些单元并将它们运送给您的用户,并附上预付的退货运输标签,以便他们可以将原件寄回给您。


如果我是你,我会倒退,从E开始。如果这不是一个选项,那么继续使用D,如果你不能继续使用C,如果你不能继续使用B,最后使用A

每个人都缺少的问题是,保持 ULN2003 活动所需的输入电流会挫败通过使微控制器进入深度睡眠来节省电力的任何尝试。

正确的解决方案是将 ULN2003 的该部分替换为不消耗任何电流的东西,例如 MOSFET。

但是,我想知道为什么 ULN2003 首先出现在那个位置的电路​​中。为什么单片机不能直接驱动 DC-DC 转换器上的 EN 引脚?

您可能需要添加的最多的是从 EN 到地的高值下拉电阻。