功耗管理

更新时间:2024-07-30 03:09:46下载pdf

本文介绍蓝牙子设备的功耗管理功能。

功能概述

功耗概念

功率

P = W/t(定义式),单位:瓦特(W),表示做功快慢(消耗电能快慢)的物理量。

P = UI(计算式),所有电路里都可以用该公式计算。

1 度电 = 1kW·h = 1000W·3600s = 360 0000J,即功率为 1kW 的设备工作 1h 消耗的电能。

功耗

功率的损耗,有两种含义:

(1)指整机所需的电源功率,即输入功率,定义为单位时间的耗电量。

(2)功耗 = 输入功率 - 输出功率

蓝牙中常说的低功耗指的是第(1)种含义。

由上述的计算式(P = UI)可知,功耗由电压和电流两个因素决定,但是由于单片机系统中电源电压几乎是恒定的(3.3V),所以低功耗蓝牙中常常会把平均电流的大小当做平均功耗的大小。

影响因素

低功耗蓝牙设备的功耗由很多因素决定,其中常见的因素有以下几种:

  • 广播间隔,20~10240ms(单位:0.625ms)。在其他条件相同的情况下,广播间隔越大,功耗越低。

  • 连接间隔,7.5~4000ms(单位:1.25ms)。在其他条件相同的情况下,连接间隔越大,功耗越低。

  • 发射功率,

    • 蓝牙低功耗 4.0/4.1/4.2:-20dBm~10dBm(0.01mW~10mW)。
    • 蓝牙低功耗 5/5.1:-20dBm~20dBm(0.01mW~100mW)。
    • 在其他条件相同的情况下,发射功率越小,功耗越低。
  • 主频,常见 6MHz,12MHz,16MHz,24MHz,48MHz 和 64MHz。在其他条件相同的情况下,主频越低,功耗越低。

  • 32K 时钟源,在其他条件相同的情况下,外部低频晶振越精确,功耗越低。

  • 电压,一般范围是 1.8V~3.6V。在其他条件相同的情况下,电压越低,功耗越低。

  • 供电模式(DCDC、LDO)。在其他条件相同的情况下,DCDC 供电模式更省电。

  • 广播数据长度,在其他条件相同的情况下,广播数据长度越短,功耗越低。

  • 休眠唤醒时间,在其他条件相同的情况下,休眠唤醒时间越短,功耗越低。

  • 芯片外设,不同芯片的外设多种多样,测量芯片功耗时尽可能排除外设功耗的影响。

除了上述芯片自身的参数外,低功耗蓝牙设备的功耗还可能受到环境因素的影响:

  • 周围主机数量。

    • 蓝牙主机设备(例如手机、网关)经常会处于扫描状态,而蓝牙从机设备(就是常说的低功耗蓝牙设备)会对主机的扫描进行响应,所以在其他条件相同的情况下,周围主机扫描的越频繁,蓝牙设备的功耗越高。
    • 如果对功耗十分敏感,测量功耗的时候可以通过设置广播类型,避免蓝牙设备发出扫描响应包来临时规避这种情况,或者换一个环境来测量功耗。
  • 测量仪器,考虑仪器的基底电流。

注意事项

调试低功耗蓝牙设备时,非常建议将设备接在功耗测试仪器上,实时观察设备的电流状态。功耗测试仪器可以显示设备的瞬时电流和一段时间的平均电流。

通过时域上的电流波形,才能对蓝牙设备的实际功耗有一个形象的认识,如下图所示:

功耗管理

数据结构

TUYA_BLE_BULKDATA_INFO_T

typedef VOID_T (*TUYA_PRE_SLEEP_CB)(VOID_T);

typedef VOID_T (*TUYA_POST_WAKEUP_CB)(VOID_T);

typedef struct {
    TUYA_PRE_SLEEP_CB pre_sleep_cb;
    TUYA_POST_WAKEUP_CB post_wakeup_cb;
} TUYA_SLEEP_CB_T;
  • pre_sleep_cb:进入低功耗前的处理接口。
  • post_wakeup_cb:从低功耗状态唤醒后的处理接口。

TUYA_BLE_BULKDATA_INFO_T

typedef struct {
    BOOL_T    flag;
    UINT8_T mode;
} test_enter_sleep_t;
  • flag:是否进入低功耗模式。0x00:未进入低功耗模式,0x01:已进入低功耗模式。
  • mode:低功耗模式。0x00:进入超低功耗模式(不带广播),0x01:进入低功耗模式(带广播)。

