怎样把LoRa模块功耗降到极致
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 怎樣把LoRa模塊功耗降到極致
一.?? 引言
能耗對于電池供電的產(chǎn)品來說是一個重大的問題,一旦電能耗盡設(shè)備將“罷工”,在某些場合電能意味著電子產(chǎn)品的生命。物聯(lián)網(wǎng)時代將會有越來越多電池供電的設(shè)備通過無線通信連接,降低能耗再次擺在工程師的桌面上 ---- 解決它!
銳米 LoRaWAN?模塊(簡稱模塊) RNDU470LAS (http://www.rimelink.com/pd.jsp?id=22#_pp=2_306) 不但具備空曠環(huán)境傳輸 6km 以上的超長距離優(yōu)勢,還將休眠能耗降低到極致(0.4uA,帶RTC為1.4uA)。這是怎么做到的呢?接下來,一步一步解密。
?
二.?? 硬件設(shè)計
1.???選用低功耗器件
模塊 MCU 選用 STM8L151C8T6,它屬于超低功耗,不帶RTC休眠為 400nA,帶 RTC 下休眠為 1.4uA。該 MCU 擁有較大的RAM(4KB) 和自帶 EEPROM(2KB),不用擴展外部存儲設(shè)備,進一步降低功耗和成本。
終端射頻芯片選用 SX1278,在休眠模式下,該芯片功耗低至忽略不計。
2.???盡可能快地讓射頻模塊休眠
SX1278屬于LoRa TM擴頻調(diào)制技術(shù),它的遠距離優(yōu)勢得益于調(diào)制增益,不是靠增大發(fā)射功率(那將消耗更多電能)。該射頻芯片的電流消耗如下:休眠<0.2uA,空閑=1.6mA,接收=12mA,發(fā)射(最大功率)=120mA.
終端MCU通過“中斷+定時器超時”方式控制SX1278,一旦射頻完成發(fā)送或接收,立即進入休眠模式。
3.???了解MCU的工作模式與功耗
降低MCU的功耗首先盡可能少地開啟外設(shè),其次盡可能地讓其休眠。我們一起看看STM8L151C8T6不同工作模式下功耗。更多信息請鏈接?http://blog.csdn.net/jiangjunjie_2005/article/details/47700597
| 模式 | 等待 | 低功耗運行 | 低功耗等待 | 主動停止 | 停止 | |
| 入口 | WFI | WFE | 軟件代碼 | 軟件代碼+WFE | HALT | HALT |
| 晶振 | 開 | 開 | LSI或LSE | LSI或LSE | LSI或LSE | 關(guān) |
| CPU | 關(guān) | 關(guān) | 開 | 關(guān) | 關(guān) | 關(guān) |
| 外設(shè) | 開 | 開 | 開 | 開 | 關(guān),僅RTC開 | 關(guān) |
| 喚醒 | 所有內(nèi)部和外部中斷,復(fù)位 | 所有內(nèi)部和外部中斷,復(fù)位,喚醒事件 | 軟件代碼,復(fù)位 | 內(nèi)部和外部事件,復(fù)位 | 外部中斷,RTC中斷,復(fù)位 | 外部中斷,復(fù)位 |
| 電壓調(diào)節(jié)器 | MVR | MVR | ULP | ULP | CLK_ICKCR | ULP |
| 程序執(zhí)行區(qū) | FLASH | FLASH | RAM | RAM | FLASH | FLASH |
| FLASH+E2 | 開 | 開 | 關(guān) | 關(guān) | 關(guān) | 關(guān) |
| 中斷 | 允許 | 允許 | 禁止 | 禁止 | 允許 | 允許 |
| 中斷服務(wù)后 返回狀態(tài) | AL=0:main AL=1:WFI | WFE | / | / | AL=0:main AL=1主動停止 | AL=0:main AL=1:停止 |
| 事件處理后 返回狀態(tài) | / | Main | / | 低功耗運行 | / | / |
| RAM+寄存器 | 保留 | 保留 | 保留 | 保留 | 保留 | 保留 |
| @3V/25℃ | 5.9uA | 5.4uA | 3.3uA | 1.4uA | 0.4uA | |
| 特殊事項 | / | / | 禁止ADC | / | 清除外設(shè)懸掛中斷標志位 | |
上述低功耗運行模式對于開發(fā)者來說有點多,尤其剛接觸STM8L處理器。我們需要一般性的指導(dǎo)原則,下表2是來源于實踐的經(jīng)驗。
| 節(jié)能要求 | 應(yīng)用場合 | 睡眠時長 | 喚醒方式 | 恢復(fù)時長 | 運行模式 |
| 苛刻 | CPU空閑,等待外部信號喚醒 | 長 | 外部中斷 | ≥2.8us | HALT |
| 苛刻 | CPU空閑,等待時鐘周期喚醒 | 長 | RTC周期 | ≥2.8us | Active-halt |
| 嚴格 | CPU有持續(xù)、微負荷任務(wù)運行 | / | / | ≥2.8us | 低功耗運行 |
| 嚴格 | CPU短暫等待中斷發(fā)生 | 短 | 任意中斷 | 短 | 等待中斷 |
| 嚴格 | CPU短暫等待事件發(fā)生 | 短 | 注冊事件 | 短 | 等待事件 |
| 需要 | CPU有持續(xù)、輕負荷任務(wù)運行 | / | / | / | 調(diào)整主頻 |
4.???靜態(tài)配置MCU引腳
即使MCU和RF都進入休眠模式,如果沒有設(shè)置好MCU引腳,它們照樣會“偷偷”地消耗電能。以STM8L151C8T6為例,它一共有48個引腳,首先需要用Excel對其進行分類,如下例所示:
| 序號 | 引腳 | 功能 | 上電初始化 | 進入低功耗 |
| 1 | PA0 | 仿真口 | Output push-pull, high level, 2MHz | / |
| 3 | PA2 | NC | Output push-pull, low level, 2MHz | / |
| 5 | PA4 | CON1 | Output push-pull, high level, 2MHz | Input pull-up |
| 6 | PA5 | CON2 | Input floating, external interrupt | / |
| 9 | GND | / | / | / |
一般說來可以將引腳分成5類,可以借鑒“地鐵顏色區(qū)別”方法,設(shè)計如下圖例:
| 圖例 | 特性 | 低功耗配置模式 |
|
| MCU輸入:輸入,浮動 | Input floating, no external interrupt |
|
| MCU輸出:輸入,上拉 | Input pull-up, no external interrupt |
|
| 3.3V引腳:輸出,上拉,高電平 | Output push-pull, high level, 2MHz |
|
| 未接引腳:輸出,上拉,低電平 | Output push-pull, low level,2MHz |
|
| MCU電源與地引腳 | / |
三. 軟件設(shè)計
1.???動態(tài)切換MCU引腳
有2類MCU引腳:MCU輸出和MCU輸入,它們需要動態(tài)進行配置。具體地說,在進入低功耗模式時,將其分別配置成:輸入上拉和輸入懸浮;在退出低功耗模式時,將其配置成定義的功能狀態(tài)。在動態(tài)切換時需要考慮2點:
首先,動態(tài)切換引腳是需要時間的,以STM8L151C8T6為例,動態(tài)切換5個引腳需要477us,可見它一般用于休眠這種較長周期的節(jié)能模式,不適合空閑停止這種短暫節(jié)能模式。
其次,在實際開發(fā)中引腳的連接是變化的,換句話說,今天這個引腳是空閑,下次產(chǎn)品升級該引腳可能設(shè)計成特定功能。為減少軟件維護成本,需要設(shè)計一種優(yōu)秀的數(shù)據(jù)結(jié)構(gòu),它能描述MCU所有引腳,如果引腳功能改變,只需要修改數(shù)據(jù)定義,而不需要修改程序。
2.???一旦無事可干,MCU立即停止或休眠
在LoRa終端系統(tǒng)中MCU是能源的持續(xù)消耗者,軟件設(shè)計需要考慮盡可能快地讓MCU節(jié)能,STM8L151C8T6有如下2種節(jié)能模式。
短暫等待:如等待RF發(fā)送數(shù)據(jù)幀完畢,MCU執(zhí)行WFI指令,一旦RF完成發(fā)送,中斷將MCU喚醒繼續(xù)運行;
長期等待:如等待下一次主動上報數(shù)據(jù)幀,MCU執(zhí)行HALT指令,當指定時間到達時,RTC中斷將MCU喚醒繼續(xù)運行。
3.???采用高效率算法
軟件算法效率越高,MCU計算時間更少,可以更快進入低功耗,也就更節(jié)能。在終端設(shè)計中有2個算法比較消耗時間:
CRC16:無線傳輸易受干擾,一般通信幀需要添加CRC16檢測正確性,我們采用查表的方法減少CRC16的計算時間。下載源代碼請鏈接:
http://www.rimelink.com/nd.jsp?id=33&_np=105_315
計算空中傳輸時間:該時間對于組網(wǎng)算法十分重要,它包含較多的浮點運算。所幸的是,大部分數(shù)據(jù)幀長度是固定的,可以提前計算好;對于變化長度的數(shù)據(jù)幀,可以采用“命中算法”來提高效率,即保存本次長度與時間的值,如果下次長度相同直接返回該時間值。下載源代碼請鏈接:
http://www.rimelink.com/nd.jsp?id=33&_np=105_315
?
4.???Contiki操作系統(tǒng)下進程低功耗設(shè)計
終端支持 LoRaWAN 算法,內(nèi)嵌多種無線通信健壯性技術(shù),智能解決:通信碰撞、微弱信號、外界干擾、斷網(wǎng)繼連等挑戰(zhàn)。這樣一來,必然帶來軟件復(fù)雜度。
使用成熟穩(wěn)定的已有軟件庫是人們解決軟件復(fù)雜度的有效方法,因此,我們引入高效強大的Contiki物聯(lián)網(wǎng)操作系統(tǒng)。
?這樣一來,終端系統(tǒng)低功耗設(shè)計需要兼顧:MCU運行模式、外設(shè)中斷、ContikiOS和進程。
上圖展示了系統(tǒng)低功耗設(shè)計的時序邏輯。我們看到一個基本的思想:當所有的進程“同意休眠”,空閑時ContikiOS執(zhí)行HALT命令使MCU進入休眠狀態(tài);當RTC或EXT中斷喚醒MCU時,對應(yīng)的進程處理該邏輯,完成后“同意休眠”。
這種設(shè)計保證了系統(tǒng)只有一個HALT入口,同時復(fù)雜的邏輯交給不同的進程處理,降低了設(shè)計的復(fù)雜度。
為檢測是否“所有進程同意休眠”,我們設(shè)計了如下圖的數(shù)據(jù)結(jié)構(gòu):
數(shù)據(jù)AgrHalt的位寬與進程數(shù)目綁定,因此使用typedef定義該數(shù)據(jù)類型。
當AgrHalt==0時,說明“所有進程同意休眠”,一旦ContikiOS進入空閑狀態(tài),它將調(diào)用HALT()命令,使MCU進入Active-HALT狀態(tài);
當AgrHalt != 0時,說明“某進程還有活要干”,此時ContikiOS進入空閑狀態(tài)后,它調(diào)用WFI()命令,使MCU進入WFI狀態(tài)。
?
5.? ?產(chǎn)品超低功耗實測
下圖是銳米 LoRaWAN?節(jié)點休眠功耗的實測,請參考《ArduinoLoRa 休眠極限 1.4uA》??https://blog.csdn.net/jiangjunjie_2005/article/details/103685860
?
總結(jié)
以上是生活随笔為你收集整理的怎样把LoRa模块功耗降到极致的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IOS 多线程 常驻线程,并发,内存问题
- 下一篇: 《自然语言处理(哈工大 关毅 64集视频