怎樣延長(zhǎng)微控制器設(shè)備的電池壽命
除了低功耗模式及時(shí)鐘管理以外,想要使功耗最小化還應(yīng)在設(shè)計(jì)時(shí)考慮許多硬件和軟件方面的因素。從硬件角度來(lái)看,控制好MCU內(nèi)外的外設(shè)功耗能夠在很大程度上降低整體功耗。
禁止片上外設(shè)使用MCU控制寄存器是一個(gè)很直接的方法,但該方法的效果可能沒(méi)有直接禁用MCU外部外設(shè)那么明顯。使用通用的I/O引腳,可以控制外部電路的功耗。
里程表例子中是通過(guò)速度傳感器來(lái)測(cè)量車(chē)輪的速度。這可以通過(guò)將LED和光傳感器安裝于車(chē)架上,并將槽盤(pán)安裝于車(chē)輪中來(lái)實(shí)現(xiàn)。持續(xù)工作的LED和光傳感器將會(huì)消耗大量的電流。而使用I/O引腳,使LED和光傳感器只在進(jìn)行速度測(cè)量時(shí)工作,就將會(huì)大大降低電流。
當(dāng)前,分立元器件,如LED和光傳感器可以明顯地控制I/O,但僅限于能夠以類似模式控制的電路。如果這些器件需要的電流大于MCU能夠直接提供的電流,就可以使用緩沖器作為這些電路的電源開(kāi)關(guān)。在某些情況下,將幾個(gè)I/O腳并聯(lián)在一起就能夠提供足夠的電流。
速度傳感器同樣有另一方法可以降低電流。如果持續(xù)讀取光傳感器來(lái)檢查光線是否穿過(guò)槽盤(pán),那么MCU必須一直處于更高電流的工作模式。由于我 們所關(guān)心的僅僅是從亮到暗或從暗到亮的轉(zhuǎn)變點(diǎn),因此可以使用中斷來(lái)代替持續(xù)輪詢。中斷使MCU進(jìn)入一個(gè)低功耗的等待模式。MCU的計(jì)時(shí)器可以持續(xù)計(jì)數(shù),并 且通過(guò)使用與光傳感器輸出相連的一個(gè)輸入捕捉特性,我們很容易就能夠測(cè)出速度傳感器的亮/暗時(shí)間,進(jìn)而算出每分鐘轉(zhuǎn)速(RPM)。
如果配置不當(dāng)?shù)脑挘琈CU的I/O腳自身就會(huì)成為過(guò)載電流源。不用的引腳應(yīng)即時(shí)關(guān)閉,避免浮動(dòng)輸入造成一個(gè)大的電流路徑。在使用采取多種封裝形式的MCU時(shí),這一點(diǎn)常常會(huì)被忽略。
我們常常容易忘記最高引腳數(shù)版本的封裝中,可用引腳仍在較低引腳數(shù)版本的封裝硅片上。任何浮動(dòng)的輸入引腳都會(huì)阻礙過(guò)載電流源電流的流出,在 某些情況下阻礙作用會(huì)高許多倍,如溫度變化的情況下。在這些情況下,應(yīng)啟動(dòng)內(nèi)部上拉或者如果該引腳是I/O引腳,可將其配置成輸出引腳(如果該引腳驅(qū)動(dòng)的 是開(kāi)路,則與數(shù)據(jù)無(wú)關(guān))。
從軟件角度來(lái)看,有一些明顯的降低功耗的竅門(mén)。如前所述,保存能量的最佳方法就是盡可能長(zhǎng)時(shí)間地處于最低功耗狀態(tài)。
由于在工作狀態(tài)下,CPU活躍地執(zhí)行各種指令,永遠(yuǎn)不會(huì)處于最低功耗狀態(tài)中。因此,我們必須將CPU需要執(zhí)行的工作量最小化。這就應(yīng)該使CPU更快地完成其任務(wù),讓MCU迅速返回低功耗模式中。
這兒有一些降低CPU工作時(shí)間的技巧。盡量使用最短的數(shù)據(jù)類型。當(dāng)寫(xiě)入C代碼時(shí),我們很容易忘記一點(diǎn),即普通的整數(shù)常常被定義為16位或32位的數(shù)字,即使是在8位MCU的編譯器中亦是如此。
對(duì)于8位的器件,應(yīng)默認(rèn)使用8位字符類型,除非必須使用更長(zhǎng)的字節(jié)。即使字節(jié)長(zhǎng)度需要更長(zhǎng),同樣可以通過(guò)將16位或32位數(shù)字分解成幾個(gè)8位片段,只在數(shù)據(jù)處理最后階段才將其連接起來(lái)的方法就可以降低代碼長(zhǎng)度。
如果有額外的內(nèi)存來(lái)使用直接插入碼,就應(yīng)避免使用短循環(huán)或子程序調(diào)用。每個(gè)循環(huán)和子程序都會(huì)使用額外的CPU周期來(lái)確認(rèn)循環(huán)是否完成,或者是將程序計(jì)數(shù)器推入堆棧和彈出堆棧。
如果你知道一個(gè)短循環(huán)只會(huì)執(zhí)行四次,那么就在一行之內(nèi)寫(xiě)入四次相同的代碼,而避免使用for-next或while-loop循環(huán)語(yǔ)句。如果一個(gè)子程序只有10或20比特的代碼,考慮將其直接插入以取代使用子程序。在簡(jiǎn)單的任務(wù)中,這種方法將大大降低CPU負(fù)載。
在適當(dāng)?shù)臅r(shí)候?qū)?shù)值預(yù)先計(jì)算好?;氐轿覀兊淖孕熊?chē)?yán)锍瘫砝又校鶕?jù)主控制面板是與顯示器還是與速度傳感器進(jìn)行對(duì)話,假設(shè)RF鏈路分別采用兩種波特率。當(dāng)寫(xiě)入C代碼時(shí),將實(shí)際波特率代替串行接口所需的實(shí)際預(yù)算數(shù)值傳輸給串行接口設(shè)置程序可能更好。
畢竟這會(huì)使代碼的可讀性更強(qiáng)些。但是,這同樣也導(dǎo)致串行接口程序不得不在波特率每次發(fā)生改變時(shí)都根據(jù)新的波特率計(jì)算出預(yù)算數(shù)值。將預(yù)算數(shù)值預(yù)先算好并傳輸給串行設(shè)置程序?qū)?huì)減少CPU周期和代碼長(zhǎng)度。
要考慮使用查表方法取代復(fù)雜的計(jì)算。如飛思卡爾公司HCS08家族的MCU就擁有非常有效的訪問(wèn)表格數(shù)據(jù)的指令和尋址模式。根據(jù)計(jì)算的復(fù)雜 性,該方法能夠節(jié)省一些CPU的計(jì)算。如果計(jì)算仍不可避免,那么就應(yīng)在程序開(kāi)始之前確保盡早退出計(jì)算。 簡(jiǎn)單的例子是通過(guò)“1”或“0”搜索乘法運(yùn)算。
本文小結(jié)
當(dāng)今的多功能微控制器能夠?yàn)?a class="contentlabel" href="http://butianyuan.cn/news/listbylabel/label/電池">電池供電應(yīng)用的設(shè)計(jì)工程師提供許多延長(zhǎng)此類設(shè)備電池壽命的方法。多種低功耗模式和靈活的時(shí)鐘源讓設(shè)計(jì)工程師能夠 對(duì)節(jié)能和所需的性能進(jìn)行管理,以實(shí)現(xiàn)設(shè)計(jì)目標(biāo)。當(dāng)CPU要求高時(shí)進(jìn)行高速運(yùn)作,反之則進(jìn)行低速運(yùn)作。要在任何可能的時(shí)候轉(zhuǎn)入低功耗模式。
除了對(duì)MCU自身功耗進(jìn)行管理之外,通過(guò)深謀遠(yuǎn)慮的系統(tǒng)規(guī)劃可使MCU管理整個(gè)系統(tǒng)的功耗。MCU能夠在需要時(shí)使系統(tǒng)內(nèi)的設(shè)備和電路開(kāi)始運(yùn)作或停止運(yùn)作,幾乎如同MCU管理其片上外設(shè)一樣簡(jiǎn)單。
不可忽視的是,軟件工程師們可以通過(guò)建立CPU周期意識(shí)來(lái)延長(zhǎng)電池使用壽命。CPU所執(zhí)行的指令越少,MCU就能夠越快地進(jìn)入低功耗模式。 創(chuàng)造許多簡(jiǎn)單的函數(shù)可以縮短代碼長(zhǎng)度,但是卻斷送了縮短電池壽命的努力。另一方面,盡可能使用最短的數(shù)據(jù)類型會(huì)在縮短代碼長(zhǎng)度的同時(shí)延長(zhǎng)電池壽命。
因此,下次選用電池供電系統(tǒng)設(shè)計(jì)時(shí),別忘了對(duì)您的MCU做出明智的選擇,同時(shí)使用MCU能夠提供的所有功能來(lái)管理整個(gè)系統(tǒng)的功耗。
評(píng)論