電池供電設備,不管是電動(dòng)牙刷、剃須刀、手機、個(gè)人數字助理(PDA)、MP3播放器,還是手無(wú)法夠到的遙控設備,都成為人們日常生活的一部分。因此,電源管理對當今的嵌入式設計工程師來(lái)說(shuō)是一件相當重要的的事。普遍存在的微控制器在許多設備的應用中為設計工程師提供了大量管理電源要求的方法。不同種類(lèi)的MCU自身就擁有一系列節省電流消耗及許多節能特性。但是,在基于微控制器的設計中,對電源的管理不僅僅是選擇一個(gè)正確的微控制器這么簡(jiǎn)單。 電源管理同樣也需要最有效地使用MCU自身的降低電流消耗及節能特性的發(fā)展策略。在系統層面上,即使你所選擇的MCU是獨立的,同樣能夠使用許多策略來(lái)進(jìn)一步延長(cháng)您的應用設備的電池壽命。 應用實(shí)例:無(wú)線(xiàn)自行車(chē)里程表 接下來(lái),我們將以無(wú)線(xiàn)自行車(chē)里程表為例,來(lái)展示有效的電源管理。該里程表由三部分模塊組成:一個(gè)位于車(chē)把上的控制面板,一個(gè)位于車(chē)輪中的速度傳感器及一個(gè)位于騎車(chē)者頭盔上的顯示器。 速度傳感器將自行車(chē)的轉速反饋給控制面板,控制面板則計算諸如:行車(chē)速度、行車(chē)里程、行車(chē)時(shí)間及能量消耗此類(lèi)信息,并將計算好的信息傳達給顯示器。下方圖1為一個(gè)自行車(chē)里程表控制面板的方框圖。
MCU幾何形狀趨小型化,以減小芯片面積,這會(huì )導致晶體管無(wú)法承受3V或3V以上電壓的直接作用。因此,就要在內部邏輯中使用電壓調整器來(lái)降低電壓。 遺憾的是,這些電壓調整器會(huì )加大MCU的電流消耗。但是,由于功率大小等于電壓乘以電流,因此一個(gè)帶有調整器的1.8V至3V的系統功耗仍比一個(gè)不帶調整器的5V的系統功耗要低。 MCU很強地依賴(lài)于電源管理模式,在降低整體的工作電流的同時(shí)仍能支持調節電源和加快時(shí)鐘速度。新型MCU能夠提供許多低功耗模式來(lái)滿(mǎn)足這些要求,同時(shí)保持系統靈活性。飛思卡爾公司的MC9S08GB60 MCU有四種低功耗模式:深度停止狀態(tài)(stop1)、中度停止狀態(tài)(stop2)、輕度停止狀態(tài)(stop3)和等待模式。 在等待模式下,通過(guò)關(guān)閉CPU時(shí)鐘來(lái)降低功耗,但是系統時(shí)鐘由其它MCU外設來(lái)支持工作,如:模-數(A-D)轉換器、計時(shí)器或串行通信模塊。該模式在外設需要工作的情況下用于降低功耗是相當有效的,但是CPU在外設完成任務(wù)之前不能工作。 在我們的例子中,等待模式在串行外設接口(SPI)用于與射頻(RF)收發(fā)器通信情況下使用。 要想更進(jìn)一步降低功耗,可使用三種停止模式。Stop1、Stop2、Stop3分別提供不同級別的降低功耗操作。 Stop3是三種停止模式中功能性最強的一個(gè)。在Stop3模式下,片上電壓調整器處于省電模式,但仍能提供最低限度的調節來(lái)保留隨機存儲器(RAM)和輸入/輸出(I/O)寄存器的內容。幾個(gè)中斷源和復位能夠將MCU從Stop3模式下喚醒。Stop3 是三種停止模式中唯一一個(gè)低電壓抑制(LVI)模塊和晶振仍能工作的模式。 在我們的例子中,在從速度傳感器讀取速度值之間的一段時(shí)間里,MCU處于等待狀態(tài),此時(shí)可使用Stop3模式。Stop3模式下工作的實(shí)時(shí)接口(RTI)功能可用于及時(shí)喚醒MCU以進(jìn)行下次讀取。 Stop2的功能性較之Stop3要弱些,但其功耗更低。在Stop2模式下,電壓調整器處于節電(powered down)狀態(tài)。但是,RAM內容仍然保存著(zhù)。I/O寄存器也處于節電狀態(tài),并且當它從停止模式被喚醒時(shí)需要進(jìn)行重新配置。在Stop2中,能夠喚醒MCU的中斷源更少,但是仍具有RTI功能;氐轿覀兊睦又衼(lái)看,Stop2可取代Stop3來(lái)更進(jìn)一步降低功耗。由于該模式下RTI功能和RAM仍在工作,所以速度讀取之間的時(shí)間仍可被測得。 Stop1是MCU中功耗最低的模式。在該模式下,電壓調整器及所有外設、CPU、RAM和I/O都完全進(jìn)入節電狀態(tài)。只有復位和IRQ中斷腳能夠喚醒MCU。當MCU能夠進(jìn)入節電狀態(tài),但在外部激勵下,如按下按鈕的情況下仍需做出反應時(shí)可用Stop1模式。 在自行車(chē)里程表這個(gè)例子中,當里程表處于節電狀態(tài)時(shí)可進(jìn)入Stop1模式。節電狀態(tài)下的Stop1模式是MCU中可能存在的功耗最小的模式,而不需從芯片上切斷電源。為什么不從芯片上將電源徹底切斷呢?因為從芯片上切斷電源需要使用一個(gè)更為昂貴的撥動(dòng)開(kāi)關(guān)。 同樣的,MCU可使用一個(gè)與中斷腳相連的按鈕開(kāi)關(guān)來(lái)實(shí)現許多不同的作用。這些不同的作用取決于系統當前的狀態(tài)。因此,Stop1模式能夠保持設計簡(jiǎn)單、成本低廉、并且幾乎不消耗電流,堪稱(chēng)完美。 時(shí)鐘管理 許多設計師將低功耗與低時(shí)鐘頻率等同起來(lái)。而事實(shí)上,根據MCU正在進(jìn)行的不同操作及MCU可使用何種低功耗模式,以最高的速度工作事實(shí)上能夠降低功耗。 如果MCU擁有一個(gè)有效的低功耗模式,那么使它最長(cháng)時(shí)間地處于該模式下能夠最大限度地降低功耗。因此,如果CPU在返回睡眠模式之前需要執行代碼,那么以可能的最高速度完成代碼執行,然后返回低功耗模式比持續以低速度工作消耗的電流少。 讓我們再來(lái)看看自行車(chē)里程表這個(gè)例子,假設控制面板每秒鐘更新速度一次,并且需要循環(huán)16,000個(gè)總線(xiàn)周期來(lái)計算數據并在顯示器上顯示出來(lái)。由典型的32kHz晶體工作,并且假設有一個(gè)普通的一分為二的總線(xiàn)時(shí)鐘,我們就能夠擁有16KHz的總線(xiàn),在這種情況下,需要使用整整一秒鐘來(lái)完成計算。 現在,如果我們可以使用8MHz的總線(xiàn)時(shí)鐘,就可以?xún)H花費2毫秒來(lái)完成計算,剩余的998毫秒可處于低功耗模式下。 當然,并非MCU須執行的每項任務(wù)都會(huì )得益于高速性能。在我們的例子中,如果數據速度相當的慢,無(wú)線(xiàn)通信所需的時(shí)間可能不需要8MHz的總線(xiàn)速率。因此,在這種情況下,要想將功耗最小化,我們就應該盡可能慢地運行MCU,直至無(wú)線(xiàn)通信結束。 因此,我們需要一個(gè)時(shí)鐘靈活的MCU,如飛思卡爾公司的MC9S08GB60 MCU。擁有該設備,您可以使用高頻晶體、低頻晶體或內部振蕩器。 擁有任一此類(lèi)時(shí)鐘源,就可以隨意地使用片上頻率鎖定環(huán)(FLL)使總線(xiàn)速度成倍地升高或降低,來(lái)滿(mǎn)足任務(wù)需求并且使功耗達到最小化。圖2為自行車(chē)里程表例子中不同操作模式下功耗的改變情況。 除了低功耗模式及時(shí)鐘管理以外,想要使功耗最小化還應在設計時(shí)考慮許多硬件和軟件方面的因素。從硬件角度來(lái)看,控制好MCU內外的外設功耗能夠在很大程度上降低整體功耗。 禁止片上外設使用MCU控制寄存器是一個(gè)很直接的方法,但該方法的效果可能沒(méi)有直接禁用MCU外部外設那么明顯。使用通用的I/O引腳,可以控制外部電路的功耗。 里程表例子中是通過(guò)速度傳感器來(lái)測量車(chē)輪的速度。這可以通過(guò)將LED和光傳感器安裝于車(chē)架上,并將槽盤(pán)安裝于車(chē)輪中來(lái)實(shí)現。持續工作的LED和光傳感器將會(huì )消耗大量的電流。而使用I/O引腳,使LED和光傳感器只在進(jìn)行速度測量時(shí)工作,就將會(huì )大大降低電流。 當前,分立元器件,如LED和光傳感器可以明顯地控制I/O,但僅限于能夠以類(lèi)似模式控制的電路。如果這些器件需要的電流大于MCU能夠直接提供的電流,就可以使用緩沖器作為這些電路的電源開(kāi)關(guān)。在某些情況下,將幾個(gè)I/O腳并聯(lián)在一起就能夠提供足夠的電流。 速度傳感器同樣有另一方法可以降低電流。如果持續讀取光傳感器來(lái)檢查光線(xiàn)是否穿過(guò)槽盤(pán),那么MCU必須一直處于更高電流的工作模式。由于我們所關(guān)心的僅僅是從亮到暗或從暗到亮的轉變點(diǎn),因此可以使用中斷來(lái)代替持續輪詢(xún)。中斷使MCU進(jìn)入一個(gè)低功耗的等待模式。MCU的計時(shí)器可以持續計數,并且通過(guò)使用與光傳感器輸出相連的一個(gè)輸入捕捉特性,我們很容易就能夠測出速度傳感器的亮/暗時(shí)間,進(jìn)而算出每分鐘轉速(RPM)。 如果配置不當的話(huà),MCU的I/O腳自身就會(huì )成為過(guò)載電流源。不用的引腳應即時(shí)關(guān)閉,避免浮動(dòng)輸入造成一個(gè)大的電流路徑。在使用采取多種封裝形式的MCU時(shí),這一點(diǎn)常常會(huì )被忽略。 我們常常容易忘記最高引腳數版本的封裝中,可用引腳仍在較低引腳數版本的封裝硅片上。任何浮動(dòng)的輸入引腳都會(huì )阻礙過(guò)載電流源電流的流出,在某些情況下阻礙作用會(huì )高許多倍,如溫度變化的情況下。在這些情況下,應啟動(dòng)內部上拉或者如果該引腳是I/O引腳,可將其配置成輸出引腳(如果該引腳驅動(dòng)的是開(kāi)路,則與數據無(wú)關(guān))。 延長(cháng)壽命的系統軟件策略 從軟件角度來(lái)看,有一些明顯的降低功耗的竅門(mén)。如前所述,保存能量的最佳方法就是盡可能長(cháng)時(shí)間地處于最低功耗狀態(tài)。 由于在工作狀態(tài)下,CPU活躍地執行各種指令,永遠不會(huì )處于最低功耗狀態(tài)中。因此,我們必須將CPU需要執行的工作量最小化。這就應該使CPU更快地完成其任務(wù),讓MCU迅速返回低功耗模式中。 這兒有一些降低CPU工作時(shí)間的技巧。盡量使用最短的數據類(lèi)型。當寫(xiě)入C代碼時(shí),我們很容易忘記一點(diǎn),即普通的整數常常被定義為16位或32位的數字,即使是在8位MCU的編譯器中亦是如此。 對于8位的器件,應默認使用8位字符類(lèi)型,除非必須使用更長(cháng)的字節。即使字節長(cháng)度需要更長(cháng),同樣可以通過(guò)將16位或32位數字分解成幾個(gè)8位片段,只在數據處理最后階段才將其連接起來(lái)的方法就可以降低代碼長(cháng)度。 如果有額外的內存來(lái)使用直接插入碼,就應避免使用短循環(huán)或子程序調用。每個(gè)循環(huán)和子程序都會(huì )使用額外的CPU周期來(lái)確認循環(huán)是否完成,或者是將程序計數器推入堆棧和彈出堆棧。 如果你知道一個(gè)短循環(huán)只會(huì )執行四次,那么就在一行之內寫(xiě)入四次相同的代碼,而避免使用for-next或while-loop循環(huán)語(yǔ)句。如果一個(gè)子程序只有10或20比特的代碼,考慮將其直接插入以取代使用子程序。在簡(jiǎn)單的任務(wù)中,這種方法將大大降低CPU負載。 在適當的時(shí)候將數值預先計算好;氐轿覀兊淖孕熊(chē)里程表例子中,根據主控制面板是與顯示器還是與速度傳感器進(jìn)行對話(huà),假設RF鏈路分別采用兩種波特率。當寫(xiě)入C代碼時(shí),將實(shí)際波特率代替串行接口所需的實(shí)際預算數值傳輸給串行接口設置程序可能更好。 畢竟這會(huì )使代碼的可讀性更強些。但是,這同樣也導致串行接口程序不得不在波特率每次發(fā)生改變時(shí)都根據新的波特率計算出預算數值。將預算數值預先算好并傳輸給串行設置程序將會(huì )減少CPU周期和代碼長(cháng)度。 要考慮使用查表方法取代復雜的計算。如飛思卡爾公司HCS08家族的MCU就擁有非常有效的訪(fǎng)問(wèn)表格數據的指令和尋址模式。根據計算的復雜性,該方法能夠節省一些CPU的計算。如果計算仍不可避免,那么就應在程序開(kāi)始之前確保盡早退出計算。 簡(jiǎn)單的例子是通過(guò)“1”或“0”搜索乘法運算。 本文小結 當今的多功能微控制器能夠為電池供電應用的設計工程師提供許多延長(cháng)此類(lèi)設備電池壽命的方法。多種低功耗模式和靈活的時(shí)鐘源讓設計工程師能夠對節能和所需的性能進(jìn)行管理,以實(shí)現設計目標。當CPU要求高時(shí)進(jìn)行高速運作,反之則進(jìn)行低速運作。要在任何可能的時(shí)候轉入低功耗模式。 除了對MCU自身功耗進(jìn)行管理之外,通過(guò)深謀遠慮的系統規劃可使MCU管理整個(gè)系統的功耗。MCU能夠在需要時(shí)使系統內的設備和電路開(kāi)始運作或停止運作,幾乎如同MCU管理其片上外設一樣簡(jiǎn)單。 不可忽視的是,軟件工程師們可以通過(guò)建立CPU周期意識來(lái)延長(cháng)電池使用壽命。CPU所執行的指令越少,MCU就能夠越快地進(jìn)入低功耗模式。創(chuàng )造許多簡(jiǎn)單的函數可以縮短代碼長(cháng)度,但是卻斷送了縮短電池壽命的努力。另一方面,盡可能使用最短的數據類(lèi)型會(huì )在縮短代碼長(cháng)度的同時(shí)延長(cháng)電池壽命。 因此,下次選用電池供電系統設計時(shí),別忘了對您的MCU做出明智的選擇,同時(shí)使用MCU能夠提供的所有功能來(lái)管理整個(gè)系統的功耗。 |