nRF52832 低功耗优化举措

一、电路优化

二、电量消耗预估

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

1、使用外部32kHz晶振或者使用内部32kHz RC

2、广播消耗:

广播间隔
每个广播包的广播有效数据的字节数
持续的广播或定期的广播
每个广播间隔处理时间


3、连接期间电流消耗:

连接时间间隔
从机延时
每个包中的RX有效载荷
每个包中的TX有效载荷
每个连接间隔中要接收的RX数据包的数量(最多6个)
每个连接间隔中要发送的TX数据包数量(最多6个)
32 khz主时钟精度
每个连接间隔中的应用程序处理时间


4、计算SPI、UART或TWI传输的电流消耗

使用什么接口,SPI,UART,TWI
传输速度
数据统计
发射、接收或者两者都用
还有使用其他外围设备电量消耗,如TIMER、GPIOTE等 ;尽可能提供以上参数,可以更加准确估算当前驱动程序的电量消耗。

三、电池寿命预估

已知设备的平均电流消耗和电池的容量,计算电池寿命。以下是不同能量容量电池的电池寿命计算实例:

例1:

设备的平均电流消耗 :20uA

电池容量:220mAh (标准CR2032纽扣电池 )

电池寿命:
0.22Ah/0.00002A=11000hours=458days
0.22Ah/0.00002A=11000hours=458days
例2:

设备的平均电流消耗 :100uA

电池容量:220mAh (标准CR2032纽扣电池 )

电池寿命:
0.22Ah/0.0001A=2200hours=91days
0.22Ah/0.0001A=2200hours=91days
例3:

设备的平均电流消耗 :100uA

电池容量:1000mAh (标准CR2477纽扣电池 )

电池寿命:
1Ah/0.0001A=10000hours=417days
1Ah/0.0001A=10000hours=417days


四、电源优化

1、系统

通过使能和设置DC/DC转换,可以使当前消耗大大降低。根据设计,可以减少40%或更多的电量使用。占空比越高,从DC/DC转换省下的消耗就越多。

main.c文件,main函数设置:NRF_POWER->DCDCEN = 1;
在sdk_config.h中配置 POWER_CONFIG_DEFAULT_DCDCEN = 1
关闭日志日志记录:

main.c文件,main函数中注释掉log_init();
在sdk_config.h中相关的log记录使能配置为0
通过使能和设置外部32kHz LFCLK晶振,可以节省1-2%的电能。在非常低的工作周期应用程序中,广播间隔越大的beacon,节省的电量越多。

main.c文件,ble_stack_init()函数中go to Definition of ‘nrf_sdh_enable_request();’进入nrf_sdh.c文件中的ret_code_t nrf_sdh_enable_request(void)函数找到:

nrf_clock_lf_cfg_t const clock_lf_cfg =
    {
        .source       = NRF_SDH_CLOCK_LF_SRC, 
        .rc_ctiv      = NRF_SDH_CLOCK_LF_RC_CTIV, 
        .rc_temp_ctiv = NRF_SDH_CLOCK_LF_RC_TEMP_CTIV,
        .accuracy     = NRF_SDH_CLOCK_LF_ACCURACY
    };


.source配置脉冲时钟源:/脉冲时钟源,0内部时钟源NRF_CLOCK_LF_SRC_RC ,1外部晶振源NRF_CLOCK_LF_SRC_XTAL ,2合成时钟源NRF_CLOCK_LF_SRC_SYNTH ;

.rc_ctiv配置校准时间间隔,使用外部晶振源设置为0;

.rc_temp_ctivRC振荡器需要校准的频率 ,使用外部晶振源设置为0;

.accuracy配置外部时钟精度,设置为NRF_CLOCK_LF_ACCURACY_20_PPM

确保提供一种测量nRF52电流的方法。如果nRF52电源与其他电路结合,将无法独立地测量它并得到有意义的结果 参考图nRF current measurement电路

选择合适纽扣电池。nRF52832脉冲电流为7mA (DCDC)和12mA (w/o DCDC)。适当的去耦可以减轻这些脉冲对电池的影响,但是高脉冲电流和低温可以显著降低纽扣电池的总容量。

查阅勘误表,并注意你的设计的功耗。 可能会影响到串口或其他的外围设备选择。

尽量将设备在3V电压上工作(尽管芯片允许5V电压工作),除了GPIO以外,内部电路没有一个在这些电压下运行 ,因此,在较低的电压下运行不会减少功耗 。

只对需要保留的内存使用RAM_RETENTION ,使用更多会增加不必要的功耗

nRF52上只有两种电源模式:SYSTEM_ON和SYSTEM_OFF :

SYSTEM_OFF :是最低功耗模式,工作电流为300nA (nRF52832)或400nA (nRF52840),在该模式下,系统的内核和所有在运行的任务都会停止,也就是说时钟也停止,相当于关机状态。可以直接控制POWER相关寄存器使系统进入System OFF模式(NRF_POWER->SYSTEMOFF = 1; ),也可以通过API函数(sleep_mode_enter()或nrf_pwr_mgmt_run()此函数执行__WFE()指令进入睡眠前清除所有事件),可以参考SDK中的nrf_pwr_mgt例子,系统进入System OFF模式会保留GPIO之前的状态,包括GPIO的输入/输出、I2C总线、SPI总线等,所以在进入System OFF模式前应该将GPIO都释放掉,使用nrf_gpio_cfg_default(pin)释放GPIO,同时,如果有I2C或SPI等总线外设也需要释放掉;可以通过复位、GPIO中断或NFC信号(增加100nA)进行唤醒 。从System OFF模式中唤醒程序会发生复位,参考 832 product spec和840 product spec 文档
如果需要在进入睡眠前保留RAM参数,则可以在main函数中设置:

