低功耗設(shè)計參考
前言
低功耗設(shè)計(Low Power Design)是指在系統(tǒng)的軟硬件架構(gòu)、芯片選擇、外圍電路、供電管理、工作模式等方面做出合理設(shè)計,以降低設(shè)備的能耗、延長電池壽命或減少發(fā)熱。
低功耗設(shè)計可帶來好處如下:
? 續(xù)航增加,可以提升用戶體驗,提高產(chǎn)品競爭力;
? 充電次數(shù)減少,可以延長電池壽命;
? 降低發(fā)熱,提高穩(wěn)定性,并可以延長產(chǎn)品使用壽命。
而低功耗設(shè)計難度并不在技術(shù)本身,而在:
? 軟硬件配合難,要 MCU、外設(shè)、電源管理、電路板設(shè)計、固件策略全鏈路協(xié)同;
? 取舍難,功能強則功耗高,響應(yīng)快則功耗高,處理快則功耗高,難兩全;
? 狀態(tài)管理難,系統(tǒng)狀態(tài)多(運行/待機/休眠/喚醒),工作狀態(tài)多(高性能/一般性能/低性能),處理不好容易死機、異常喚醒;
? 細節(jié)排查難,細如某個IO配置錯誤,時鐘源未關(guān)閉,執(zhí)行的先后時序差異就會造成功耗異常;
? 功耗測試難,需要各種專業(yè)儀器(電源分析儀、示波器)配合才能精準(zhǔn)定位問題源;
? 調(diào)試難,每次調(diào)試都需要進入 Sleep/Wake 再觀測功耗,流程復(fù)雜、驗證周期長、甚至復(fù)現(xiàn)概率低;
? 解耦難,有的問題是各模塊耦合產(chǎn)生,增加了問題定位分析難度;
可見低功耗設(shè)計是一項繁瑣、枯燥但十分重要的工作,且跟蹤周期貫穿了整個產(chǎn)品生命,需要開發(fā)者保持耐心、細心。
本文會從設(shè)計整體流程、測試建議、設(shè)計參考、調(diào)試方法這幾個方面入手,幫助初學(xué)者入門,筆者水平有限,如有錯漏或者有其他建議,歡迎指出,感謝!
wjh_hugh@163.com
設(shè)計整體流程
首先需要先回答一個問題:功耗要多低才算低功耗呢?對于耳機uA級別算低,對于手機mA級別就算低,不同產(chǎn)品不同場景下的定義都是不同的,所以我們需要先設(shè)定一個目標(biāo),由目標(biāo)來制定標(biāo)準(zhǔn),由標(biāo)準(zhǔn)來框定設(shè)計。
總體設(shè)計流程如下:

