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

nRF52840 Power consumption issue

Hi All, 

I am developing one device using nRF52840 based on Zigbee protocol. 

Currently I am using nRF52840 Dev-kit and nRF5_SDK_for_Thread_and_Zigbee_v4.1.0_32ce5f8. 

I am working on power management part of the device. As per my study and Nordic instruction we have configured device as SED (Sleepy End Device).  

We followed the user guide to test the current but I am getting ~1mA current which too high. Setup tested using multi meter as well as power profile kit. (Current remains ~1mA)

I have started development using SDK 3.0 for Zigbee and Thread and here we got current ~1mA but then came to know that in SDK 4.1 for Zigbee and Thread SED is handled better way so we up graded our functions to SDK 4.1 but here also we got same result current = ~1mA.

Please find my attached document which explains the my device and current testing setup. 

In my end we are using following peripherals GPIO, UART, Timer, Internal Flash. 

Required current is 30uA. My end device would be using 2 AA cells to power and battery life should last for 2 years. So depending on this we need almost ~30uA current. 

1715.nRF52840 setup and comments.docx

- Attached code is developed using SDK 4.1 for Zigbee and Thread.

Radiator_nRF_v0.9.7.zip

- Power profile kit image while measuring current. we can see that we have peak current of around 40mA and the average seems to be the same as ~1mA.

Let me know how to reduce the power and get required current for my device.

Thanks and Regards

Rohit R

  • Hi,

    Most likely, the increased current is caused by the UART peripheral and EasyDMA. Try disabling the UART peripheral, to see if you get lowered current consumption.

    Best regards,
    Jørgen

  • Hi Jørgen, 

    Thank you so much for the response, 

    As you suggested, I have removed the UART from code and I can see that current  ~33uA. 

    But Here, I need UART this is main part of set up means my Radiator and nRF communicate with each other using UART. 

    So, What I tried is when I am sending commands to Radiator (State machine as you can see in code) in Ready State Initialized the UART (uart_init()) function and started 3sec timer after init then once 3sec is over I used app_uart_close() functions to disable. But It didn't worked as expected means it gave me current again 1mA and also after 2/3 commands it always got stuck into one of SDK uart related files. 

    My commands exchange happens when I write on Zigbee attributes and GPIO interrupt so if you have any suggestion regarding disabling after command exchange would help me here. 

    As if it should do the communication in both case disable before going to sleep in SED behave. 

    Let me know your suggestion.

    Thanks and Regards

    Rohit R

  • Hi Jørgen, 

    Thank you so much for the response, 

    As you suggested, I have removed the UART from code and I can see that current  ~33uA. 

    But Here, I need UART this is main part of set up means my Radiator and nRF communicate with each other using UART. 

    So, What I tried is when I am sending commands to Radiator (State machine as you can see in code) in Ready State Initialized the UART (uart_init()) function and started 3sec timer after init then once 3sec is over I used app_uart_close() functions to disable. But It didn't worked as expected means it gave me current again 1mA and also after 2/3 commands it always got stuck into one of SDK uart related files. 

    My commands exchange happens when I write on Zigbee attributes and GPIO interrupt so if you have any suggestion regarding disabling after command exchange would help me here. 

    As if it should do the communication in both case disable before going to sleep in SED behave. 

    Let me know your suggestion.

    Hi, 

    Update from my end. 

    I tried one more method to close UART. 

    What I did is after my command exchange got over I tried to close the UART (using app_uart_close() function). After closing UART I am not able to execute next command. When I pause the code, it halted into nrf_uarte.h file below line. 

    Please find the attached code snippet. Can you please let me know why it not getting enable (uart_init) again. 

    Steps I followed to execute uart_init() and uart_close ()

    1. When command exchange start initialize the UART by uart_init() function from my code for reference.

    2. Once the command exchange done, close the UART using app_uart_close() function. 

    Thanks and Regards

    Rohit R

  • Hi, 

    Please I need urgent help here, why code is not getting initialized again and why it getting stuck at this part(in snippet)?. 

    Let me know your feedback as early as possible. 

    It is getting stuck in below loop. Please find the attached snippet because of this I am not able to discover the device in Zigbee. My next task are not executing. 

    If I comment app_uart_close() function then everything works perfectly. But to get current less as yesterday I need to power down the UART. 

    I have referred Nordic forum but I didn't get any solution. 

    Urgent !

    Thanks and Regards

    Rohit R

  • Hi,

    I'm not able to see the code snippet. Can you post the full project again, so I can see exactly where you init/close app_uart? Are you checking every return code to make sure app_uart is initialized/closed correctly for every call? It looks like the driver cannot receive the expected event, which could indivate that it is not in the correct state.

    There are some changes in the nrfx UARTE driver for later SDK version (SDK 17.0.x), which is not available in the Thread and Zigbee SDK. You may try to replace this driver only from nrfx tag version 1.8.6.

    Best regards,
    Jørgen

Related