Reducing power consumption for ble mesh sensor server node using LPN mode

Hi, 

I am using nrf mesh sdk v5.0.0 and am using sensor server model example to build our own application on top of it. SOC we are using is  nRF52832.  I have enabled the LPN mode in the example and I am also able to establish friendship with a nearby friend node. And am also receiving messages intended to the LPN node when the LPN node polls its friend node. The purpose for LPN node is to reduce battery consumption by disabling the scanner. But the device is consuming a solid 5 - 8 mA after establishing friendship. Is it possible to reduce the battery consumption in the micro amperes range. Any guidance on how to achieve it would be really great. I am also interfacing an LED, I2C sensor and a switch with the SOC. Before and after establishing friendship, I am seeing same amount of current being consumed. 

Parents
  • Hi Hariharan, 

    Could you describe how did you do the test ? How did you do provisioning ? 


    Have you tested with the LPN example with no modification ? In the example the power consumption should drop down to few uA after it provisioned and get a friendship. 

    Which current do you see exactly after you establish friendship ? Have you verified that the CPU was not being kept awake by other modules ? 

  • I am provisioning the sensor node using an ESP32(acting as a provisioner). Once the provisioning and model configuration is done, I am initiating the friendship establishment procedure. The current consumption goes as low as 150ua after establishing friendship. But it increases to 3ma after publishing data once. And it should return to low power consumption mode right? But its not. The sensor node is constantly consuming 3ma after publishing. I dont know why this is happening. Can you please guide me?

  • Yes, I have found the reason why it was giving me NRF_ERROR_NO_MEM error code. Sensor model example had 4 models in an element and low power had only three. Modified it in the nrf_mesh_config_app.h and the issue was resolved.

    Seems to be there an issue with the board. I will report this issue to my hardware team. I ran the unmodified lpn example in our board and got the same 150ua. The reason for 150ua is that am powering the board through a 5v to 3v3 regulator which consumes half of that current. So, the soc actually consumes only 60-70ua. 

    Is reading I2C data and ADC data inside sensor model's periodic callback to publish data a wrong idea? Because that seems to make the CPU consume higher current around 3ma.

  • Hi Hariharan, 
    If you have any activity that take longer time you should put it into thread context (main context). 
    Also , after the activity is finished (reading ADC for example) the CPU should go to sleep and you should see the current consumption goes down. If you don't see that there must be something wrong and the CPU was stuck. 

    I would suggest to use DCDC instead of LDO converter to save more current consumption. But still at 60-70uA it's high current consumption. You may want to try testing some very simple application that only put the CPU to sleep (try the RTC example) and check if you can achieve a few uA current consumption. This is to verify that your board doesn't have any fault. 

  • After reading once using I2C and SAADC, the current consumption is not going down. CPU is not going back to sleep but the application is running smoothly as expected with only current consumption being a big concern for us. 

    I have created a separate tickets for I2C and SAADC separately, wherein I would have attached the code routines I use for initializing, deinitializing and reading data from the desired peripheral. 

    I tried reading ADC voltage and data from I2C sensor in thread context but didnt see the current consumption dropping back to 70ua after the peripherals are deinitialized. As of now, 70ua is sufficiently low current for us. Please refer to the tickets I have attached below for the code routines and kindly let me know your thoughts. 

    And yes, I have enabled DCDC in both sdk_config.h, and in the code too using the below function. 

        ERROR_CHECK(sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE));


    SAADC - https://devzone.nordicsemi.com/f/nordic-q-a/95473/nrf52832-constantly-consuming-higher-current-of-3-4ma-after-reading-adc-value-using-using-saadc-in-blocking-mode

    I2C - https://devzone.nordicsemi.com/f/nordic-q-a/95472/nrf52832-staying-in-400ua-current-consumption-after-single-write-and-read-from-i2c

  • Hi Hariharan, 
    I would suggest to continue on the other cases. It's important that you narrow down the issue to see where the current is from. Please try to test the code without mesh and see if you can achieve lower current. So that we know if it has anything to do with mesh or not. And to know which exact peripheral causing the problem. 

  • Hi hung,

    I was able to reduce the current consumption to upto 20ua. The current consumption was due to some known errata. Once the workaround is implemented, it was resolved. Thank you so much for your time and quick responses. Appreciate it much!

Reply Children
Related