nRF52840/nRF52832 低功耗的测试工程

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
  • 8dBm

在这里插入图片描述

测试项目
广播间隔 500mS
底电流 3uA
平均电流 83.68uA
广播峰值电流 22mA 增加了发射功率,电流就增大了
  • 4dBm

在这里插入图片描述

测试项目
广播间隔 500mS
底电流 3uA
平均电流 59.62uA
广播峰值电流 24.68mA 增加了发射功率,电流就增大了
  • 0dBm

在这里插入图片描述

测试项目
广播间隔 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

(完)