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). */
测试项目 | ||
---|---|---|
广播间隔 | 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);
}
测试项目 | ||
---|---|---|
广播间隔 | 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);
测试项目 | ||
---|---|---|
广播间隔 | 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();
}
}
//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
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FcMWfjgZ-1613732764505)(picture/image-20210216141124915.png)]
广播间隔与关闭Log的优化
一般带连接的广播间隔设置为200ms-500ms,具体要看项目的功耗需求。现在设置了300ms测试
#define APP_ADV_INTERVAL MSEC_TO_UNITS(300, UNIT_0_625_MS) //广播间隔300ms
power_management_init();
ble_stack_init();
//sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE); //由于硬件无法支持DCDC,所以无法打开进行测试。
测试项目 | ||
---|---|---|
广播间隔 | 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. */