nRF52 Power优化

转自:https://blog.csdn.net/Uda_CADN/article/details/81230370

一、电路优化

      

二、电量消耗预估
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的参数 

// 睡眠保留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几乎不可能消耗这么大的电流。几乎可以肯定的是,你同时测量了外设电路的电流。
 

猜你喜欢

转载自blog.csdn.net/w464960660/article/details/87725494