NRF52 NRF51 測量板子的功耗高的原因有哪些?

低功耗藍牙應用對功耗要求越低越好,功耗越低電池續航時間就越長,用戶體驗就越好。當你發現你板子功耗偏高時,建議按照如下步驟進行自檢:

1)       確認理論功耗值。BLE功耗跟廣播間隔或者連接間隔是成正比關係的,所以20ms連接間隔下的功耗幾乎是1s狀態下的50倍!,單純地問“1mA功耗高不高?”是沒有意義的,必須結合特定的應用場景纔有意義。不管是廣播還是連接,特定的使用場景會有一個理論功耗值,大家可以訪問網址: https://devzone.nordicsemi.com/power/,以獲得你的使用場景下理論功耗多少,比如連接模式下,每1秒鐘發20個字節的數據包,這種模式下理論功耗爲:7.6uA

 

2)       確定板子漏電流。如果板子包含的元器件比較多,那麼也有可能是其他非nRF5元器件導致的高功耗,比如傳感器,codec,或者電路設計本身的問題等。爲了確定高功耗是來自nRF5器件還是其他器件,根據自己的情況,有如下三個方法供你參考:一如果你的固件可以直接在Nordic官方DK上運行,那麼你可以把你的固件直接下載到DK上,然後通過DK測量nRF5芯片的功耗,如果這個功耗正常,那麼大電流應該是由其他非nRF5元器件引起的;如果這個功耗偏高,那麼大電流的確是由nRF5芯片固件引起的,此時請參考後續操作步驟說明。二如果你的固件不能在DK上直接運行,那麼可以讓nRF5芯片進入深度睡眠模式(System OFF模式),此時nRF5芯片功耗只有零點幾微安,nRF5芯片所有IO口將處於floating狀態,此時再測量板子電流。如果板子電流恢復正常,那麼大電流應該是由nRF5芯片固件引起的;如果板子電流還是不正常,那麼大電流應該由其他非nRF5元器件引起的。關於如何進入深度睡眠模式,你可以參考工程:nRF5_SDK_15.0.0_a53641a\examples\peripheral\ram_retention\pca10040\blank\arm5_no_packs,或者參考ble_app_hrs工程中函數:sleep_mode_enter。三如果你的板子太複雜,無法按照上面兩種方法來確定漏電流,那麼只能將板子其他非必需元器件焊下來,只留下一個nRF5最小工作系統,然後再測量此時的板子電流是否正常。

3)       確定板子已經退出J-Link模式。如果板子一直是電池供電,那麼在某些情況下,即使程序下載完成而且運行正常,此時板子有可能還處在J-Link模式。J-Link模式下板子會有2mA左右的額外電流。要退出J-Link模式,有2種方式,一是給板子進行上電覆位,二是通過nrfjprog發出—pinreset(nRF51系列)或者—reset指令(nRF52系列)。兩種方式都能讓板子退出J-Link模式,從而進入應用模式。

4)       如果最終確認大電流的確是由nRF5芯片引起的,那麼幾乎可以肯定系統在進入idle模式(System ON模式)之前,沒有關掉不需要的模塊。模塊沒有關掉,它就一直在耗電,從而導致功耗過大。Idle模式下,如下模塊會耗費比較多的電流,若允許建議全部關掉。

  • 進入Idle模式。先說明一下什麼是idle模式,所謂Idle模式,Nordic芯片手冊也稱爲System ON模式,就是CPU可以不工作而外設可以繼續工作的一種低功耗模式。idle模式下,當CPU和所有外設都不工作時,系統電流也就有2uA左右。(注:除了idle模式,nRF5芯片還支持一種更低功耗的低功耗模式:sleep模式(Nordic芯片手冊稱爲System OFF模式),sleep模式下,CPU和所有外設都強制關閉,所以功耗非常低:只有零點幾微安。由於sleep模式下,芯片無法發出廣播包或者與手機保持藍牙連接,所以sleep模式在BLE應用中運用得並不是很多)。Idle模式可以被任何中斷喚醒(sleep模式只能被IO口喚醒),所以idle模式在實際應用中使用得比較多。在idle模式下,芯片仍然可以正常發出廣播或者與手機保持藍牙連接,所以大部分BLE應用都是工作在idle模式下,這樣既保持了BLE功能又可以實現低功耗。有softdevice時進入idle模式的函數是:
sd_app_evt_wait

         無softdevice時進入idle模式的代碼是:

  __WFE();
 // Clear the internal event register.
 __SEV();
 __WFE();

      這裏我們順便把進入sleep模式的函數也貼出來,供大家對比參考。有softdevice時進入sleep模式的函數是:

sd_power_system_off

     無softdevice時進入sleep模式的代碼是:

// Enter System OFF and wait for wake up from GPIO detect signal.

NRF_POWER->SYSTEMOFF = 0x1;
  • UART/UARTE。由於UART需要實時檢測RX線上有沒有下降沿,所以一旦UART初始化成功,高頻時鐘將一直處於打開狀態,從而導致UART模塊消耗的電流比較大,雖然UART模塊本身只需要55uA的工作電流,但是自動打開的高頻時鐘電路需要消耗250uA左右電流。如果使能了UARTE的easyDMA(52810 easyDMA是強制打開的),那麼DMA還需要消耗額外的2mA電流。這樣UARTE工作總共需要消耗:55uA + 250uA + 2mA。因此在進入idle模式之前,強烈建議將UART關掉,以節省系統功耗。注:爲了達到低功耗和實時性雙重目的,在設計UART通信的時候,我們經常會額外再加2個IO口用來通知對方UART要傳送數據了。
  • GPIOTE。GPIOTE中斷有兩種工作模式:高精度模式(hi_accuracy爲true)和低精度模式(hi_accuracy爲false)。hi_accuracy爲true將使能IN event中斷;hi_accuracy爲false將使能Port event中斷。IN event中斷功耗比Port event中斷功耗高很多,因此,如果是檢測一般的沿或者IO口電平,那麼建議使用低精度模式,即使用如下初始化語句:
 GPIOTE_CONFIG_IN_SENSE_TOGGLE(false)   //低功耗低精度IO口中斷模式
  • DMA。Nordic大部分外設都自帶DMA功能,如果DMA可以關閉的話(有些設備DMA是不能關閉的),用完DMA之後,記得把DMA關掉,否則會有2mA左右的功耗。使用ADC的時候尤其要注意這點。
  • FPU。只要程序中使用了浮點數,Cortex M4會自動把FPU打開,FPU是耗能大戶,其將消耗7mA以上的電流。此種情況下,進入idle模式之前必須手動關閉FPU,手動關閉FPU代碼如下所示:

複製代碼

/* Clear FPSCR register and clear pending FPU interrupts. This code is base on

         * nRF5x_release_notes.txt in documentation folder. It is necessary part of code when

         * application using power saving mode and after handling FPU errors in polling mode.

*/

__set_FPSCR(__get_FPSCR() & ~(FPU_EXCEPTION_MASK));

(void) __get_FPSCR();

NVIC_ClearPendingIRQ(FPU_IRQn);

複製代碼

  • Timer0/1/2/3/4。Timer的工作電流大概爲70uA,對低功耗應用來說,已經非常大了。如果你的定時精度要求不高,而且是毫秒的倍數,那麼強烈建議你使用app_timer來實現定時功能,app_timer的功耗只有0.2uA左右。
  • SPI/TWI。在進入idle模式之前,建議把SPI和TWI模塊也uninit。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章