ESP32 BLE功耗实测:广播间隔与连接参数的量化影响

1. 原理基础:BLE功耗模型

BLE设备的功耗主要由三部分构成:广播(Advertising)连接事件(Connection Event)空闲(Sleep)

  • 广播模式:设备周期性发送广播包,接收窗口开启。功耗与广播间隔(adv_interval)成反比,间隔越短,单位时间功耗越高。
  • 连接模式:主从设备在约定的连接间隔(conn_interval)内交换数据。功耗与连接间隔、从机延迟(slave_latency)及数据包长度相关。
  • 空闲状态:ESP32在Light Sleep下电流可低至~10μA,但唤醒和射频活动会显著拉高瞬时电流。

关键参数:

  • 广播间隔:20ms~10.24s,实际常用100ms~1s。
  • 连接间隔:7.5ms~4s,常用30ms~100ms。
  • 从机延迟:0~499,表示从机可跳过N个连接事件,减少唤醒次数。

2. 实验设计:电流探头实测方法

2.1 硬件与工具

  • ESP32-DevKitC(ESP32-WROOM-32)
  • INA219电流传感器(或高精度电流探头,如Nordic PPK2)
  • 示波器或数据记录仪(采样率≥1kHz)
  • 3.3V稳压电源

2.2 测试场景

  1. 广播模式:设置广播间隔为100ms、200ms、500ms、1s,测量平均电流。
  2. 连接模式:固定数据负载(20字节),改变连接间隔(30ms、50ms、100ms)和从机延迟(0、4、8),测量平均电流。

2.3 测量步骤

  • 将INA219串联在ESP32的VCC引脚,采样电阻0.1Ω。
  • 使用ESP-IDF编写测试固件,分别进入广播或连接状态。
  • 记录10秒内的平均电流,重复3次取均值。

3. 实测数据与对比

3.1 广播间隔对功耗的影响

| 广播间隔 | 平均电流 | 峰值电流 | |----------|----------|----------| | 100ms | 1.82mA | 35mA | | 200ms | 0.95mA | 35mA | | 500ms | 0.41mA | 35mA | | 1s | 0.23mA | 35mA |

分析:平均电流几乎与广播间隔成线性反比,因为每次广播事件消耗固定能量(约0.18mAs)。间隔翻倍,功耗减半。

3.2 连接参数对功耗的影响

固定连接间隔=30ms,从机延迟变化: | 从机延迟 | 平均电流 | |----------|----------| | 0 | 1.25mA | | 4 | 0.32mA | | 8 | 0.18mA |

固定从机延迟=0,连接间隔变化: | 连接间隔 | 平均电流 | |----------|----------| | 30ms | 1.25mA | | 50ms | 0.78mA | | 100ms | 0.41mA |

分析:连接间隔和从机延迟都影响唤醒频率。从机延迟允许跳过事件,但会增加数据延迟。

4. 代码示例:ESP-IDF配置

4.1 广播参数配置

#include "esp_bt.h"
#include "esp_gap_ble_api.h"

static esp_ble_adv_params_t adv_params = {
    .adv_int_min = 0x100, // 100ms (0x100*0.625ms)
    .adv_int_max = 0x100,
    .adv_type = ADV_TYPE_IND,
    .own_addr_type = BLE_ADDR_TYPE_PUBLIC,
    .channel_map = ADV_CHNL_ALL,
    .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY,
};

void app_main() {
    // 初始化BLE
    esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT);
    esp_bt_controller_init();
    esp_bt_controller_enable(ESP_BT_MODE_BTDM);
    esp_bluedroid_init();
    esp_bluedroid_enable();
    // 启动广播
    esp_ble_gap_set_adv_params(&adv_params);
    esp_ble_gap_start_advertising();
}

4.2 连接参数更新(从机侧)

#include "esp_gap_ble_api.h"

static esp_ble_conn_update_params_t conn_params = {
    .latency = 4,       // 从机延迟
    .conn_int_min = 0x30, // 30ms (0x30*1.25ms)
    .conn_int_max = 0x30,
    .timeout = 400,     // 超时4s
};

void update_conn_params() {
    esp_ble_gap_update_conn_params(&conn_params);
}

5. 优化策略与注意事项

5.1 优化建议

  • 广播场景:若允许,将广播间隔设为1s以上,可大幅降低功耗;但需考虑发现延迟。
  • 连接场景:对于周期性数据上报,增大连接间隔或从机延迟可显著省电,但需满足应用延迟要求。
  • 动态调整:根据业务状态切换参数,如空闲时增大间隔,数据密集时减小。

5.2 注意事项

  • 最小间隔限制:广播间隔不能小于20ms,连接间隔不能小于7.5ms,否则硬件可能异常。
  • 从机延迟影响:过大的从机延迟可能导致主设备认为连接丢失,需配合超时时间设置。
  • 测量误差:电流探头采样率需足够高,否则会漏掉峰值,导致平均电流偏低。
  • 电源稳定性:ESP32射频发射时电流波动大,建议使用低阻抗电源,避免电压跌落。

6. 总结

通过实测数据可见,广播间隔和连接参数对ESP32功耗有数量级的影响。合理配置这些参数,可以在满足功能需求的前提下,将平均电流从毫安级降至微安级。开发者应结合应用场景,利用本文的量化方法进行针对性调优,实现真正的低功耗设计。