What is using so much power in light sleep mode? (WSL V3)

I am testing the Wireless Stick Lite V3 (e.g. ESP32-S3 & SX1262). The power consumption in light sleep mode doesn’t make sense; truly unacceptable. Attached is a high res current trace. The sketch puts the V3 into light sleep for 3 seconds and then into deep sleep for 3 seconds. In both cases, the SX1262 is doing a duty cycle read, looking for preambles (there are none…). The deep sleep current looks fine. The base is a few uA, and the peaks are 7.4mA, for an average utilization of 3.4mA, due to the duty cycle.

But in the case of light sleep, there is the same pattern, but it is over a base current of ~7.7mA, so the average current is 10.7mA. Per espressif, the CPU should be using <1mA in light sleep (I even set the freq to 40Mhz), so where is the other 6-7mA going? I need the CPU to wake up on ext0 or timer events. There is no USB, Ethernet or BT enabled, nothing is talking to the USB, etc. The source of power is 4.2V from the current measuring device (Nordic Semi PPK II). Any clues?

Because no one has replied to your post yet, I will just note that I too have an interest in [minimising] sleep current, but I’ve only just ordered some V3 boards (WiFi LoRa and WSL). I also use a Nordic PPK II for current measurements, so I’ll post a more informed comment when I receive my boards and run a few tests in my own environment.

I usually run my boards from battery (with solar panel charging), but I’ve been focussed on the CubeCell dev boards of late. I’ve ordered the V3 boards because I noted what looked like a significant upgrade in the power management circuitry (pretty much in line with what’s on the CubeCell dev boards), so it will be interesting to see how that impacts things.

Just a random thought though, if you’re powering through the 5V pin, the schematic suggests that this ‘injects’ power at the same point as the on-board USB socket (but after the fuse). My guess would be that that would be exactly the same as powering through the on-board USB socket, so it may be that the UART is active, even if it’s not being used as such.

Thanks for responding on this concern. CubeCell and WSL V3 have the SX1262 which has the very nice ReceiveDutyCyle feature that lowers average power about 50% when awaiting an incoming packet. The CubeCell does this is their sleep mode, which is comparable to the esp32 light sleep mode, e.g. memory is preserved while asleep. The CubeCell does this with a baseline current level of uAs (seen on the Nordic PPL II). But the V3 has a baseline current of 7mA during light sleep. It is close to zero during deep sleep, when only the SC1262 is running. I do these tests powering the parts from their battery input, driving it with the voltage sourcing of the PPK II. See attached for V3. Average current is 10.8mA while the CubeCell is 3.3mA.

The fact that in deep sleep the background current is zero, smells like something is going on in the SOC. Perhaps something is going on with the 8MB flash or SPI RAM that draws power.

The CubeCell flash and RAM size make it very difficult for me to achieve my requirements.

It is convenient to send out your program. Would you please analyze the problem?

Here is a sketch that shows three phases, each 500 ms.
(1) normal power (2) light sleep (3) deep sleep, with the SX1262 running a ReceiveDutyCycle operation during phase 2 and 3. The attached PNGs show current usage recorded by a Nordic PPK II, supplying 4.20V to the battery input of the V3. The second PNG zooms in during light sleep. You can see the baseline current draw is about 5mA, not <1uA.

/*
   Power usage monitoring    8/17/2022
*/

#define LED 35
#define TXD 43
#define PHASE_SECS 0.5

#include <RadioLib.h>
SX1262 radio = new Module(8,14,12,13);    // for Heltec Wireless Stick Lite V3

void errOut(int code) {
   pinMode(LED, OUTPUT);
   while (1) {
      for (int i = 0; i < code; ++i) {
         digitalWrite(LED, HIGH);
         delay(250);
         digitalWrite(LED, LOW);
         delay(250); }
      delay(2000); } }

void setup() {
	
	if (radio.begin(923.3f,500.0f,9u,8u,0x12u,17l,32u,1.8f,false) != RADIOLIB_ERR_NONE) errOut(1) ;
}

