优化低功耗蓝牙设备的电流消耗

介绍

电流消耗或更普遍的能源使用是电池供电产品的主要问题。优化电流消耗可延长电池寿命,从而制造出更好的产品。本文档讨论如何优化电流消耗。

描述

影响低功耗蓝牙 (BLE) 设备电流消耗的两个主要因素是传输的功率和无线电处于活动状态的总时间(TX 和 RX)。

所需的发射功率量取决于中央和外围设备之间所需的范围。范围受障碍物等环境和存在的 2.4 GHz 流量的影响很大。第一个技巧是不要传输超过所需的功率。

无线电处于活动状态的时间量取决于无线电必须发送或接收的频率以及发送或接收所需的时间长度。第一个,也可能是最明显的,提示是保持较小的特征。如果 8 位就可以了,请不要使用 32 位整数。

通常,可以通过微调与广告和连接状态相关的参数和配置来调整 BLE 设备的功耗。

广告

广告间隔

广告间隔可调,从 20 毫秒到 10.24 秒(不可连接:最小为 100 毫秒)。增加广告间隔可以显著降低 BLE 设备的平均电流消耗。例如,将广告间隔从 100 ms 增加到 1 s 可降低 93% 的平均电流消耗。

广告间隔与当前消耗

广告 TX 功率级别

发射功率可调,范围为 -26 dBm 至 +8 dBm(默认为 8 dBm)。0 dBm 足以覆盖大约 10 到 15 m 的范围,基于使用 iBeacon 示例和 Android 手机进行的测试。在应用程序中,使用对 的 API 调用可以很容易地更改传输功率。sl_bt_system_set_tx_power()

将 TX 功率从 8 dBm 更改为 0 dBm 可以使用 100 ms 广告间隔降低 120% 以上,使用 1 s 广告间隔可以减少 105% 的电流消耗。

发射功率:0 dBm 与 8 dBm

此外,如果启用了 LE Power Control 功能(在中央和外围设备上),当两个设备彼此靠近时,蓝牙堆栈可以自动降低连接上的 TX 功率。

广告模式(可连接/不可连接)

Non-connectable 模式仅支持 TX 操作,而 connectable 模式的通告同时支持 TX 和 RX 操作。

当前配置文件:可连接与不可连接的广告模式

平均电流消耗:可连接与不可连接广告模式

深度睡眠模式

如果启用了深度睡眠(如大多数示例所示),设备可以在播发事件之间自动进入 EM2 模式。只有当软件组件(例如 UART)的外围设备禁用深度睡眠时,它才会被禁用。例如,考虑在最终代码中通过 UART 关闭调试日志,因为 UART 可能会禁用深度睡眠。

EM2 休眠模式电流消耗

在某些情况下,在广告之间使用 EM3 和 EM4 可能是可以节省能源的。但是,这仅适用于不可连接的广告,应由应用程序解决。

连接

连接间隔

与广告一样,连接间隔对当前消耗有直接影响。连接间隔可以在 7.5 ms 到 4 s 之间调整,这是在延迟/吞吐量和平均电流消耗之间进行权衡的一种简单方法。

使用空数据包传输(活动时间 1.5 毫秒)和 15 毫秒连接间隔的连接

下图显示了保持连接正常运行所需的平均电流,具有不同的连接间隔(TX 功率为 0 dBm)。RF 占空比是根据每个间隔中的 1.5 ms 活动计算的。

不同连接间隔所需的平均电流

外设延迟

外设延迟可确保外围设备在没有要传输的任何内容时可以跳过 N 个连接间隔。但是请注意,中央设备仍然需要在每个连接间隔轮询外围设备。可以使用 API 设置外围设备延迟。sl_bt_connection_set_parameters()

平均电流消耗:外设延迟关闭(上图)与 5 的外设延迟值(下图)

在上图中,连接间隔为 75 毫秒,将外设延迟值更改为 5 可以将平均电流消耗从 230 μA 降至 140 μA(节省 40%)。

连接 TX 功率级别

相同的 TX 功率级别设置 () 适用于通告和连接。sl_bt_system_set_tx_power()

TX 功率电平设置

