Optimizing Current Consumption in Bluetooth Low Energy Devices#

Introduction#

Current consumption or, more generally, energy usage is a major concern in battery-powered products. Optimizing current consumption extends battery life and, as a result, makes better products. This document discusses how to optimize the current consumption.

Description#

The two main factors affecting current consumption in a Bluetooth Low Energy (BLE) device are the amount of power transmitted and the total amount of time that the radio is active (TX and RX).

The amount of transmit power required depends on the range required between central and peripheral. Range is greatly affected by the environment such as obstacles and the amount of 2.4 GHz traffic present. The first tip is not to transmit more power than required.

The amount of time that a radio is active is determined by how often the radio must transmit or receive and the length of time required to transmit or receive. The first, and probably most obvious, tip is to keep characteristics small. Do not use a 32 bit integer if 8 bits will do.

In general, the power consumption of a BLE device can be adjusted by fine-tuning parameters and configurations related to advertising and connection states.

Advertising#

Advertising Interval#

Advertising interval is adjustable, from 20 ms to 10.24 s (non-connectable: minimum is 100 ms). Increasing advertising interval can significantly decrease the average current consumption of a BLE device. For instance, increasing advertising interval from 100 ms to 1 s drops the average current consumption by 93%.

Advertising Interval vs Current ConsumptionAdvertising Interval vs Current Consumption

Advertising TX Power Level#

The transmit power is adjustable, from -26 dBm to +8 dBm (default is 8 dBm). 0 dBm is enough to cover about 10 to 15 m range, based on tests made with iBeacon example and Android phone. The transmission power can easily be changed in applications using the API call to sl_bt_system_set_tx_power().

Changing the TX power from 8 dBm to 0 dBm can reduce the current consumption by more than 120% using 100 ms advertising interval, and 105% using 1 s advertising interval.

TX power: 0 dBm vs 8 dBmTX power: 0 dBm vs 8 dBm

Furthermore, if the LE Power Control feature is enabled (both on the central and the peripheral), the Bluetooth stack can automatically lower the TX power on connections, when the two devices are close to each other.

Advertising Mode (Connectable / Non-Connectable)#

Non-connectable mode supports only the TX operation, whereas connectable mode of advertising supports both TX and RX operations.

Current Profile: Connectable vs Non-Connectable Advertising ModeCurrent Profile: Connectable vs Non-Connectable Advertising Mode

Average Current Consumption: Connectable vs Non-Connectable Advertising ModeAverage Current Consumption: Connectable vs Non-Connectable Advertising Mode

Deep Sleep Modes#

If deep sleep is enabled (as in most of the examples), the device can enter EM2 mode automatically between advertising events. Deep sleep is only disabled if a peripheral of software component (e.g., UART) disables it. For example, consider switching off debug logs via UART in your final code because UART may disable deep sleep.

EM2 Sleep Mode Current ConsumptionEM2 Sleep Mode Current Consumption

In some cases, going to EM3 and EM4 between advertising may be possible to save energy. This, however, only applies to non-connectable advertisements, and should be solved by the application.

Connection#

Connection Interval#

As with advertising, the connection interval has a direct impact on the current consumption. The connection interval can be adjusted between 7.5 ms and 4 s and is an easy way to trade-off between latency/throughput and average current consumption.

Connection with Empty Packet Transfer (Active Time 1.5 ms), and 15 ms Connection IntervalConnection with Empty Packet Transfer (Active Time 1.5 ms), and 15 ms Connection Interval

The following graph shows the average current required to keep the connection up, with different connection intervals (at 0 dBm TX power). The RF duty cycle is calculated based on the 1.5 ms activity in each interval.

average current required at different connection intervalsaverage current required at different connection intervals

Peripheral Latency#

Peripheral latency ensures that the peripheral device can skip N connection intervals if it does not have anything to transmit. Note, however, that the central device still needs to poll the peripheral at every connection interval. Peripheral latency can be set using sl_bt_connection_set_parameters() API.

Average Current Consumption: Peripheral Latency OFF (Upper Graph) vs Peripheral Latency Value of 5 (Lower Graph)Average Current Consumption: Peripheral Latency OFF (Upper Graph) vs Peripheral Latency Value of 5 (Lower Graph)

With a connection interval of 75 ms, in the above graphs, changing the peripheral latency value to 5 can drop down the average current consumption from 230 µA to 140 µA (40% saving).

Connection TX Power Level#

The same TX power level setting (sl_bt_system_set_tx_power()) applies to advertisements and connections.

TX Power Level SettingsTX Power Level Settings

PHY (1M / 2M Coded PHY)#

Bluetooth 5 introduced 2M PHY for faster throughput and higher energy efficiency. This can lower the average current by reducing the air time of the radio and allowing the MCU to sleep more. The following graph compares the current consumption for a short packet transmission over 1M (left) and 2M (right) PHYs connections with a connection interval of 25 ms, in both cases. Going from 1M to 2M PHY, the energy consumption is reduced by 15%. For larger data transmissions the gain can be even higher.

Current Consumption: 1M (left) vs 2M (right) PHY Current Consumption: 1M (left) vs 2M (right) PHY

Setting up#

This simple example demonstrates the impact of advertising and connection parameters on the power consumption of a BLE device. Follow the instructions below and verify the result by using the Energy Profile perspective in SimplicityStudio.

  1. Create a new SOC - Empty project in SimplicityStudio.

  2. Open app.c file and replace the system_boot event handler with the following code.

    case sl_bt_evt_system_boot_id:
    
    // Set TX power
      sc = sl_bt_system_set_tx_power(0, 80, &pwr_min, &pwr_max)