Page 1 of 1

Deep sleep ulp interrupt pulse counter high power consumption

Posted: Tue Nov 19, 2024 9:23 pm
by kapucin22
Hello,
I'm trying to determine if my test results are accurate or deep-sleep code could be improved somehow.

Set-up:
Hardware: ESP32-C6, DFRobot DFR1075 FireBeetle2
Test equipment: Nordic Power profiler Kit II
Example: system/ulp/lp_core/gpio_intr_pulse_counter
IDF: v5.3.1

Problem:
during deep sleep phase the board consumes 1.3mA on average

Other deep-sleep example from DFRobot (ULP timer wakep) gives me power consumption of about 0.019mA.
It looks like that the biggest contributor to the power usage is ULP program running in a while(1) loop and ulp_lp_core_wait_for_intr() call.

I tried to isolate and/or reset all pins (ULP and/or GPIO) that are not being used for the interrupt. The power usage reduced by 1mA maybe, but that' all.

Can you confirm that what I'm seeing is about accurate power consumption given the specific example?
Is there anything in IDF I could use to reduce the power consumption for ULP programs handling interrupts?

Re: Deep sleep ulp interrupt pulse counter high power consumption

Posted: Wed Nov 20, 2024 4:21 am
by ESP_Sprite
I would not be surprised if it is; the ULP and peripherals are still powered on.

Re: Deep sleep ulp interrupt pulse counter high power consumption

Posted: Wed Nov 20, 2024 8:56 am
by MicroController
kapucin22 wrote:
Tue Nov 19, 2024 9:23 pm
Is there anything in IDF I could use to reduce the power consumption for ULP programs handling interrupts?
Waking up the ULP by LP IO, processing one edge of the signal, then halting the ULP again waiting for the next LP IO wakeup can save a lot of power; if the pulse frequency isn't too high.

Re: Deep sleep ulp interrupt pulse counter high power consumption

Posted: Wed Nov 20, 2024 1:04 pm
by kapucin22
Waking up the ULP by LP IO
What exactly is that LP IO, isn't the interrupt already one of them?

How I understand it is the signal on the pin is one half of waking-up process, the other half is ULP listening for that trigger so as to invoke the interrupt function. So it must be listening to handle the interrupts. The doc says the following (but the power draw still looks high):
void ulp_lp_core_wait_for_intr(void)
Puts the CPU into a wait state until an interrupt is triggered.
Note
The CPU will draw less power when in this state compared to actively running

Re: Deep sleep ulp interrupt pulse counter high power consumption

Posted: Wed Nov 20, 2024 9:02 pm
by kapucin22
Waking up the ULP by LP IO
I found the example that demonstrates it: [lp_core_gpio_wake_up]examples/system/ulp/lp_core/gpio_wakeup/main/lp_core_gpio_wake_up_example_main.c[/url]; it works only with master (latest).
Deep sleep consumption is around 0.02mA. Much better.

Thanks!

Re: Deep sleep ulp interrupt pulse counter high power consumption

Posted: Thu Nov 21, 2024 12:01 pm
by MicroController
kapucin22 wrote:
Wed Nov 20, 2024 1:04 pm
Waking up the ULP by LP IO
What exactly is that LP IO, isn't the interrupt already one of them?
Yeah, GPIO, LP IO... ;-) I just meant ULP_LP_CORE_WAKEUP_SOURCE_LP_IO.
How I understand it is the signal on the pin is one half of waking-up process, the other half is ULP listening for that trigger so as to invoke the interrupt function. So it must be listening to handle the interrupts.
I see it like this: If you already have a program running on the ULP doing <stuff>, you can use an IO interrupt to make the program also handle asynchronous IO events.
If you want to only handle IO events, you don't need the interrupt; or put differently: int main (void) can be your "interrupt handler" handling the IO event(s) configured to wake up the ULP.

Having the ULP powered up but idle waiting for an interrupt is sure to consume more energy than shutting down (i.e. halting) the ULP.