例如,產(chǎn)品定義會影響ID,ID會決定尺寸,尺寸會決定電池容量,最后在供應(yīng)商提供的范圍內(nèi)根據(jù)成本選定了300mAh的容量,產(chǎn)品需求出貨待機續(xù)航大于180天,那計算可得300mAh/(24h180)=69uA,又因為出貨時電量不能滿電(長時間滿電狀態(tài)會影響電池壽命),一般按50~80%電量出貨,再算得69uA80%=56uA,即可標(biāo)定待機功耗須小于56uA,此為該場景的功耗要求上限(注意因為會有多種功耗場景,最后應(yīng)取最小功耗上限值,此處簡化例子,以該場景下的就是最小上限值)。
此值就需要納入到主芯片等器件選型的考慮因素中,比如在同樣deep-sleep模式下,主芯片A典型功耗為30uA,而主芯片B典型功耗為1uA,那在功耗方面,芯片B更具優(yōu)勢。硬件估算低功耗模式總的工作電路功耗=主芯片功耗+LDO(1uA)+電源管理芯片(8uA),此時不管是選擇芯片A還是B都能滿足產(chǎn)品的功耗需求,那此時主芯片選型就可以著重考慮其他因素。假如還有顆主芯片C典型功耗達50uA,顯然不滿足需求,正常情況下會被排除掉,但如果產(chǎn)品某個需求只有芯片C可滿足,不得不選用芯片C,那這個時候可能就需要調(diào)整id、砍功能、更換其他器件甚至是更改產(chǎn)品定義。
最終電路所有主要器件定型后就可以確定產(chǎn)品的功耗基線,制定測試標(biāo)準(zhǔn),編寫測試用例。
注意,我們還需要使用原始SDK與最小系統(tǒng)開發(fā)板實測一遍功耗,因為數(shù)據(jù)手冊中數(shù)據(jù)下的工作狀態(tài)不一定與產(chǎn)品實際應(yīng)用的工作狀態(tài)一致,而且不同芯片平臺的測試環(huán)境,測試參數(shù)也不一定一致。
在實際過程中,由于電路器件精度、測試儀器精度、環(huán)境溫度、軟件工作負載的影響,測試數(shù)據(jù)會和理論值存在偏差,一般偏差在±10%以內(nèi),會認為是在正常范圍內(nèi),當(dāng)然還是要根據(jù)應(yīng)用場景、測試手法和項目要求視具體情況而定。
以上流程的主要工作量并不在軟件這邊,當(dāng)產(chǎn)品需求明確和硬件器件定型后,軟件便可以開始需求拆解,然后進行具體的軟件設(shè)計。這里推薦使用狀態(tài)機法(FSM),將系統(tǒng)的運行狀態(tài)拆分為幾個典型狀態(tài),通過事件驅(qū)動觸發(fā)狀態(tài)跳轉(zhuǎn),然后在不同狀態(tài)下啟用/關(guān)閉不同模塊,以達到功耗管理的目的。假如以某果耳機為例,狀態(tài)機圖可以如下:

