Is lowest power consumption of 1.2uA possible using nrf52832 & SYSTEM_ON (s132, SDK17) for GATTS - Central

Hi nRF community,

I have a question regarding the lowest power consumption ever possible with nRF52832 chip.

I'm experimenting with power consumption using nRF52832 DK (PCA10040 1.2.1), talking to another nRF52832DK.

I run a central (based on GATTS example) scanning for my peripheral, I use SDK17.1 + S132.

The SDK is configured to have no logs and external interfaces, and most of the peripherals are disabled + I use DCDC.

After the BLE initialization is complete I set up the interrupt event for GPIOTE.

The entire thing is configured and run's properly for the BLE piece but I want it to have a smaller consumption while I'm in idle state (during __WFE()).

Before entering the main loop I call "  sd_power_mode_set(NRF_POWER_MODE_LOWPWR) " function and basicly wait for an event on the interrupt to start scanning.

Currently according to nRF PPK2 I'm consuming around 18 microamps, but the question is can I get it 10 times smaller, like 1.2 ~ 2 uA (microamps)?

What other peripherals I can disable if I use SoftDevice and BLE ? 

Regards, 

Dmytro.

Parents
  • Hello,

    So when you measure the current and you get 18 µA, what is your application doing at that point? Advertising? Scanning? in a connection? Is the SoftDevice enabled? 

    Did you see any numbers indicating that the current consumption should be around 1.2-2µA at this stage?

    Best regards,

    Edvin

  • Hi Edvin,

    Regarding your quetion's : 

    I have most of application modules enabled (the code I execute is listed below)

    int main(void)
    {
        // Initialize.
        external_interrupt_init();     // Enable external event on rising pulse edge (lo-to-hi)
        power_management_init();     // Init power manager
        ble_stack_init();     // Init the BLE stack
        gatt_init();     // Init GATT's
        services_init();     // Init BLE services + characteristic
        scan_init();     // Init BLE Scan module
        sd_power_mode_set(NRF_POWER_MODE_LOWPWR);     // Configre power manager to keep LP mode

        // Enter main loop.
        for (;;) {
            my_state_machine(); // State machine that starts scan on interrupt event
            APP_ERROR_CHECK(sd_app_evt_wait()); // Power mamnger __WFE
       }
    }

    When I have SoftDevice enabled + GATT + Service + scan init + GPIOTE - I have 18 uA consumption.

    I need to get the lowest consumption for the SYSTEM_ON mode described in nRF52832 1.8 PS

    https://infocenter.nordicsemi.com/pdf/nRF52832_PS_v1.8.pdf - page 80.

    It is stated that SYSTEM_ON full ram retention [no ram retention] is 1.5 uA [1.2 uA] only, how can I get my system to consume that little power?

  • Hi Edvin, 

    Done. I have packed the entire project folder, and was able to get it compiling, flashing and working with no errors after unpacking prepared archive, attaching it here. I will also add my .hex just for the test on your end to chec the current consumption level for my build.

    Kind regards,

    Dmytro.

    ble_app_gatts_pca10040_s132_LP.hex

    hex
    3175.ble_app_gatts.zip

    zip

    iar build

  • What does your nrfx_uarte.c file look like? The reason I ask is that I don't have IAR installed, but when I try to compile using the SES project, I am not able to, because of the lacking definitions that I showed in a screenshot in my previous reply. 

    I can fix it by changing a few of the sdk_config.h definitions, but I suspect that you have just removed the line:

    #if NRFX_CHECK(NRFX_UART_ENABLED)

    in nrfx_uart.c.

    If that is the case, did you change anything else in the SDK files? Did you try to unzip it in a pristine (unmodified) SDK?

    Either way, the UART in this project is only used for logging, which is disabled, so I don't think this should matter for the current consumption, but if you did changes like these, perhaps you did other changes that could affect the current consumption as well, which is why I am keep nagging about this. 

    Either way, I decided to just do the fixes to make it compile, and I initially saw about the same current consumption as you see. I set the samples per second in the PPK FW to maximum, which gives a higher resolution(but the same average numbers). 

    I then started looking into the application. I saw that commenting out external_interrupt_init(); reduced the current consumption to about 7µA. I then saw that you used:

    nrfx_gpiote_in_config_t in_config = GPIOTE_CONFIG_IN_SENSE_LOTOHI(true);

    where the "true" means high accuracy mode. While this is more accurate, it also requires more current. If you only need it for a simple button push, you can use the low accuracy mode. To test it properly on a DK, I changed the EXT_EVT_INT_PIN to 13 (Button 1), and set the in_config like this:

    nrfx_gpiote_in_config_t in_config = GPIOTE_CONFIG_IN_SENSE_HITOLO(false);
    in_config.pull = NRF_GPIO_PIN_PULLUP;

    to match the HW in the buttons. 

    Also, adding a switch to turn off scanning, to see that the current consumption goes down again. I only did changes to sdk_config.h and main.c in the attached project. Other than those, it is identical to what you sent me. The changes in sdk_config.h was just to be able to compile, so if you already changed nrfx_uarte.c, you probably don't need those changes in sdk_config.h. Only main.c.

    4606.ble_app_gatts.zip

    So the main takeaway is to set the in_config to low_accuracy, using GPIOTE_CONFIG_IN_SENSE_LOTOHI(false);

    Best regards,

    Edvin

  • Hi Edvin, thanks, I will give it a try to see if there any significant change in the consumption.

  • Hi Edvin.

    I have conducted the test with GPIOTE_CONFIG_IN_SENSE_LOTOHI(false) and got some consumption reduction but it was still at around 15 micro amps.

    I intended to get the better current readings for my nRF52832 DK as those were to noisy and attached my DUT to a LiPo battery to see if any difference and I was amazed seeing the 1.9 uA consumption. So it turns out when nRF DK runs on a micro USB cable it consumes significantly more, compared to a battery powered version.

    I didn't got my 1.2 uA, but I'm pretty happy with 1.9 uA consumption, it fits my needs, thanks for the clue with the GPIOTE low accuracy config, it did worked, it have increased the interrupt processing time slightly but still fit my timing requirements, so it is solved. The ticket can be closed. Thank You !!!

    Regards, Dmytro.

Reply
  • Hi Edvin.

    I have conducted the test with GPIOTE_CONFIG_IN_SENSE_LOTOHI(false) and got some consumption reduction but it was still at around 15 micro amps.

    I intended to get the better current readings for my nRF52832 DK as those were to noisy and attached my DUT to a LiPo battery to see if any difference and I was amazed seeing the 1.9 uA consumption. So it turns out when nRF DK runs on a micro USB cable it consumes significantly more, compared to a battery powered version.

    I didn't got my 1.2 uA, but I'm pretty happy with 1.9 uA consumption, it fits my needs, thanks for the clue with the GPIOTE low accuracy config, it did worked, it have increased the interrupt processing time slightly but still fit my timing requirements, so it is solved. The ticket can be closed. Thank You !!!

    Regards, Dmytro.

Children
No Data
Related