Current consumption or, more generally, energy usage is a major concern in battery powered products. Optimizing current consumption extends battery life and so makes better products. This article discusses how to optimize the current consumption.
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 transmit power required depends on the range required between master and slave. Range will be greatly affected by the environment such as obstacles and the amount of 2.4 GHz traffic present. The first tip is to not 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. Don’t use a 32 bit integer if 8 bits will do. The next place to look is the advertising interval. The Bluetooth specification allows the advertising interval to be anywhere between 20 ms and 10.24 s. Using the default settings for advertising, 100 ms interval and +8 dBm on a BGM121, as shown below results in an average current of 419 uA
Figure 1. Current consumption advertising at +8 dBm and 100 ms intervals
By reducing the transmit power to 0 dBm while keeping the same 100 ms advertising interval, the average current is reduced to 190 uA
Figure 2. Current consumption advertising at 0 dBm and 100 ms intervals
By increasing the advertising interval to 1000 ms, the average current is reduced to 21.5 uA
Figure 3. Current consumption advertising at 0 dBm and 1000 ms intervals
Another factor affecting average current consumption is the connection interval used. A short connection interval results in the ability to have higher throughput but also incurs an energy cost while a longer connection interval limits data throughput but also provides energy savings. The default connection intervals used by iOS and Android are currently 30 ms and 50 ms respectively. As shown below, the average current at 0 dBm and a 30 ms connection interval is approximately 228 uA
Figure 4. Current consumption using default connection parameters with an iPhone
By using a longer connection interval, 950 ms, the average current is to approximately 25 uA.
Figure 5. Current consumption with 950 ms connection interval
By increasing the slave latency, the number of intervals the slave can skip when it has no data to send, to 5 the average current drops below 10 uA.
Figure 6. Current consumption with 950 ms connection interval and latency of 5
Care should be taken when selecting connection parameters so that several retries are possible to ensure stable connections. The timeout must be greater (1+latency)*2*max_connection_interval. So if the maximum connection interval is chosen to be 950 ms and the timeout is set to the maximum, 32 seconds then the maximum latency allowed is 15. However, this will result in an unstable connection, so the latency in this example is set to 5 to allow for 2 retries.
The attached example project can be used to reproduce the results shown in this article.
Figure 7. Launching the console
Select the Serial1 tab, place your cursor in the text field at the bottom and press enter to wake-up the console. The console will display the message “Low power test started” after a reset.
Then rebuild and download again to see current consumption similar to figure 2.
gecko_cmd_le_gap_set_adv_parameters(160, 160, 7);
gecko_cmd_le_gap_set_adv_parameters(1600, 1600, 7);
Then rebuild and download once more to see current consumption as in figure 3.
The console will display a message indicating the actual connection parameters being used.
The console shows the new connection parameters in use.
Rebuild and download the application once more and connect with the mobile app to see figure 6.
There is always a tradeoff between current consumption and data throughput. The application needs for battery life and throughput must be considered when choosing a connection interval. A longer connection interval will help improve battery life but will reduce throughput and may result in an unreliable or unstable connection unless the connection parameters are chosen carefully.
I am trying to run this example, but I am getting an error: aat.h: no such file or directory. Can you please tell me where this file is and how to include it?
The sample project has been written with some older version of the BLE SDK. The file aat.h is no longer used in the latest SDK (2.7.0).
Instead of trying to open that sample project directly (the zip file in the article), I suggest you just create a new soc-empty project using the SDK that you have. Then copy the code from the example main.c to your own main.c. (what you need to copy is the while(1) loop that comes after gecko_init())