測試建議
- 定標(biāo)準(zhǔn),統(tǒng)一驗收測試的場景手法
功耗測試的影響因素眾多,以耳機播歌為例,影響因素有環(huán)境溫度、音頻EQ參數(shù)、播歌音量、音頻格式、手機型號和品牌,播歌歌曲、天線信號質(zhì)量、外殼裝配、手機距離、信號干擾、多點功能是否打開、BLE是否打開,藍牙參數(shù)是否一致(發(fā)射功率、廣播間隔、廣播時長),測試時要盡量保持一致性,前期的測試標(biāo)準(zhǔn)也要先明確好,避免影響驗收。測試環(huán)境的搭建會相對比較麻煩,但切勿隨意,不然測試結(jié)果也是無效數(shù)據(jù),作無用功。 - 定期大版本監(jiān)測
因為功耗測試需要借助測試儀器,相比與功能測試會多一定的工作量,如果要求過于頻繁地監(jiān)測那既不現(xiàn)實也沒這個必要,反之一直不測試,直到臨近生產(chǎn)前才測一遍同樣是不可取的。平衡工作量和風(fēng)險,建議在這兩種節(jié)點都需監(jiān)測一下功耗數(shù)據(jù):一個是軟件大版本發(fā)布,另一個是硬件電路板變動。 - 靈活小版本監(jiān)測
上述的大版本監(jiān)測屬于定期監(jiān)測,但有的時候項目周期長,大版本間跨度比較大,中間可能有大量的代碼提交,如果還只是死板地定期監(jiān)測,一旦出現(xiàn)功耗異常,其排查難度會增加。所以還需要靈活手段補充,每個周版本我們需要對每筆代碼提交有個初步判斷,是否對功耗有所影響,覺得有那就應(yīng)當(dāng)安排相關(guān)場景下的功耗測試。以下幾個判斷點以供參考:
? 是否與驅(qū)動相關(guān)
? 有無增減模塊功能
? 主頻是否變更
? 系統(tǒng)負載是否加大(比如某個任務(wù)執(zhí)行很頻繁)
? 有無模式狀態(tài)切換
? 是否影響輸出功能 - 保留版本金機
軟硬件版本都會不斷迭代,如果某個版本突然出現(xiàn)功耗異常,那其他版本的金機就能提供對比,具有很高的參考價值,所以保留版本金機會是一個不錯的習(xí)慣。 - 異常場景測試
除了正常場景的測試用例,開發(fā)者還需進行需求拆解后設(shè)計異常場景下的測試用例。
// to do.如果您有好用的異常場景測試用例設(shè)計方法論,請聯(lián)系筆者。 - 埋點測試
不同于其他功能,低功耗問題不易察覺。開發(fā)者可以設(shè)計一些檢測功耗狀態(tài)的日志用于調(diào)試、排查功耗異常。比如可以記錄進入/退出低功耗的條件/原因、時間戳,這樣就可以分析出總的續(xù)航時間、睡眠比例、睡眠時長、進入/退出低功耗是否正常。
注:低功耗狀態(tài)一般不會開串口,可以保存在RAM中,喚醒后統(tǒng)一上報;低功耗狀態(tài)的systick不一定會保持運行,但一般會有RTC或者LP Timer進行周期喂狗,這樣也可以代替計算時長。
設(shè)計參考
低功耗設(shè)計是一個系統(tǒng)性的設(shè)計優(yōu)化過程,但總的來說,低功耗設(shè)計可以從兩個緯度去考慮:
? 功能->線程->器件->外設(shè)->內(nèi)核
? 板級->芯片->外設(shè)->內(nèi)核
分別從軟硬件層面,由外到內(nèi)的收縮聚攏;
0. 設(shè)計原則
? 余量設(shè)計。這不僅是低功耗設(shè)計,還是提高產(chǎn)品可靠性的重要設(shè)計原則。參數(shù)設(shè)計上要預(yù)留出一定的空間,狀態(tài)切換能慢不快,功耗數(shù)據(jù)能低不高,富裕空間能多不少, 操作頻率能低不高。
? 自主原則。盡量不依賴自動的、默認的操作和設(shè)置,盡量每一步的控制都是可掌控的、可預(yù)見的。
? 異常處理原則。程序總會遇到意料之外的輸入、狀態(tài)或者故障,我們需要及時檢測并妥善處理。當(dāng)然,這對于開發(fā)者,尤其新手來說是總是難以考慮周全的,對此建議是起碼養(yǎng)成對函數(shù)的返回值進行處理的習(xí)慣(至少log輸出返回值),同樣的編寫被調(diào)用函數(shù)也應(yīng)盡量考慮是否需要提供返回值給調(diào)用者。
- 建立基本的功耗模型
//to do - 熟悉外部芯片的工作模式及其功耗
對器件的熟悉程序很大程度上會影響到問題定位速度和功耗設(shè)計思路。
例1:正常整機功耗約20uA,有某個樣機功耗異常,約120uA,如若已知充電管理芯片在boost打開狀態(tài)下典型功耗110uA,便那可快速聯(lián)系到可能是進低功耗前boost關(guān)閉失敗導(dǎo)致的,加快問題的定位分析。
例2:某傳感器有不同工作模式,其low-power mode和high-performance mode的功耗差約200uA,假如一直保持高性能的狀態(tài),產(chǎn)品可能無法達到續(xù)航要求,故程序需要做工作模式切換來進行功耗優(yōu)化。 - 各線程對各自資源負責(zé)
當(dāng)系統(tǒng)決定進低功耗時,需先通知各線程,各線程對使用的資源進行關(guān)閉和反初始化,該過程不應(yīng)有依賴或阻塞。建議先關(guān)閉異步資源,如定時器;注意資源的關(guān)閉不要遺漏,如定時器不要忘記關(guān)閉。而功耗管理線程只對通用資源管理,如時鐘、電源軌等。
例1:某線程進低功耗前忘記關(guān)閉定時器A,雖然不會被定時喚醒,但若系統(tǒng)的定時器打開了補償模式,那經(jīng)過長時間后,系統(tǒng)喚醒后,由于systick值累積,會大量觸發(fā)定時器回調(diào),導(dǎo)致系統(tǒng)崩潰死機。 - 對進入低功耗模式的條件進行分級,增加容錯設(shè)計
系統(tǒng)進入低功耗模式需要先滿足各種條件,比如不能在充電狀態(tài)、需滿電狀態(tài)等,你需要對各種條件進行分級,區(qū)分必須必要條件和非必要條件,例如非充電狀態(tài)就是必要條件,因為充電狀態(tài)由外部供電(假設(shè)電源管理芯片有路徑管理)長時間不進入低功耗模式不會影響產(chǎn)品續(xù)航。而滿電狀態(tài)是一個非必要條件,例如產(chǎn)品電量太低了,如果繼續(xù)高功耗運行可能會使得電池過放從而影響電池壽命。 - 對外部芯片的操作和進入低功耗之間建議保持適當(dāng)?shù)臅r間間隔
對外部芯片操作可能會產(chǎn)生中斷,而由于內(nèi)部工作狀態(tài)的切換或者電路的充放電需要一定時間,中斷信號可能是延遲產(chǎn)生的,如果操作完立刻進入低功耗,那可能又會馬上被延遲產(chǎn)生的中斷信號喚醒。
例1:為了降低功耗,進低功耗前需要關(guān)閉某傳感器的部分功能,這可能會使得內(nèi)部狀態(tài)發(fā)生變化,但這變化與內(nèi)部電路的放電時間掛鉤,所以會延遲產(chǎn)生一個中斷信號,然后立刻重新喚醒主芯片; - 顯式設(shè)置所有芯片引腳
注意是所有,有的芯片由于封裝不同有點引腳沒有引出來,也必須進行設(shè)置;注意還是所有,除了主芯片,外部芯片的引腳設(shè)置也應(yīng)當(dāng)是確定的;
例1:原廠基于成本或封裝原因,芯片內(nèi)部部分引腳沒有封裝出來,如果沒有對這些GPIO進行配置,內(nèi)部的GPIO會出現(xiàn)漏電,導(dǎo)致功耗出現(xiàn)浮動。 - 芯片引腳的模式設(shè)置
一般情況下低功耗模式下優(yōu)先設(shè)置模擬輸入>輸出低>高阻;
但是注意避免外部電路沖突,比如外部是上拉電路,那就不適宜設(shè)置輸出低,會形成電位差產(chǎn)生漏電流。
而裸漏在整機外部的引腳也不適合設(shè)置成輸出,容易漏電導(dǎo)致加快腐蝕;
避免使用浮空模式,當(dāng)為浮空輸入時,表面上電路上沒有回路,實際上IO電平是有可能會出現(xiàn)反復(fù)抖動,短暫的電位差也會導(dǎo)致漏電; - 考慮使用場景,關(guān)閉不必要模塊,節(jié)省功耗
不是所有外設(shè)在所有場景都需要保持常開的,同時注意關(guān)閉外設(shè)模塊后須同步關(guān)閉外設(shè)時鐘,不然該外設(shè)仍會產(chǎn)生功耗。 - 中斷使能與中斷喚醒使能
中斷使能是用來控制中斷是否響應(yīng),影響是否進入執(zhí)行中斷服務(wù)函數(shù),而中斷喚醒使能是控制喚醒源能否可喚醒MCU,這是兩個獨立的開關(guān)功能。那如果只關(guān)閉中斷喚醒而不關(guān)閉中斷使能可以嗎?理論上可以,但還是強烈建議同時關(guān)閉。中斷是不可控的,假如在喚醒時剛好觸發(fā)執(zhí)行了中斷服務(wù),可能與開發(fā)者預(yù)期不符。 - 區(qū)分不同程度的功耗模式
避免芯片選型時的數(shù)據(jù)參考錯誤,功耗對比要在同一等級的功耗模式下比較。常用的有sleep、deepsleep、standby模式,確認不同模式還能工作的外設(shè);明確需求是否需要保持RAM,選擇的低功耗模式下芯片是否全部RAM都可保持,是否還需要什么外設(shè)繼續(xù)工作,選擇的中斷源是否還能保持工作,該中斷源是否還能作喚醒源。 - 顯式切換時鐘
有的芯片進入低功耗會自動切換外部時鐘到內(nèi)部時鐘,喚醒后再自動從內(nèi)部時鐘切換到外部時鐘,無需我們主動編程切換,但建議時鐘切換還是由開發(fā)者進行主動顯式切換,同時如果對喚醒時間要求不嚴(yán)格的話建議增加適當(dāng)?shù)难訒r來增加系統(tǒng)的穩(wěn)定性。
例1:晶振的起振需要一定的時間,倘若電源不穩(wěn)定或者阻抗不匹配,會需要更長的起振時間,在時鐘未穩(wěn)定情況下執(zhí)行程序會跑飛或者死機。 - 看門狗喂狗
在產(chǎn)品中看門狗是必不可少的功能,但是看門狗基本一旦打開就無法關(guān)閉,進入低功耗后如果沒有及時喂狗就會觸發(fā)復(fù)位。所以系統(tǒng)需要定時(建議50%~80%的看門狗超時時間)喚醒去喂狗,為了保持低功耗,可使用RTC或者LP Timer。芯片選型時也應(yīng)考慮是否有提供此類外設(shè),同時也要驗證打開RTC或者LP Timer后功耗是否還能滿足需求。 - 深究故障根因
在調(diào)試階段,我們經(jīng)??梢杂龅絾卫墓漠惓訖C,最后分析系器件損壞的問題。比如二極管擊穿,此時不能更換器件后就結(jié)束分析,硬件需要檢查是否是因為電路的余量設(shè)計不足使得器件容易損壞。甚者還會遇到芯片內(nèi)部損壞的情況,開發(fā)者須深究損壞的根因,是否是壞片流出,后續(xù)可增加什么措施避免該類壞片繼續(xù)流出。
調(diào)試方法
三分寫七分調(diào),debug是最漫長耗時的過程,特別是前期設(shè)計不足的話下更會遺留更多的問題。但是如果掌握了常用的方法論,那調(diào)試起來將會事半功倍。
注:下述提及的模塊既可以是軟件模塊,也可以是硬件模塊。
0. 調(diào)試原則
? 保護現(xiàn)場?,F(xiàn)場是十分重要的分析素材,特別是低概率和單例問題,一旦現(xiàn)場被破壞就很容易丟失分析方向。但是大部分情況下為了驗證分析思路又不得不破壞現(xiàn)場,此時我們一定要慎重地逐步破壞:環(huán)境破壞->狀態(tài)破壞->軟復(fù)位->硬復(fù)位->板級系統(tǒng)掉電->燒錄代碼->硬件破壞,破壞之前應(yīng)盡可能地分析全面,或者保留現(xiàn)場數(shù)據(jù),比如重新燒錄代碼之前,先download芯片的flash數(shù)據(jù)。
? 軟硬結(jié)合。功耗問題與硬件息息相關(guān),需積極和硬件配合排查,同時也敢于尋求硬件的幫助。
- 確認現(xiàn)場
首先,確認軟件版本和硬件版本是否有問題;
其次,確認概率:單例問題,少例問題,普遍問題?概率問題,必現(xiàn)問題?手法相關(guān)還是場景相關(guān)?回答這幾個問題,就可以先初步推測出大概率會是軟件問題還是硬件問題,提供大方向驗證思路;
接著確認復(fù)現(xiàn)手法,大如用什么設(shè)備,什么用例,小如步驟順序、速度、力度,都有可能是復(fù)現(xiàn)的影響因素;
最后要信任測試員,測試結(jié)果無效,那指導(dǎo)責(zé)任在于開發(fā)者,開發(fā)者就需要去糾正測試員的測試手法。同時保持對測試員所表述內(nèi)容的懷疑,因為他們表述是帶主觀的,可能存在偏差,不可盡信。 - 對齊復(fù)現(xiàn)手法
復(fù)現(xiàn)手法、設(shè)備盡量1比1復(fù)刻,必要時連測試員都可以用同一個??傊褪且匾暅y試手法,但是正如上述提到過不可盡信測試員表述,所以有時候適當(dāng)?shù)卣{(diào)整測試手法反而能復(fù)現(xiàn)到。 - 場景聯(lián)系法
主要用于明確復(fù)現(xiàn)場景的問題。由復(fù)現(xiàn)場景推測相關(guān)模塊,比如充過電后休眠功耗會異常,反之不會,那可以推測與充電管理模塊相關(guān)。然后就可以針對相關(guān)模塊進行重點排查和代碼review。 - 版本回退法
遇到必現(xiàn)或者穩(wěn)定復(fù)現(xiàn)的問題,可以嘗試回退版本復(fù)測,排查是否是代碼提交引入的問題,甚至可以回退到SDK版本,看是否是原始SDK就自帶的問題。這種方法雖然麻煩但有效,可以很好地幫助我們定位到那些看起來毫不相干的問題代碼提交。 - 交叉驗證法
又稱ABA驗證,主要用于分析單例或者少例問題,將一個正常樣機和異常樣機交換某個模塊,然后通過查看異常跟隨方向就能定位問題出在哪里。比如將一個功耗異常樣機A的主芯片和正常樣機B的交換,結(jié)果樣機A功耗回歸正常,樣機B功耗卻異常,這就可以定位到是主芯片有問題。同樣的,新樣機的版本回退加上舊樣機的版本升級,也是一種交叉驗證。 - 解耦排除法
主要可用于必現(xiàn)或者穩(wěn)定復(fù)現(xiàn)但是不確定哪個模塊有異常的問題,通過屏蔽或者移除某個模塊,查看功耗是否回歸正常,如果正常了,那就說明該模塊有問題。比如某功耗異常樣機,拆除觸控芯片或者屏蔽了觸控相關(guān)代碼后回歸正常,那說明觸控芯片或者觸控代碼有問題。 - 波形分析法
主要用于有功耗波形可分析的問題,通過分析波形特征來幫助定位。比如某樣機功耗偏高,分析出正常時的波形可分為三個階段,正常情況三個階段功耗依次降低,但是功耗異常時卻沒有第三階段波形,功耗一直維持與第二階段一致,所以可以定位問題出在這兩個階段的狀態(tài)切換過程。
附錄A-常用概念
注意:不同平臺定義可能有些許不同,此處僅幫助學(xué)習(xí)理解,具體問題應(yīng)當(dāng)具體分析。
以下幾種功耗模式(Power Modes)的功耗依次降低:
升壓模式(Boost Mode):提升輸出電壓或者工作頻率的模式;
運行模式(Active Mode):正常運行,內(nèi)核、外設(shè)全開;
睡眠模式(Sleep Mode):內(nèi)核停止、外設(shè)可用,即使睡眠也可快速響應(yīng)中斷;
深睡模式(Deep Sleep Mode):內(nèi)核和大部分外設(shè)停用,只可由部分外設(shè)(如RTC)喚醒,此模式RAM仍保持;
待機模式(Standby Mode):幾乎全關(guān)(包括RAM和寄存器),僅保留最少模塊,喚醒需要更長時間;
掉電模式(Shutdown Mode):所有模塊掉電,只能由復(fù)位類時間啟動;
船運模式(Ship Mode):該模式一般用于出廠運輸或者倉庫存放,和掉電模式很相似,都是最深的功耗模式,但船運模式一般是用于說明板級的功耗模式,不單是主芯片的,而是整個產(chǎn)品硬件板。
喚醒延遲(Wakeup Latency):從低功耗模式喚醒到正常運行所需時間,睡眠越深延遲越大。
時鐘(Clock):時鐘如同“心臟”,頻率越高,能耗越高。
時鐘樹(Clock Tree):系統(tǒng)中時鐘信號從主時鐘源(如晶振)逐級分配到各個子模塊或外設(shè)的結(jié)構(gòu),可以單獨調(diào)節(jié)和開關(guān)子模塊或外設(shè)的時鐘,在低功耗設(shè)計中非常關(guān)鍵。
電源軌(Power Rail):特定電壓等級的供電網(wǎng)絡(luò),可以為多個器件/模塊同時提供不同的電壓,以滿足不同器件/模塊的電壓要求。
LDO(線性穩(wěn)壓器):用于輸出一個穩(wěn)定電壓,常用于小電流應(yīng)用。
DC-DC(Buck/Boost):電壓轉(zhuǎn)換器,降壓或者升壓,常用于大電流應(yīng)用。
標(biāo)稱電壓(Nominal Voltage):電池在正常工作期間的平均電壓值,注意不是最大值或最小值。一般無用例要求的話測功耗就會選用標(biāo)稱電壓。
保護電壓(OVP/UVP):當(dāng)電池電壓高于或低于某個閾值時,為了保護電池安全和壽命,系統(tǒng)會觸發(fā)“過壓保護”或“欠壓保護”,停止充放電操作。為了避免過放,關(guān)機(休眠)電壓一定要高于欠壓保護電壓且預(yù)留一定的閾值。

浙公網(wǎng)安備 33010602011771號