Optimizing BLE for Low Power
This page discusses how to optimize Bluetooth Low Energy (BLE) for low power consumption. BLE is a Bluetooth protocol specifically designed for communication on low power devices that need to run for months or years off small batteries. With proper design, active BLE connections can be maintained by a microcontroller (MCU) with approx. 4-20uA of average current when running of 3.3V (the exact current depends on a lot of things, including connections settings and transmission power).
Measuring Current Consumption
First off, you need a way to accurately measure the current consumption of your system. The current consumption is likely to be very “bursty” requiring good time resolution and a high dynamic range due to the brief periods of high consumption (1-20mA) when Bluetooth is running, and long periods of low current consumption when the MCU is otherwise asleep (1-100uA).
My preferred tool is the Nordic Power Profiler Kit (PPK) which is a USB dongle that can either measure in-series current with an external voltage source or also provide the voltage source via an adjustable internal regulator. Shown below is a photo of the hardware:
The current consumption graphs in the rest of this page are screenshots from the Nordic Power Profiler software which accompanies this hardware.
Advertising Interval
When a peripheral device is advertising, it is regularly sending out transmit-only packets. The time between transmissions is called the advertising interval. This is a trade-off between power consumption and the time it takes for a central device to discover (and connect if relevant) to the peripheral.
Connection Interval
The connection interval specifies the amount of time between when the central device and peripheral device both wake up and communicate with each other. The connection interval is a trade-off between latency and power consumption. The below graph shows the current consumption of 94uA for a nRF52 MCU that is connected to a central device with a connection interval of 30ms and a peripheral latency of 0. The average current consumption is 94uA:
Now if we change the connection interval from 30ms to 1000ms we get a significant current consumption to 20.4uA:
Peripheral Latency
The peripheral latency specifies the number of connection intervals that the peripheral device can skip when connected to a central device. This has a similar effect to the connection interval, except with the additional benefit of allowing the peripheral to wake-up more frequently (i.e. respond to more connection intervals) if it has a lot of data to send. The downside is that the central device still needs to poll the peripheral on every connection interval, so is suitable when you don’t care so much about the central devices current consumption.
If we set the connection interval back to 30ms, but change the peripheral latency from 0 to 30 (which would mean the peripheral would skip packets for at most 900ms), the current consumption drops from 94uA (as per above) to 18uA as shown in the below image:
Apple Device Support
Apple recommends some further restrictions on the connection interval and peripheral latencies for support with iOS devices1. Apple’s document, “Accessory Design Guidelines for Apple Devices” can be downloaded from here.
A screenshot of the BLE connection parameters from Apple’s document is shown below:
Silicon Labs provides an Excel spreadsheet which can validate your connection parameters to make sure they are within Apple’s guidelines2. It can be downloaded from here.
Further Reading
See the Bluetooth page if you are interested in learning more about the Bluetooth protocol.
Footnotes
-
Apple (2023, Oct 10). Accessory Design Guidelines for Apple Devices - Release R21. Retrieved 2024-04-30, from https://developer.apple.com/accessories/Accessory-Design-Guidelines.pdf. ↩
-
Silicon Labs. Selecting Suitable Connection Parameters for Apple Devices. Retrieved 2024-05-01, from https://docs.silabs.com/bluetooth/4.0/miscellaneous/mobile/selecting-suitable-connection-parameters-for-apple-devices. ↩