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

Can't put Adafruit NRF52 Feather board into Low Power

I've been working with an Adafruit NRF52 Feather board for the last week, and have been struggling to get the board to go into a low power mode. At the moment, I am working within the Arduino IDE. Typically the board draws about 14mA just sitting in an idle loop. I have been able to reduce this usage to about 7mA, but this is not nearly enough for our needs, nor does it align with the expected power draw according to the nordic documentation.

I am using the BSP provided by Adafruit for the NRF52 Feather.

Based on the post here: forums.adafruit.com/viewtopic.php I should be able to put the device into a low power mode using the low level API.

Based on this issue for the BSP, it seems that low power isn't implemented.. github.com/.../51

I've tried the following:

void loop() {
    sd_power_mode_set(NRF_POWER_MODE_LOWPWR);
    waitForEvent();
}

Leads to a constant power draw of 14mA.

void loop() {
   __WFE();
   sd_power_mode_set(NRF_POWER_MODE_LOWPWR);
   sd_app_evt_wait();
}

Also has a constant power draw of 14mA.

void loop() {
    sd_power_mode_set(NRF_POWER_MODE_LOWPWR);
    __WFE();
}

Will draw about 15mA.

void loop() {
    sd_power_mode_set(NRF_POWER_MODE_LOWPWR);
    __WFI();
}

Draws about 6-7mA.

void loop() {
    __WFI();
}

Just the wait for interrupt call has virtually identical power draw, 6-7mA.

void loop() {
    NRF_POWER->SYSTEMOFF = 1;
}

Draws about 6-7mA, despite being the lowest power saving mode.

I've also tried explicitly turning off hardware in setup, and the main loop with the following. It has no influence on the power drawn.

    NRF_UARTE0->ENABLE = 0;  //disable UART
    NRF_SAADC ->ENABLE = 0; //disable ADC
    NRF_PWM0  ->ENABLE = 0; //disable all pwm instance
    NRF_PWM1  ->ENABLE = 0;
    NRF_PWM2  ->ENABLE = 0;
    NRF_TWIM1 ->ENABLE = 0; //disable TWI Master
    NRF_TWIS1 ->ENABLE = 0; //disable TWI Slave

    NRF_SPI0 -> ENABLE = 0; //disable SPI
    NRF_SPI1 -> ENABLE = 0; //disable SPI
    NRF_SPI2 -> ENABLE = 0; //disable SPI

    NRF_NFCT->TASKS_DISABLE = 1; //disable NFC, confirm this is the right way

I was thinking perhaps this could be due to the board sitting in a debug mode, but triggering a reset via the hardware switch, and by shorting the reset pin, has no effect on current drawn.

I attempted porting the ArduinoLowPower library (which supports the arduino Primo but not the feather) without success (missing dependencies, maybe from the sdk, I'm a bit lost there).

I'm feeling lost and confused. Can anybody give me some guidance? There is a USB/TTL bridge on the board that draws 17mA at peak according to its datasheet, and 100uA when suspended. LEDs are off. The only other hardware on the board is some simple reset and charging circuitry.

EDIT: Here is a hex file of a 6mA instance: 6mA.hex

Here is a hex file of a 14mA instance: 14mA.hex

Parents
  • I flashed the 6mA and 14mA hex-files to a clean nRF52832 test board, and the results were 130µA and 7mA respectively. The 130µA seems to be the result of the RTC timer triggering every 1ms, and the idle current between the RTC peak looks fine (~1µA). The 7mA result is most likely caused by the CPU running and never reaching the WFE loop.

    So my conclution is that there must be something else on that Adafruit board that consumes the additional ~6mA. Are you sure the USB brigde is in idle mode?

Reply
  • I flashed the 6mA and 14mA hex-files to a clean nRF52832 test board, and the results were 130µA and 7mA respectively. The 130µA seems to be the result of the RTC timer triggering every 1ms, and the idle current between the RTC peak looks fine (~1µA). The 7mA result is most likely caused by the CPU running and never reaching the WFE loop.

    So my conclution is that there must be something else on that Adafruit board that consumes the additional ~6mA. Are you sure the USB brigde is in idle mode?

Children
Related