nRF52840/nRF52832 低功耗的测试工程
欢迎加群讨论QQ群:1037177913
项目的硬件说明
-
此工程 SDK的版本为 nRF5_SDK_17.0.2_d674dde
-
以下工程都是以IAR for arm V8.32.1
以下的电流分析仪为:PM132A
仪器链接为:https://shop221754637.taobao.com
PM132A主要功能:
- 10K 采样率
- 1uA-3A 自动量程测试
- 简单的上位机操作
测试工程 | ||
---|---|---|
ble_app_beacon | ||
ble_app_uart | ||
BLE Beacon 项目(nRF52840)
- 工程在\examples\ble_peripheral\ble_app_beacon
官方工程的功耗
重要参数 | 备注 | |
---|---|---|
广播间隔 | 100mS | |
平均电流 | 185uA | |
广播峰值电流 | 10mA | 由于板内有大电容,此峰值并非芯片的发射电流 |
底电流 | 14uA | |
Beacon 关Log
- 修改sdk_config.h 如下
测试项目 | ||
---|---|---|
底电流 | 3uA | |
平均电流 | 173uA | |
广播间隔 | 100mS | |
广播峰值电流 | 10mA | 由于板内有大电容,此峰值并非芯片的发射电流 |
Beacon 广播间隔
- 在main.c文件修改广播间隔。一般500mS - 1S Beacon 也可以满足实际的需求。
//#define NON_CONNECTABLE_ADV_INTERVAL MSEC_TO_UNITS(100, UNIT_0_625_MS) /**< The advertising interval for non-connectable advertisement (100 ms). This value can vary between 100ms to 10.24s). */
#define NON_CONNECTABLE_ADV_INTERVAL MSEC_TO_UNITS(500, UNIT_0_625_MS) /**< The advertising interval for non-connectable advertisement (500 ms). This value can vary between 100ms to 10.24s). */
- 1
- 2
测试项目 | ||
---|---|---|
广播间隔 | 500mS | |
底电流 | 3uA | |
平均电流 | 38.86uA | |
广播峰值电流 | 10mA | 由于板内有大电容,此峰值并非芯片的发射电流 |
Beacon的发射功率
static void advertising_init(void)
{
... err_code = sd_ble_gap_adv_set_configure(&m_adv_handle, &m_adv_data, &m_adv_params); APP_ERROR_CHECK(err_code);
//设置 tx db err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_ADV, 0,8); APP_ERROR_CHECK(err_code);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
测试项目 | ||
---|---|---|
广播间隔 | 500mS | |
底电流 | 3uA | |
平均电流 | 83.68uA | |
广播峰值电流 | 22mA | 增加了发射功率,电流就增大了 |
测试项目 | ||
---|---|---|
广播间隔 | 500mS | |
底电流 | 3uA | |
平均电流 | 59.62uA | |
广播峰值电流 | 24.68mA | 增加了发射功率,电流就增大了 |
测试项目 | ||
---|---|---|
广播间隔 | 500mS | |
底电流 | 3uA | |
平均电流 | 39.54uA | |
广播峰值电流 | 8.3mA | 增加了发射功率,电流就增大了 |
发射功率总结:
- 以我的经验测试发现,4dbm与0dbm的距离增远不了多少,但功耗增加了不少。调整天线,更有利于增加距离。
- 官方代码默认是0dbm
DCDC
-
要硬件支持DCDC才支持这个功能。
-
但Beacon打开下图,并不会打开DCDC的功能
ble_stack_init(); //在 stack 的 初始化后,立马打开。 sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE); sd_power_dcdc0_mode_set(NRF_POWER_DCDC_ENABLE);
- 1
- 2
- 3
- 4
测试项目 | ||
---|---|---|
广播间隔 | 500mS | |
底电流 | 3uA | |
平均电流 | 21.87uA | 平均电流可以降低 |
广播峰值电流 | 4mA | 增加了发射功率,电流就增大了 |
32.768K 晶体功耗
nRF52 可以省32.768K晶体,但不能省32M晶体。
- 功耗会相应的增加
- RTC时钟不准。
BLE Uart 工程 (nRF52832)
官方工程广播功耗
测试项目 | ||
---|---|---|
广播间隔 | 40mS | |
底电流 | 1.8mA | |
平均电流 | 2.71mA | 平均电流可以降低 |
广播峰值电流 | 11.8mA | 增加了发射功率,电流就增大了 |
官方工程连接功耗
测试项目 | ||
---|---|---|
连接间隔 | 75mS | |
底电流 | 1.84mA | |
平均电流 | 2.23mA | 平均电流可以降低 |
广播峰值电流 | 8.4mA | 增加了发射功率,电流就增大了 |
串口功耗优化
nRF52 串口电流 是非常大的,建议使用时候把它关闭。
- 现在为了简单起见,直接把串口关闭做测试。
int main(void)
{ bool erase_bonds; // Initialize. //uart_init(); //注释了uart log_init(); timers_init(); buttons_leds_init(&erase_bonds); power_management_init(); ble_stack_init(); gap_params_init(); gatt_init(); services_init(); advertising_init(); conn_params_init(); // Start execution.
// printf("\r\nUART started.\r\n");//注释串口打印 NRF_LOG_INFO("Debug logging for UART over RTT started."); advertising_start(); // Enter main loop. for (;;) { idle_state_handle(); }
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
//BLE 接收
static void nus_data_handler(ble_nus_evt_t * p_evt)
{ if (p_evt->type == BLE_NUS_EVT_RX_DATA) { uint32_t err_code; NRF_LOG_DEBUG("Received data from BLE NUS. Writing data on UART."); NRF_LOG_HEXDUMP_DEBUG(p_evt->params.rx_data.p_data, p_evt->params.rx_data.length);
#if 0 //关闭BLE接口转串口的代码 for (uint32_t i = 0; i < p_evt->params.rx_data.length; i++) { do { err_code = app_uart_put(p_evt->params.rx_data.p_data[i]); if ((err_code != NRF_SUCCESS) && (err_code != NRF_ERROR_BUSY)) { NRF_LOG_ERROR("Failed receiving NUS message. Error 0x%x. ", err_code); APP_ERROR_CHECK(err_code); } } while (err_code == NRF_ERROR_BUSY); } if (p_evt->params.rx_data.p_data[p_evt->params.rx_data.length - 1] == '\r') { while (app_uart_put('\n') == NRF_ERROR_BUSY); }
#endif }
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FcMWfjgZ-1613732764505)(picture/image-20210216141124915.png)]
广播间隔与关闭Log的优化
一般带连接的广播间隔设置为200ms-500ms,具体要看项目的功耗需求。现在设置了300ms测试
#define APP_ADV_INTERVAL MSEC_TO_UNITS(300, UNIT_0_625_MS) //广播间隔300ms
- 1
power_management_init(); ble_stack_init(); //sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE); //由于硬件无法支持DCDC,所以无法打开进行测试。
- 1
- 2
- 3
测试项目 | ||
---|---|---|
广播间隔 | 300mS | |
底电流 | 0.2uA | |
平均电流 | 76uA | 平均电流可以降低 |
广播峰值电流 | 11.69mA | 增加了发射功率,电流就增大了 |
连接间隔的设置
连接间隔主要看数据量大不大,如果数据不大,尽量控制在200ms左右,如果在大量的突发数据,可以动态改变连接间隔,从而降低功耗,如果是BLE4.2+,把长包打开,并设置长一些间隔。
#define MIN_CONN_INTERVAL MSEC_TO_UNITS(200, UNIT_1_25_MS) /**< Minimum acceptable connection interval (200 ms), Connection interval uses 1.25 ms units. */
#define MAX_CONN_INTERVAL MSEC_TO_UNITS(500, UNIT_1_25_MS) /**< Maximum acceptable connection interval (500 ms), Connection interval uses 1.25 ms units. */
- 1
- 2
- 3
3个广播通道的广播电流
文章来源: blog.csdn.net,作者:hzhmcu,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/hzhmcu/article/details/113870269