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;