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

Power Optimization for Softdevice BLE+ Sensor Processing

Hi,

We are developing an IoT sensor application using nRF52832 dev kit as a starting point. We have a sensor that we need to read once every second for 10 milliseconds (using PPI) and then transmit its data via BLE client to a PC using a second nRF52 DK as a master. We need to run the client with a coin cell battery for few months. We are using SDK UART example as a basis for the starting code on the client. 

I figured how to decrease the startup current by putting the system in sleep mode before BLE connection is made and any sensor processing starts. I also figured how to use idle_state_handle to minimize power after BLE connection is made but before sensor data transmission starts. 

However, it seems after we start reading the sensor, even when I use the idle_state_hanlde between sensor reads, the system still runs at around 3mA which is high for our intended application and limits battery lifetime.

I would like to know how to further decrease the power. I would also like to know how to use a timer to time the 1 second interval without using the CPU all the time as the CPU is consuming most of the power. 

I would like to know if there is an example that I can look at as a starting point that may be more relevant than the UART example I am currently using. Also, if 1 seconds is too fast and I should go to once every 10 seconds or 1 seconds, I can do that although doesn't seem to decrease the current consumption with the UART example. 

Thank you so much.

Parents
  • Hi,

    However, it seems after we start reading the sensor, even when I use the idle_state_hanlde between sensor reads, the system still runs at around 3mA which is high for our intended application and limits battery lifetime.

    I do not know enough about your application to say what causes the power consumption between the sensor reads. What resources do you use at this point? Have you tried to comment out / disable to narrow down what contributes the most?

    I would like to know how to further decrease the power. I would also like to know how to use a timer to time the 1 second interval without using the CPU all the time as the CPU is consuming most of the power. 

    Generally, you should disable all HW peripherals (particularly those that rely on the HF clock), and sleep as much of the time as possible. In practice that means using the app_timer to wake up regularly, as this uses a low power RTC that runs of the 32.768 kHz clock. Then, you should make srue to call sd_app_evt_wait() in your main loop, either directly or like most SDK examples do, via nrf_pwr_mgmt_run().

     Have you disabled UART? If not, that would explain a significant part of the current consumption as keeping the UART peripheral active increases the current consumption significantly. You should also enable the DC/DC if you have the required inductors in your custom HW, by calling sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE).

    Most SDK examples can be made low power by the above adjustments.

Reply
  • Hi,

    However, it seems after we start reading the sensor, even when I use the idle_state_hanlde between sensor reads, the system still runs at around 3mA which is high for our intended application and limits battery lifetime.

    I do not know enough about your application to say what causes the power consumption between the sensor reads. What resources do you use at this point? Have you tried to comment out / disable to narrow down what contributes the most?

    I would like to know how to further decrease the power. I would also like to know how to use a timer to time the 1 second interval without using the CPU all the time as the CPU is consuming most of the power. 

    Generally, you should disable all HW peripherals (particularly those that rely on the HF clock), and sleep as much of the time as possible. In practice that means using the app_timer to wake up regularly, as this uses a low power RTC that runs of the 32.768 kHz clock. Then, you should make srue to call sd_app_evt_wait() in your main loop, either directly or like most SDK examples do, via nrf_pwr_mgmt_run().

     Have you disabled UART? If not, that would explain a significant part of the current consumption as keeping the UART peripheral active increases the current consumption significantly. You should also enable the DC/DC if you have the required inductors in your custom HW, by calling sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE).

    Most SDK examples can be made low power by the above adjustments.

Children
No Data
Related