Nordic nRF5 SDK 学习笔记之七, 功耗评估及电源优化

NORDIC 官方评估功耗在线测试

NORDIC Online Power Profiler,https://devzone.nordicsemi.com/power/


NORDIC 关于低功耗的官方博客

https://devzone.nordicsemi.com/tutorials/b/hardware-and-layout/posts/nrf51-current-consumption-guide


功耗优化技巧

1. 使能电源 DC/DC 转换, 可大幅降低功耗; 于 sdk_config.h 中设置;

于main.c 中,初始化 softDeivce 协议栈前, 执行 NRF_POWER->DCDCEN = 1;

或者,在 softDeivce 协议栈初始化后, 执行 sd_power_dcdc_mode_set(1);


2. 使用外部 32KHz 晶振; 于 sdk_config.h 中设置;

于  nrf_sdh.c 文件中,修改 nrf_clock_lf_cfg_t 设置; 如下所示:

nrf_clock_lf_cfg_t const clock_lf_cfg =
{
    .source       = NRF_CLOCK_LF_SRC_XTAL,           //脉冲时钟源为外部晶振 32.768KHz
    .rc_ctiv      = NRF_SDH_CLOCK_LF_RC_CTIV,        //校准时间间隔:使用外部晶振源设置为0
    .rc_temp_ctiv = NRF_SDH_CLOCK_LF_RC_TEMP_CTIV,   //振荡器校准频率,使用外部晶振源设置为0
    .accuracy     = NRF_SDH_CLOCK_LF_ACCURACY        
                                            //外部时钟精度设置为 RF_CLOCK_LF_ACCURACY_20_PPM
    };

3. 去除 log 功能; 于 sdk_config.h 中, log 配置均不启用,其值均为 0; 主函数中 log_init() 同样去除;

4. SPI,TWI,UART 外设有较高的功耗,并它们不用时,最好注销复位以降低功耗;

5. 使用定时器而不是软件延迟, 因软件延迟循环将保持CPU的运行能力而消耗额外的能量;

6. 仅对需要保留的内存使用 RAM_RETENTION,以尽可能节省功耗;


7. 蓝牙 BLE 广播对功耗影响;

    7.1 广播间隔越大, 功耗越低;

          (广播间隔改大之后,相应地会影响BLE设备的连接速度) (init.config.ble_adv_fast_interval =APP_ADV_INTERVAL;)

    7.2 广播持续时间越长,功耗越大; (init.config.ble_adv_fast_timeout = APP_ADV_DURATION;)

    7.3 蓝牙发射功率越高,功耗越大;  (init.advdata.p_tx_power_level  = &bt_tx_power_level;)

void advertising_init(void)
{
    uint32_t               		err_code;
    ble_advertising_init_t 		init;
    ble_advdata_manuf_data_t 	adv_manuf_data;
    uint8_array_t            	adv_manuf_data_array;
    uint8_t                  	adv_manuf_data_data[1];
    adv_manuf_data_data[0] 		= 0x33;
    int8_t	bt_tx_power_level	= 8;					
	
    memset(&init, 0, sizeof(init));

    init.advdata.name_type          	=	BLE_ADVDATA_FULL_NAME;
    init.advdata.include_appearance 	= false;
    init.advdata.flags             		= BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
	init.advdata.p_tx_power_level		= &bt_tx_power_level;
	
    init.srdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);
    init.srdata.uuids_complete.p_uuids  = m_adv_uuids;
		
	
    adv_manuf_data_array.p_data 		= adv_manuf_data_data;
    adv_manuf_data_array.size 			= sizeof(adv_manuf_data_data);
    adv_manuf_data.company_identifier 	= 0x9876;
    adv_manuf_data.data 				= adv_manuf_data_array;
    init.advdata.p_manuf_specific_data	= &adv_manuf_data;	
	
    init.config.ble_adv_whitelist_enabled      			= false;
    init.config.ble_adv_directed_high_duty_enabled 	    = false;
    init.config.ble_adv_directed_enabled       			= false;	
    init.config.ble_adv_fast_enabled  					= true;
    init.config.ble_adv_fast_interval 					= APP_ADV_INTERVAL;
    init.config.ble_adv_fast_timeout  					= APP_ADV_DURATION;
    init.evt_handler = on_adv_evt;

    err_code = ble_advertising_init(&m_advertising, &init);
    APP_ERROR_CHECK(err_code);

    ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
}

8. 蓝牙 BLE 联结对功耗影响;

    8.1 联结间隔

蓝牙BLE设备联结后,蓝牙主机会向BLE设备发送连接事件(Connection Events),BLE设备接收到连接事件后,会进行回复,以通知蓝牙主机连接通路正常。而这是BLE设备连接后最耗电的工况,所以增加连接间隔时间会降低BLE设备的功耗,但是需要注意的是,改变连接间隔时间就相应地会改变蓝牙的通讯速度

    8.2 从机延时次数

从机延时(Slave Latency)次数,就是在连接时忽略连接事件的次数。

在每一个连接事件(Connection Event)中,蓝牙主机须先发包,然后蓝牙设备必须回复,一直这样重复下去,不然蓝牙主机会认为蓝牙设备那边不正常。而通过设置从机延时的次数,允许蓝牙设备一定次数内不对蓝牙主机数据进行回复,蓝牙主机即使没有收到蓝牙设备的回复也不会认为蓝牙设备不正常,这样的话,蓝牙设备也就降低了功耗。

void gap_params_init(void)
{
    uint32_t                err_code;
    ble_gap_conn_params_t   gap_conn_params;
    ble_gap_conn_sec_mode_t sec_mode;

    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);

    err_code = sd_ble_gap_device_name_set(&sec_mode,
                                          (const uint8_t *) DEVICE_NAME,
                                          strlen(DEVICE_NAME));
    APP_ERROR_CHECK(err_code);

    memset(&gap_conn_params, 0, sizeof(gap_conn_params));

    gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;    // 最小蓝牙联结间隔
    gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;    // 最大蓝牙联结间隔
    gap_conn_params.slave_latency     = SLAVE_LATENCY;        // 从机延时(Slave Latency)次数
    gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;

    err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
    APP_ERROR_CHECK(err_code);																																									
}

9. 系统电源有 SYSTEM_ON和SYSTEM_OFF 两种模式;

     SYSTEM_OFF 模式时钟停止,相当于关机,为最低功耗模式,工作电流为300nA (nRF52832)或400nA (nRF52840);

     SYSTEM_ON 为默认的低功耗模式,通常最低功耗为1.9uA (nRF52832)或1.5uA(nRF52840);

10. 设备在 3VDC 而不是 5VDC 运行; 

11. 程序下载器联结到设备上测试功耗,也要导致测量功耗上升;


申明:

本文部分参考大牛文章 ---- ”nRF52 Power优化降低70%以上耗电量“,感谢!

其原文链接为: https://blog.csdn.net/Uda_CADN/article/details/81230370

猜你喜欢

转载自blog.csdn.net/weixin_42396877/article/details/84259069