引言

在物联网设备中,低功耗蓝牙(BLE)是主流的无线通信方案。ESP32-C3凭借其低功耗特性和丰富的外设,成为许多电池供电设备的首选。然而,BLE的功耗并非固定值,而是由广播间隔、连接间隔、从机延迟等参数共同决定。本文通过量化分析,帮助开发者理解这些参数对电池续航的具体影响,并给出优化建议。

1. 功耗模型与关键参数

1.1 功耗组成

ESP32-C3在BLE模式下的功耗主要由三部分组成:

  • 广播功耗:设备处于广播状态时,周期性发送广播包。
  • 连接功耗:设备处于连接状态时,收发数据包。
  • 休眠功耗:设备在空闲时进入睡眠模式,仅维持RTC和内存供电。

1.2 关键参数

  • 广播间隔(adv_interval):两次广播包之间的时间间隔,范围20ms~10.24s。
  • 连接间隔(conn_interval):主从设备之间两个连接事件的时间间隔,范围7.5ms~4s。
  • 从机延迟(slave_latency):从机可以跳过的连接事件次数,范围0~499。
  • 超时时间(supervision_timeout):连接丢失判定时间,范围100ms~32s。

2. 理论功耗计算

2.1 广播功耗

广播功耗与广播间隔成反比。假设广播包发送时间为T_adv(约1.2ms),广播电流I_adv(约30mA),休眠电流I_sleep(约5μA),则平均电流为:

I_avg_adv = (I_adv * T_adv + I_sleep * (T_interval - T_adv)) / T_interval

例如,广播间隔为100ms时:

I_avg = (30mA * 1.2ms + 0.005mA * 98.8ms) / 100ms ≈ 0.36mA

若间隔增加到1s,则平均电流降至约0.036mA,功耗降低90%。

2.2 连接功耗

连接功耗与连接间隔和从机延迟相关。每个连接事件中,设备需要唤醒收发数据,持续时间约为2ms,电流约15mA。平均电流为:

I_avg_conn = (I_conn * T_conn) / (conn_interval * (slave_latency + 1))

假设连接间隔为50ms,从机延迟为0,则:

I_avg = (15mA * 2ms) / 50ms = 0.6mA

若从机延迟设为4,则平均电流降至0.12mA。

3. 实测数据与分析

3.1 测试环境

  • 硬件:ESP32-C3-DevKitM-1
  • 软件:ESP-IDF v5.0,使用BLE API
  • 测量工具:Joulescope功耗分析仪

3.2 广播间隔对功耗的影响

设置广播间隔分别为20ms、100ms、500ms、1s,测量平均电流(设备仅广播,无连接):

| 广播间隔 | 平均电流 | 理论值 | 误差 | |----------|----------|--------|------| | 20ms | 1.82mA | 1.80mA | 1.1% | | 100ms | 0.38mA | 0.36mA | 5.6% | | 500ms | 0.08mA | 0.072mA| 10% | | 1s | 0.04mA | 0.036mA| 11% |

误差主要来自广播包重发和系统唤醒开销。

3.3 连接参数对功耗的影响

建立连接后,固定连接间隔为30ms,改变从机延迟,测量平均电流:

| 从机延迟 | 平均电流 | 理论值 | 误差 | |----------|----------|--------|------| | 0 | 1.02mA | 1.00mA | 2% | | 2 | 0.34mA | 0.33mA | 3% | | 4 | 0.20mA | 0.20mA | 0% | | 9 | 0.11mA | 0.10mA | 10% |

从机延迟增加,功耗显著下降,但数据延迟增加。

4. 参数优化策略

4.1 广播场景优化

  • 非连接广播:若设备仅发送数据,不建立连接,可增大广播间隔至1s以上,并关闭可连接广播(使用ADV_NONCONN_IND类型)。
  • 可连接广播:若需等待连接,建议广播间隔设为100ms~500ms,平衡发现速度和功耗。