PHY(1M / 2M 编码 PHY)

蓝牙 5 引入了 2M PHY,以实现更快的吞吐量和更高的能效。这可以通过减少无线电的播出时间并允许 MCU 休眠更多来降低平均电流。下图比较了在两种情况下,在 25 ms 的连接间隔下,通过 1M(左)和 2M(右)PHYs 连接进行短数据包传输的电流消耗。从 1M 到 2M PHY,能耗降低了 15%。对于较大的数据传输,增益可能更高。

电流消耗:1M(左)vs 2M(右)PHY

建立

这个简单的示例演示了广告和连接参数对 BLE 设备功耗的影响。按照以下说明操作,并使用 SimplicityStudio 中的 Energy Profile (能源配置文件) 透视图验证结果。

  1. 在 SimplicityStudio 中创建新项目。SOC - Empty

  2. 打开文件并将事件处理程序替换为以下代码。app.csystem_boot

    <span style="background-color:#f5f2f0"><span style="color:#000000"><code class="language-clike">case sl_bt_evt_system_boot_id<span style="color:#999999">:</span>
    
    <span style="color:#708090">// Set TX power</span>
      sc <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">=</span></span> <span style="color:#dd4a68">sl_bt_system_set_tx_power</span><span style="color:#999999">(</span><span style="color:#990055">0</span><span style="color:#999999">,</span> <span style="color:#990055">80</span><span style="color:#999999">,</span> <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">&</span></span>pwr_min<span style="color:#999999">,</span> <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">&</span></span>pwr_max<span style="color:#999999">)</span><span style="color:#999999">;</span>
      <span style="color:#dd4a68">app_assert_status</span><span style="color:#999999">(</span>sc<span style="color:#999999">)</span><span style="color:#999999">;</span>
      <span style="color:#708090">// Extract unique ID from BT Address.</span>
      sc <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">=</span></span> <span style="color:#dd4a68">sl_bt_system_get_identity_address</span><span style="color:#999999">(</span><span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">&</span></span>address<span style="color:#999999">,</span> <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">&</span></span>address_type<span style="color:#999999">)</span><span style="color:#999999">;</span>
      <span style="color:#dd4a68">app_assert_status</span><span style="color:#999999">(</span>sc<span style="color:#999999">)</span><span style="color:#999999">;</span>
    
      <span style="color:#708090">// Create an advertising set.</span>
      sc <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">=</span></span> <span style="color:#dd4a68">sl_bt_advertiser_create_set</span><span style="color:#999999">(</span><span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">&</span></span>advertising_set_handle<span style="color:#999999">)</span><span style="color:#999999">;</span>
      <span style="color:#dd4a68">app_assert_status</span><span style="color:#999999">(</span>sc<span style="color:#999999">)</span><span style="color:#999999">;</span>
    
      <span style="color:#708090">// Set advertising interval to 100ms.</span>
      sc <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">=</span></span> <span style="color:#dd4a68">sl_bt_advertiser_set_timing</span><span style="color:#999999">(</span>
        advertising_set_handle<span style="color:#999999">,</span>
        <span style="color:#990055">160</span><span style="color:#999999">,</span> <span style="color:#708090">// min. adv. interval (milliseconds * 1.6)</span>
        <span style="color:#990055">160</span><span style="color:#999999">,</span> <span style="color:#708090">// max. adv. interval (milliseconds * 1.6)</span>
        <span style="color:#990055">0</span><span style="color:#999999">,</span>   <span style="color:#708090">// adv. duration</span>
        <span style="color:#990055">0</span><span style="color:#999999">)</span><span style="color:#999999">;</span>  <span style="color:#708090">// max. num. adv. events</span>
      <span style="color:#dd4a68">app_assert_status</span><span style="color:#999999">(</span>sc<span style="color:#999999">)</span><span style="color:#999999">;</span>
      <span style="color:#708090">// Start general advertising and enable connections.</span>
      sc <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">=</span></span> <span style="color:#dd4a68">sl_bt_advertiser_start</span><span style="color:#999999">(</span>
        advertising_set_handle<span style="color:#999999">,</span>
        advertiser_general_discoverable<span style="color:#999999">,</span>
        advertiser_connectable_scannable<span style="color:#999999">)</span><span style="color:#999999">;</span>
      <span style="color:#dd4a68">app_assert_status</span><span style="color:#999999">(</span>sc<span style="color:#999999">)</span><span style="color:#999999">;</span>
      <span style="color:#0077aa">break</span><span style="color:#999999">;</span></code></span></span>
  3. 同样,将事件处理程序替换为下面的代码。le_connection_opened

    <span style="background-color:#f5f2f0"><span style="color:#000000"><code class="language-clike">case sl_bt_evt_connection_opened_id<span style="color:#999999">:</span>
        <span style="color:#dd4a68">app_log_info</span><span style="color:#999999">(</span><span style="color:#669900">"connection opened\r\n"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
        <span style="color:#708090">/* go for a longer connection interval
         * latency = 0, timeout = 32000 ms
         *
         * timeout > (1+latency)*2*max_interval ms
         *  therefore, max latency <= [timeout/(2*max_interval)] - 1
         *
         *  should be possible to use latency = 15
         *
         * */</span>
    
        <span style="color:#708090">//sl_bt_connection_set_parameters(evt->data.evt_connection_opened.connection, 700,760,1,600,0,0xffff);</span>
    <span style="color:#0077aa">break</span><span style="color:#999999">;</span></code></span></span>
  4. 通过在注释下添加以下代码来创建事件处理程序le_connection_parameters/* Add additional event handlers as your application requires */

    <span style="background-color:#f5f2f0"><span style="color:#000000"><code class="language-clike">case sl_bt_evt_connection_parameters_id <span style="color:#999999">:</span> <span style="color:#999999">{</span>
        uint16_t interval <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">=</span></span> evt<span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">-</span></span><span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">></span></span>data<span style="color:#999999">.</span>evt_connection_parameters<span style="color:#999999">.</span>interval<span style="color:#999999">,</span> latency <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">=</span></span> evt<span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">-</span></span><span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">></span></span>data<span style="color:#999999">.</span>evt_connection_parameters<span style="color:#999999">.</span>latency<span style="color:#999999">,</span> timeout <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">=</span></span> evt<span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">-</span></span><span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">></span></span>data<span style="color:#999999">.</span>evt_connection_parameters<span style="color:#999999">.</span>timeout<span style="color:#999999">;</span>
        <span style="color:#dd4a68">app_log_info</span><span style="color:#999999">(</span><span style="color:#669900">"connection interval %d, latency %d, timeout %d ms\n"</span><span style="color:#999999">,</span> interval<span style="color:#999999">,</span> latency<span style="color:#999999">,</span> timeout <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">*</span></span> <span style="color:#990055">10</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
      <span style="color:#999999">}</span>
    <span style="color:#0077aa">break</span><span style="color:#999999">;</span></code></span></span>
  5. 蓝牙规范允许广告间隔在 20 毫秒到 10.24 秒之间。在此配置中,应用程序对 BGM121 上的广播间隔 (100 ms) 和 +8 dBm 使用默认设置。此配置导致平均电流为 419 μA。

    以 +8 dBm 和 100 ms 间隔进行电流消耗通告

  6. 通过将 in 更改为 in ,将发射功率设置为 0 dBm。重新生成并再次下载以查看当前消耗。sl_bt_system_set_tx_power(0, 80, &pwr_min, &pwr_max);sl_bt_system_set_tx_power(0, 0, &pwr_min, &pwr_max);;app.c

    以 0 dBm 和 100 ms 为间隔的电流消耗通告

    通过将发射功率降低到 0 dBm,同时保持相同的 100 ms 广告间隔,平均电流降低到 190 μA。

  7. 通过更改将广告间隔增加到 1000 毫秒 ;到 中。然后,重新构建并再次下载以查看当前消耗。sl_bt_advertiser_set_timing(advertising_set_handle, 160, 160, 0, 0);sl_bt_advertiser_set_timing(advertising_set_handle, 1600, 1600, 0, 0);app.c

    以 0 dBm 和 1000 ms 为间隔的电流消耗通告

    通过将广告间隔增加到 1000 ms,平均电流降低到 21.5 μA。

  8. 使用 Silicon Labs EFR Connect 应用程序连接到设备并检查功耗。控制台将显示一条消息,指示正在使用的实际连接参数。

    使用 iPhone 的默认连接参数的电流消耗

    上图显示了设备与 iOS 手机连接时的功耗。使用 Android 设备会产生略低的结果,因为 Android 的默认连接间隔比 iOS 使用的连接间隔长。

  9. 影响平均电流消耗的另一个因素是连接间隔。较短的连接间隔会带来更高的吞吐量,但也会产生能源成本,而较长的连接间隔会限制数据吞吐量,但也可以节省能源。iOS 和 Android 目前使用的默认连接间隔分别为 30 毫秒和 50 毫秒。如下所示,在 0 dBm 和 30 ms 连接间隔时的平均电流约为 228 μA。

    通过取消注释该行,将连接间隔更改为 875 - 950 毫秒之间。重新构建并下载并再次连接移动应用程序。控制台应显示正在使用的新连接参数。//sl_bt_connection_set_parameters(evt->data.evt_connection_opened.connection, 700,760,1,600,0,0xffff);

    950 ms 连接间隔的电流消耗

    通过使用更长的连接间隔 (950 ms),平均电流约为 25 μA。

  10. 通过更改代码将 peripheral latency 更改为 5,如下所示:

    <span style="background-color:#f5f2f0"><span style="color:#000000"><code class="language-clike"><span style="color:#dd4a68">sl_bt_connection_set_parameters</span><span style="color:#999999">(</span>evt<span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">-</span></span><span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">></span></span>data<span style="color:#999999">.</span>evt_le_connection_opened<span style="color:#999999">.</span>connection<span style="color:#999999">,</span> <span style="color:#990055">700</span><span style="color:#999999">,</span><span style="color:#990055">760</span><span style="color:#999999">,</span><span style="color:#990055">1</span><span style="color:#999999">,</span><span style="color:#990055">600</span><span style="color:#999999">,</span><span style="color:#990055">0</span><span style="color:#999999">,</span><span style="color:#990055">0xffff</span><span style="color:#999999">)</span><span style="color:#999999">;</span></code></span></span>

    <span style="background-color:#f5f2f0"><span style="color:#000000"><code class="language-clike"><span style="color:#dd4a68">sl_bt_connection_set_parameters</span><span style="color:#999999">(</span>evt<span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">-</span></span><span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">></span></span>data<span style="color:#999999">.</span>evt_le_connection_opened<span style="color:#999999">.</span>connection<span style="color:#999999">,</span> <span style="color:#990055">700</span><span style="color:#999999">,</span><span style="color:#990055">760</span><span style="color:#999999">,</span><span style="color:#990055">5</span><span style="color:#999999">,</span><span style="color:#990055">3200</span><span style="color:#999999">,</span><span style="color:#990055">0</span><span style="color:#999999">,</span><span style="color:#990055">0xffff</span><span style="color:#999999">)</span><span style="color:#999999">;</span><span style="color:#999999">;</span></code></span></span>

重新构建并再次下载应用程序,并与移动应用程序连接。

连接间隔为 950 毫秒且延迟为 5 的电流消耗

通过将外设延迟(即外设在没有要发送的数据时可以跳过的间隔数)增加到 5,平均电流降至 10 μA 以下。

请仔细选择连接参数,以便可以多次重试以确保连接稳定。监督超时必须大于 。因此,如果选择最大连接间隔为 950 毫秒,并将超时设置为最大值 32 秒,则允许的最大延迟为 15。但是,这将导致连接不稳定,因此此示例中的延迟设置为 5 以允许 2 次重试。(1+latency)*2*max_connection_interval

结论

电流消耗和数据吞吐量/延迟之间始终存在权衡。选择连接间隔时,必须考虑应用程序对电池寿命和吞吐量的需求。较长的连接间隔有助于延长电池寿命,但会降低吞吐量,并且除非仔细选择连接参数,否则可能会导致连接不可靠或不稳定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值