乐鑫技术交流
直播中

安德森大

8年用户 1221经验值
擅长:接口/总线/驱动
私信 关注
[问答]

有没有办法在深度睡眠期间保持gpio值?

长期以来,我一直在努力为物联网系统保持足够低的功耗,电流源非常低。源通过方波脉冲 (MBUS) 发送数据,当接收到新数据帧时需要禁用当前源。
调制解调器睡眠有效,并允许我们使用 gpios 启用/禁用充电。然而,在 modemsleep 中,系统使用大约 23 mA 的平均值,这对应用程序来说是临界值。
一种替代方法是使用深度睡眠。在深度睡眠模式下,功耗平均低于 10 毫安,系统将获得充足的电力。我通过 150 欧姆将 D0 连接到 RST 进行深度睡眠工作。然而,在深度睡眠期间,我无法打开 gpios 充电然后睡眠,因为引脚值在睡眠期间变为默认值。我相信我已经成功地写入了引脚寄存器并设置了在睡眠期间激活高上拉的位。但如果是这样,这也无济于事,因为它们的值在深度睡眠期间也会更改为默认值。希望这是可以修复的,但我一直无法找到如何修复。
第三种选择是使用浅睡眠。这种睡眠形式可以充分降低功耗,还可以让我们按预期使用 gpios。但是,我无法启动 lig​​htsleep。
这是我的代码的相关部分(不包括读取和设置 gpio 寄存器):
代码:全选void setup() {
  
  lightSleep = true;

  // setup gpios to control charging from low current source

  // Serial setup
  Serial.begin(74880);
  Serial.setDebugOutput(true);
  delay(10);

  //WiFi setup

  WiFi.mode(WIFI_STA);
  if (WiFi.status() != WL_CONNECTED) {
    WiFi.begin(ssid, password);
    Serial.print("?");
  }
  WiFi.config(ip, gateway, subnet);
  IPAddress myip = WiFi.localIP();

  //  Enable light sleep as alternative to modem sleep
  if (lightSleep) {
    wifi_set_sleep_type(LIGHT_SLEEP_T);
  }

  sprintf((char*)setupMessage, "Setup done, connected to %u.%u.%u.%u after %d ms.rn", myip[0], myip[1], myip[2], myip[3], millis());
  Serial.println((char*)setupMessage);
}

void loop() {

// turn off charging from low current source
// receive data from same source, cant charge and receive simultanously
// use gpios to set charging if all is well

if (doCharge) {                                                         // If not, only timing will start
    digitalWrite(impedancePin, HIGH);                   // Set input impedance low
    delay(10);                                                             // a delay is used to suppress any transient behaviour
    digitalWrite(converterPin, HIGH);                      // enable the DCDC converter with converterPin HIG
   }

    Serial.println("Charging has started. Good night...");

    // Alternative 1 - use modem sleep or lightsleep if enabled.
    // Light sleep          current(avg)= (8,5 * 1,5 + 1,5 * 70)/10 = 11,775 mA - good enough!
    if (lightSleep) {
      delay(1);
      delay (delayTime - 1);
    } else {
      // Modem sleep     current(avg)=8,5 * 15 + 1,5 * 70)/10 = 15 * 15,5 =  23,25 mA - too much!
      int delayCheck;
      delayCheck = delayTime;
      while (delayCheck > 0) {                                             // a buffer is already taken into account
        delay (delayInterval);
        delayCheck = delayCheck - delayInterval;
      }
    }
    /*
            // Alternative 2 - use deep sleep.
            ESP.deepSleep(delayTime * 1000);                      // GPIO4&5s registers loose values during deepsleep
    */
  }
}

所以我的问题是:
1)有没有办法在深度睡眠期间保持 gpio 值?
2) 如何修复上面的代码以激活 ligthsleep?

更多回帖

发帖
×
20
完善资料,
赚取积分