4.2 连接场景优化

  • 低功耗优先:增大连接间隔至100ms以上,设置从机延迟为4~10,适用于周期性上报数据的传感器。
  • 低延迟优先:连接间隔设为7.5ms~15ms,从机延迟为0,适用于实时控制场景。

4.3 动态调整

根据应用状态动态调整参数。例如,设备空闲时增大广播间隔,连接后根据数据频率调整连接参数。ESP32-C3支持通过esp_ble_gap_update_conn_params()动态修改连接参数。

5. 完整代码示例

以下代码演示如何设置广播间隔和连接参数:

#include <stdio.h>
#include "esp_log.h"
#include "nvs_flash.h"
#include "esp_bt.h"
#include "esp_gap_ble_api.h"
#include "esp_gatts_api.h"

#define TAG "BLE_DEMO"

static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) {
    switch (event) {
        case ESP_GAP_BLE_ADV_DATA_RAW_SET_COMPLETE_EVT:
            esp_ble_gap_start_advertising(&adv_params);
            break;
        case ESP_GAP_BLE_CONN_UPDATE_COMPLETE_EVT:
            ESP_LOGI(TAG, "Connection update complete");
            break;
        default:
            break;
    }
}

void app_main(void) {
    // 初始化NVS
    esp_err_t ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
        nvs_flash_erase();
        nvs_flash_init();
    }

    // 初始化蓝牙
    esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT);
    esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
    esp_bt_controller_init(&bt_cfg);
    esp_bt_controller_enable(ESP_BT_MODE_BLE);

    esp_bluedroid_init();
    esp_bluedroid_enable();

    // 注册GAP回调
    esp_ble_gap_register_callback(gap_event_handler);

    // 设置广播参数
    esp_ble_adv_params_t adv_params = {
        .adv_int_min = 0x100, // 100ms (0x100 * 0.625ms)
        .adv_int_max = 0x100,
        .adv_type = ADV_TYPE_NONCONN_IND,
        .own_addr_type = BLE_ADDR_TYPE_PUBLIC,
        .channel_map = ADV_CHNL_ALL,
        .tx_power_type = ESP_BLE_PWR_TYPE_DEFAULT,
    };
    esp_ble_gap_set_adv_params(&adv_params);

    // 设置广播数据(省略具体数据)
    uint8_t adv_data[] = {0x02, 0x01, 0x06};
    esp_ble_gap_config_adv_data_raw(adv_data, sizeof(adv_data));

    // 连接后动态调整连接参数
    // 假设连接句柄为conn_handle
    esp_ble_conn_update_params_t conn_params = {
        .conn_int_min = 0x50,  // 50ms
        .conn_int_max = 0x50,
        .latency = 4,          // 从机延迟
        .timeout = 0x320,      // 500ms
    };
    esp_ble_gap_update_conn_params(&conn_params);
}

6. 注意事项

  • 广播间隔单位:广播间隔参数的单位是0.625ms,例如0x100表示100ms。
  • 连接参数协商:从机请求的连接参数可能被主机拒绝,需在回调中处理ESP_GAP_BLE_CONN_UPDATE_COMPLETE_EVT
  • 功耗测量:实际电流受PCB布局、天线匹配、供电电压影响,建议使用功耗分析仪实测。
  • 系统唤醒开销:频繁唤醒会增加额外功耗,因此过短的间隔不一定能提高响应速度,反而可能浪费功耗。

7. 总结

通过量化分析,我们得出以下结论:

  • 广播间隔从20ms增加到1s,功耗降低约97%。
  • 连接间隔和从机延迟是连接功耗的主要决定因素,从机延迟每增加1,功耗约降低30%。
  • 合理配置参数,可在满足应用需求的前提下,将平均电流降至微安级,显著延长电池寿命。

开发者应根据实际场景,权衡响应速度和功耗,必要时采用动态参数调整策略。