This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

About current consumption nrf52810 in idle mode

Hi,

I try to use the online power profiler to estimate the current consumption in both connected mode and advertising mode.

The setup for my online power profiler is as below:

{
  "chip": "3",
  "voltage": "3.3",
  "lf_clock": "lfrc",
  "radio_tx": "0",
  "ble_type": "adv",
  "ble_int": "2000",
  "tx_size": "31"
}

However, the current consumption on my real board get a average current higher than 16uA (16uA is the current consumption I see between 2 advertising event, so the actual average current should be even higher). But the current after entering system off is very low (about 1uA). So I suspected that there are some settings I didn't config  correctly.

So my questions are:

1. What settings I need to set to achieve current consumption closer to the estimation?

2. I see if I the current consumption is lower if I use external crystal rather than the internal RC. What API should I use to achieve it?

3. I have read some posts that the power management module is automatically switching to low power mode, I just wonder why I can't achieve the lowest current consumption. Any hints for me to debug?

4. I see if I turn on the dc-dc converter, it can achieve even lower current consumption. However, when I turn it on, it get even higher current consumption. Could you suggest the correct piece of code and sdk config I should set in order to corrected enable the internal dc-dc converter?

Thanks,

Jones

  • Hi,

    Are you running your tests on one of our DKs, or on your own custom board? If testing on your custom board I would recommend you to do the measurements on a DK as well, to make sure that it is not the board itself drawing excessive current.

    1. Typically if you see (significantly) higher current than the estimated average, there is some peripheral running in your application drawing excessive current. A typical example is that the NRF_LOG module could be enabled, or you have added some serial interface (SPI/TWI/etc.) to gather sensor data, etc. 

    2. By default, the examples in the SDK are configured to use external crystal for the LFCLK source. This post shows how to change it to internal RC oscillator. Note that you must have the 32.768 kHz crystal on the board to utilize this.

    3. The chip will not enter low power mode unless you tell it to do so in your code. If you are using the power management library (nrf_pwr_mgmt), a call to nrf_pwr_mgmt_run() is typically run in an endless loop inside main() to put the CPU in sleep mode whenever no other tasks needs to be handled. You can also enter System ON sleep mode by calling _WFE() directly.

    4. The DC-DC converter can typically reduce the high-currents generated by the radio and other peripherals with high power demands, especially when powering the chip on the higher end of the supported supply voltage range. Note that the DC-DC converter will only be activated by the chip when it is the most efficient option. Enabling DC-DC will not reduce sleep currents. Again, DC-DC requires additional external components, so you should make sure you have these mounted if using a custom board, before enabling this option. The simples code to enable DC-DC converter is to add this line at the start of your main() function:

    NRF_POWER->DCDCEN = 1;

    Best regards,
    Jørgen

  • Hi Jørgen,

    Sorry for the late reply. 

    I am able to lower the current consumption by disabling the nrf_log, thank you very much.

    However, I got another problem which is related to GPIO.

    I got a sensor which has a push-pull output pin to tell me on/off status of some other part. 

    I have already configured the my input pin into "NRF_GPIO_PIN_NOPULL". But when the input pin is LOW, the current consumption still 20uA higher than that when the input is HIGH.

    I have already checked that if I disconnected the sensor output pin from nrf52810 (the sensor still power on), no matter the output pin is high or low, the current consumption remains the same.

    So I suspect it is gpio setting problem. Below is my app_button init code:

    static void buttons_init(void)
    {
        ret_code_t err_code;
    
        static app_button_cfg_t buttons[] =
        {
            {SENSOR_INPUT, false, NRF_GPIO_PIN_NOPULL, button_event_handler},
        };
        
        err_code = app_button_init(buttons, ARRAY_SIZE(buttons), APP_TIMER_TICKS(50));
        APP_ERROR_CHECK(err_code);
        
        err_code = app_button_enable();
        APP_ERROR_CHECK(err_code);
    }
    
    static void button_event_handler(uint8_t pin_no, uint8_t button_action)
    {
        ret_code_t err_code;
    
        switch (pin_no)
        {
            case SENSOR_INPUT:
            if(button_action == APP_BUTTON_PUSH)
            {
                NRF_LOG_INFO("SENSOR_LOW");
            }
            else
            {
                NRF_LOG_INFO("SENSOR_HIGH");
            }
            break;
    
            default:
                APP_ERROR_HANDLER(pin_no);
                break;
        }
    }

    Thanks,

    Jones

  • 20 uA does not sound like leakage current from GPIO pull resistors, those should have been higher. Can you check if you have the config "BUTTON_HIGH_ACCURACY_ENABLED" set in your project?

  • I didn’t enabled that.

    I have tried enabled it and then set “false” in the app_button_cfg_t, the current still not reducing.

  • Are you using a custom board? Are you able to reproduce the same behavior on a nRF5x DK?

Related