This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Low Power Mode - nrf52833

We are having trouble getting the NRF52833 to operate in a low power mode.  It always seems to be drawing 1-2mAmps.

Application: Nrf52833, Central host, scans 100ms every 3 seconds, UART to Host MCU to deliver advertisments and peripheral data.

Our application is based on the Central UART example.  Our hardware uses one UART.

We use timers to control scanning and idle times of operation.  We consider the Application to be idle where the UART is disabled, and no BLE communications is active.  But sometimes the current use inreases and does not return to low levels.  How can we debug  what part of the system is running and using the power during idle period when we expect Power management to be running?  Is there additional initialization of power management needed?

static void idle_state_handle(void)
{
if (NRF_LOG_PROCESS() == false)
{
// watchdog & failsafe state management
nrf_pwr_mgmt_run();

}
}

Thanks,

Dan

Parents
  • Hi, from a hardware perspective there is nothing called low power mode or power management. The CPU is either executing code or it's not, and the peripherals are either active or not. The nrf_pwr_mgmt_run() function just makes sure that the CPU is in a WFE (wait for event) state, meaning that the CPU is in idle (consuming no current) until there is an interrupt/event; and since this function is called from the main loop, it will always return to this WFE state after the interrupt callback is finished. So unless something (application timers or similar) keeps waking up the CPU all the time, I don't think the problem lies with this "power management" part of the code.

    Unfortunately there is no easy way to check if other peripherals than the CPU are running, you just have to make sure that they are uninitialized properly after use by using the nrfx drivers. So my guess is that the UART is somehow not properly disabled. Or there are other peripherals running. One common pitfall is to not disable the logging module (which also uses UART), which is enabled by default in most SDK examples. You can turn this off by setting NRF_LOG_ENABLED to 0 in sdk_config.h

    Some questions:

    1. You write that the nRF52833 always seems to be drawing 1-2mA of current, but you also say that sometimes the current use increases and does not return to low levels. So are you able to get down to low power consumption sometimes? And which current consumption level do consider to be low power?
    2. Is this 1-2mA consumed at the VDD input to the nRF52833, and at which voltage level? Or are there any onboard DCDC regulators or similar between the measuring equipment and the nRF52 VDD input? What I'm trying to figure out is if it is possible to determine the exact current draw at the nRF52 VDD input, as this might give some clues to what is drawing current.
    3. Have you been able to verify your measurement setup? For example by putting the chip to system OFF mode and see if you can get down to the specified 0.6 uA?
    4. Can you share some code showing UART uninit and how you set up the timers to control the scanning and idle times? Which libraries/drivers you are using, etc.

    Thanks

    Best regards,
    Stian

Reply
  • Hi, from a hardware perspective there is nothing called low power mode or power management. The CPU is either executing code or it's not, and the peripherals are either active or not. The nrf_pwr_mgmt_run() function just makes sure that the CPU is in a WFE (wait for event) state, meaning that the CPU is in idle (consuming no current) until there is an interrupt/event; and since this function is called from the main loop, it will always return to this WFE state after the interrupt callback is finished. So unless something (application timers or similar) keeps waking up the CPU all the time, I don't think the problem lies with this "power management" part of the code.

    Unfortunately there is no easy way to check if other peripherals than the CPU are running, you just have to make sure that they are uninitialized properly after use by using the nrfx drivers. So my guess is that the UART is somehow not properly disabled. Or there are other peripherals running. One common pitfall is to not disable the logging module (which also uses UART), which is enabled by default in most SDK examples. You can turn this off by setting NRF_LOG_ENABLED to 0 in sdk_config.h

    Some questions:

    1. You write that the nRF52833 always seems to be drawing 1-2mA of current, but you also say that sometimes the current use increases and does not return to low levels. So are you able to get down to low power consumption sometimes? And which current consumption level do consider to be low power?
    2. Is this 1-2mA consumed at the VDD input to the nRF52833, and at which voltage level? Or are there any onboard DCDC regulators or similar between the measuring equipment and the nRF52 VDD input? What I'm trying to figure out is if it is possible to determine the exact current draw at the nRF52 VDD input, as this might give some clues to what is drawing current.
    3. Have you been able to verify your measurement setup? For example by putting the chip to system OFF mode and see if you can get down to the specified 0.6 uA?
    4. Can you share some code showing UART uninit and how you set up the timers to control the scanning and idle times? Which libraries/drivers you are using, etc.

    Thanks

    Best regards,
    Stian

Children
No Data
Related