// 睡眠保留RAM的参数 

NRF_POWER->RAMON = POWER_RAMON_ONRAM0_RAM0On<<POWER_RAMON_ONRAM0_Pos  
                | POWER_RAMON_ONRAM1_RAM1On<<POWER_RAMON_ONRAM1_Pos  
                | POWER_RAMON_OFFRAM0_RAM0Off<<POWER_RAMON_OFFRAM0_Pos 
                |POWER_RAMON_OFFRAM1_RAM1Off<<POWER_RAMON_OFFRAM1_Pos;


SYSTEM_ON: 此状态有持续的延迟和低功率子模式。在默认的低功耗子模式中,通常最低功耗为1.9uA (nRF52832)或1.5uA(nRF52840),包括LFCLK和RTC。这是连接事件之间的正常状态。CPU在计时器、外围设备或pin中断时重新启动。

2、硬件

请注意,根据场景,单脚GPIOTE中断可能比端口GPIOTE中断使用更多的电量。
所有GPIO的默认状态为断开连接输入状态。除了你需要使用的引脚配置为其他类型,否则将未使用的引脚保留默认状态,并且物理上断开连接以控制无电流损耗。
在0dBm时,打开DC/DC, nRF52832发射电流5.3mA。将TX功率增加到+4dBm只增加2.2mA。减少到- 40dbm只节省2.6mA。
考虑为具有高漏电流的传感器增加一个GPIO控制的电源开关(例如高侧p通道MOSFET),以减少系统断电电流 。

3、软件

注意在SDK示例的main函数的while(1)循环中power_manage()或sd_app_evt_wait()调用 。运行此指令以处理中断和竞态条件,并允许适当地闲置CPU。如果您的代码没有达到这条指令,CPU将继续处于打开状态并消耗电量。
尽可能使用应用程序计时器而不是软件延迟。软件延迟循环将保持CPU的运行能力。

4、调试

如果SWD调试器连接没有正常断开,则nRF52可能仍然处于调试接口(DIF)模式。当设备处于调试接口模式时,它将增加额外的电流,因为它始终保持一定的外围设备集。执行引脚重置,给定的引脚重置已在部件上启用,且可访问,是确保不启用DIF模式的一种常见方法
使用合适的工具来测量你的电流。使用在线电源分析器和产品规格号来估计你的平均电流。使用PPK测量 或 correct method 测量。请注意,PPK测量在非常、非常低的静态电流水平上是不准确的。
在测量电流时,一定要用电池为你的设计供电,因为电源可能会引入未知的变量。
下面列出了最常见的电源场景以及如何识别它们 : 
测量电流大约是4mA :CPU正在运行,要么是你故意使用它,要么是因为你没有运行power_manage();该指令是关闭CPU的指令。
在SYSTEM_OFF模式下,测量电流比几百个nA多得多 :这个部分实际上并不是在SYSTEM_OFF模式中,而是有一些东西还在运行…如CPU,外围设备。确保您的关机过程确实关闭了所有的设备。循环电源以确保SWD端口没有被疏忽打开。另一个常见的问题是在debug interface (DIF)模式下,通过连接调试器或在编程之后不进行电源循环。
在SYSTEM_ON模式下关闭CPU,但是测量了100的uA :你可能留下了一个外设,可能是故意的。如果您通过UART启用了日志记录,那么也将使用这个数量的电流。在sdk_config.h文件中关闭UART日志记录支持RTT。除非调试器已连接,否则RTT不会使用电流。
测量到10mA:nRF52几乎不可能消耗这么大的电流。几乎可以肯定的是,你同时测量了外设电路的电流。

原文:https://blog.csdn.net/Uda_CADN/article/details/81230370 
 

  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是生成NRF52832低功耗休眠中断唤醒代码的步骤: 1. 首先,在Nordic官方网站下载并安装nRF5 SDK(软件开发工具包)。该SDK包括了Nordic的低功耗无线芯片系列(包括NRF52832)的驱动程序、例程和文档等。 2. 在nRF5 SDK中选择合适的例程(如ble_app_uart)进行修改。可以使用Nordic提供的nRF Connect工具将该例程烧录到NRF52832芯片上进行测试。 3. 在代码中加入低功耗休眠中断唤醒相关的代码,如下所示: ```c // 初始化GPIO中断 nrf_gpio_cfg_input(GPIO_PIN, NRF_GPIO_PIN_PULLUP); nrf_gpio_cfg_sense_input(GPIO_PIN, NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW); // 初始化中断 NVIC_ClearPendingIRQ(GPIOTE_IRQn); NVIC_SetPriority(GPIOTE_IRQn, 0); NVIC_EnableIRQ(GPIOTE_IRQn); // 进入低功耗休眠模式 __WFE(); __SEV(); __WFE(); ``` 其中,GPIO_PIN为需要监听的GPIO引脚号,GPIOTE_IRQn为GPIO中断向量号。 4. 在中断处理函数中加入唤醒代码,如下所示: ```c void GPIOTE_IRQHandler(void) { if (nrf_gpiote_event_is_set(NRF_GPIOTE_EVENTS_IN_0)) { nrf_gpiote_event_clear(NRF_GPIOTE_EVENTS_IN_0); // 唤醒代码 } } ``` 其中,NRF_GPIOTE_EVENTS_IN_0为GPIO中断事件号。 5. 在main函数中调用低功耗休眠函数,如下所示: ```c while (true) { // 进入低功耗休眠模式 __WFE(); __SEV(); __WFE(); } ``` 至此,NRF52832低功耗休眠中断唤醒代码的生成完成。需要注意的是,在实际应用中,需要根据具体的需求进行修改和优化
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值