void loop() {

   delay(1000L * PHASE_SECS);   // normal-mode execution

   pinMode(TXD, OUTPUT);
   digitalWrite(TXD, LOW); // set TXD low before turning off other stuff; this actually saves power!
	
	 if (radio.startReceiveDutyCycleAuto(0,8) != RADIOLIB_ERR_NONE) errOut(2);

   // We want RTC peripherals to stay on
   //if (ESP_OK!=esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON)) errOut(1);
   // try turning them off...........
   //if (ESP_OK != esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF)) errOut(2);
   //if (ESP_OK != esp_sleep_enable_ext0_wakeup((gpio_num_t)14, HIGH)) errOut(3); // wake on LORA RX

   if (esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF) != ESP_OK) errOut(3);
   if (esp_sleep_pd_config(ESP_PD_DOMAIN_XTAL,       ESP_PD_OPTION_OFF) != ESP_OK) errOut(4);
   if (esp_sleep_pd_config(ESP_PD_DOMAIN_CPU,        ESP_PD_OPTION_OFF) != ESP_OK) errOut(5);
   if (esp_sleep_pd_config(ESP_PD_DOMAIN_RTC8M,      ESP_PD_OPTION_OFF) != ESP_OK) errOut(6);
   if (esp_sleep_pd_config(ESP_PD_DOMAIN_VDDSDIO,    ESP_PD_OPTION_OFF) != ESP_OK) errOut(7);

   esp_sleep_enable_timer_wakeup(1000L * 1000L * PHASE_SECS); // value in microsec
   esp_light_sleep_start();
// returns to here
		if (radio.startReceiveDutyCycleAuto(0,8) != RADIOLIB_ERR_NONE) errOut(2);  

		esp_sleep_enable_timer_wakeup(1000L * 1000L * PHASE_SECS); // value in microsec
		esp_deep_sleep_start();
 }

Do not see you lora into the low-power statements?

Is that the SX1262 power chart? The S1262 is NOT in receive mode. It is in receiveDutyCycle mode. Look at the power usage when the MCU is in deep sleep. It goes down to a few uAs. Why is the rest of the SOC/Board using power during light sleep? It is not the SX1262.

This is the power diagram of SX1262. Try putting sx1262 into sleep mode.

I don’t understand what you are suggesting. The problem is the amount of power that the WSL V3 board draws when (1) it is in ReceiveDutyCycle mode and (2) the MCU is in light-sleep mode.

/*

  • HelTec Automation™ WIFI_LoRa_32 factory test code, witch includ
  • follow functions:
    • Basic OLED function test;
    • Basic serial port test(in baud rate 115200);
    • LED blink test;
    • WIFI connect and scan test;
    • LoRa Ping-Pong test (DIO0 – GPIO26 interrup check the new incoming messages);
    • Timer test and some other Arduino basic functions.
  • by Aaron.Lee from HelTec AutoMation, ChengDu, China
  • 成都惠利特自动化科技有限公司
  • https://heltec.org
  • this project also realess in GitHub:
  • https://github.com/HelTecAutomation/Heltec_ESP32
    */

#include “Arduino.h”
#include “WiFi.h”
#include “images.h”
#include “LoRaWan_APP.h”
#include <Wire.h>

static RadioEvents_t RadioEvents;

void setup()
{
Mcu.begin();
Radio.Init( &RadioEvents );
Radio.Sleep();
SPI.end();
pinMode(RADIO_DIO_1,ANALOG);
pinMode(RADIO_NSS,ANALOG);
pinMode(RADIO_RESET,ANALOG);
pinMode(RADIO_BUSY,ANALOG);
pinMode(LORA_CLK,ANALOG);
pinMode(LORA_MISO,ANALOG);
pinMode(LORA_MOSI,ANALOG);

}

void loop()
{
pinMode(43,ANALOG);
pinMode(44,ANALOG);
esp_sleep_pd_config(ESP_PD_DOMAIN_VDDSDIO,ESP_PD_OPTION_OFF);
esp_sleep_cpu_pd_low_init(true);
esp_light_sleep_start();

// esp_deep_sleep_start();
}

Thanks, Navi. I was not turning off the MCU, which I thought was automatic in light_sleep.

It is also important to stop leakage on TXD, saving 3mA (!).
pinMode(TXD,ANALOG);
is one way to do that.

Now my baseline current is 2.0mA rather than 7.5mA. Thanks for the clue.