接口说明

注册回调

接口说明

注册休眠唤醒回调处理函数。

OPERATE_RET tal_cpu_sleep_callback_register(TUYA_SLEEP_CB_T *sleep_cb);

参数说明

参数 说明
sleep_cb 休眠唤醒回调接口:
pre_sleep_cb:应用层休眠回调接口,休眠之前执行。
post_wakeup_cb:应用层唤醒回调接口,唤醒之后执行。

数据结构

typedef VOID_T (*TUYA_PRE_SLEEP_CB)(VOID_T);
typedef VOID_T (*TUYA_POST_WAKEUP_CB)(VOID_T);

typedef struct {
    TUYA_PRE_SLEEP_CB pre_sleep_cb;
    TUYA_POST_WAKEUP_CB post_wakeup_cb;
} TUYA_SLEEP_CB_T;

允许休眠

接口说明

允许休眠接口,允许设备在空闲状态时进入休眠。

调用该接口只是允许设备进入低功耗状态,但是如果有外设正在工作,则设备的实际电流并不会如预期降低。一般需要关闭当前正在使用的外设,才能使设备的实际电流降低。

VOID_T tal_cpu_allow_sleep(VOID_T);

强制唤醒

接口说明

强制唤醒接口,不允许设备进入休眠状态。

如果在进入休眠时关闭了相关的外设,需要在唤醒的时候重新初始化相关外设。

VOID_T tal_cpu_force_wakeup(VOID_T);

使用方法

代码开发

注册低功耗处理接口。

STATIC VOID_T tuya_pre_sleep_cb(VOID_T)
{
    // to do
}

STATIC VOID_T tuya_post_wakeup_cb(VOID_T)
{
    // to do
}

STATIC TUYA_SLEEP_CB_T tal_sleep_cb = {
    .pre_sleep_cb = tuya_pre_sleep_cb,
    .post_wakeup_cb = tuya_post_wakeup_cb,
};

OPERATE_RET tuya_init_last(VOID_T)
{
    …………
    
    tal_cpu_sleep_callback_register(&tal_sleep_cb);

    …………
    
    return OPRT_OK;
}

测试低功耗功能相关代码。

typedef struct {
    BOOL_T    flag;
    UINT8_T mode;
} test_enter_sleep_t;

typedef struct {
    test_enter_sleep_t enter_sleep;
} test_param_t;

STATIC test_param_t test_param = {0};

STATIC TIMER_ID sg_test_enter_sleep_timer_id = NULL;

TUYA_WEAK_ATTRIBUTE VOID_T tal_sdk_test_init(VOID_T)
{
    tal_sw_timer_create(tal_sdk_test_enter_sleep_handler, NULL, &sg_test_enter_sleep_timer_id);
    …………
}

TUYA_WEAK_ATTRIBUTE OPERATE_RET test_group_powermanger(UINT8_T cmd, UINT8_T *cmd_data, UINT32_T cmd_data_len, UINT8_T *p_rsp_data)
{
    TEST_GROUP_VARIABLE

    switch (cmd) {
        case TEST_CID_ENTER_SLEEP: {
            test_param.enter_sleep.mode = cmd_data[0];

            ret = tal_sw_timer_start(sg_test_enter_sleep_timer_id, 200, TAL_TIMER_ONCE);

            TEST_RSP
        } break;

        default: {
        } break;
    }

    return idx;
}

功能测试

测试 Case

TEST_CID_ENTER_SLEEP

前置条件

  • 开发板烧录了 TuyaOS BLE SDK 基础例程。
  • 开发板没有外接任何外设。
  • 连接开发板与功耗测试仪器。

操作步骤

通过上位机控制设备进入低功耗。

先复位设备,然后进入低功耗状态(不带广播):

功耗管理

对应的电流:

功耗管理

先复位设备,设置广播间隔:

功耗管理

进入低功耗状态(带广播):

功耗管理

对应的电流:

功耗管理

上位机使用的相关问题,请访问 Logic 上位机使用指南

联系涂鸦

如果开发过程中遇到任何问题,您可以登录 涂鸦开发者论坛的蓝牙板块 进行沟通咨询。

咨询前,建议首先查阅 官方资料 或参考已有帖子,提问前请认真阅读 发帖规范