吳清榮,丁躍軍
(河南工業技師學院, 鄭州 450007)
目前,電子產品的日趨小型化和智能化,對單片機的低功耗應用提出了更高的要求,尤其是便攜式產品、野外檢測儀器儀表、海河航標燈和玩具產品,對低功耗的要求更為突出。設計一個性能良好的低功耗產品,需要從硬件設計、軟件設計等多方面綜合考慮,是一項較為復雜的系統工作,本文闡述了低功耗設計的幾種具體措施。
PIC系列單片機雖然功耗都很低,但不同的模塊電能消耗仍然不同,既便是在同一個系列里,選擇的芯片型號不同,它們的電能消耗量也不同! 選型時,要注意資料中詳細的參數說明,一般型號后綴為LC的芯片能耗比后綴為C的能耗要小,目前,Microahip公司最新推出了18個引腳的低功耗芯片,如PIC18F1220、PIC18F1320和nW級的芯片如PIC16F627A等,可以根據產品的實際需求,合理地來選擇芯片的型號。
一般單片機睡眠模式下運行要比正常模式下運行耗電小得多,所以如果其它條件允許,應盡量讓芯片處于睡眠狀態;單片機在低電壓下工作時比較省電,在選用單片機時盡可能選擇較低的工作電壓;另外,單片機MCU的電流和振蕩頻率成正比,所以,在速度允許的情況下,應盡可能選擇振蕩頻率比較低的芯片。
晶體振蕩器、諧振器和RC振蕩器,有著不同的喚醒時間。一般來說,晶體振蕩器的喚醒時間最長為8.5mS左右,諧振器的喚醒時間約為390μS,而RC振蕩器的喚醒時間最短,約為1.15μS左右。單片機在工作時,如果喚醒時間過長,在喚醒過程中存在一個預工作階段,此時處理器已經開始消耗電能,但是還沒有運行程序,這就會帶來更多的電能消耗。如果所設計的產品,喚醒后的工作時間很短,一般應采用RC振蕩器較為合理。
晶體振蕩器、諧振器和RC振蕩器,有著不同的電耗,即使在相同頻率下,它們的電耗也不同。一般說來,晶體振蕩器的工作電耗最小,RC振蕩的工作電耗最大。三者比較結果如表1所示。

表1 晶體振蕩器、諧振器和RC振蕩器的比較
在不能長期工作在休眠狀態的場合,如計時時鐘,一般應采用晶體振蕩器以獲得節能效果。為了節能我們有時候還在晶體振蕩器的回路中串上一個小電阻RS,如圖1所示,這是因為晶體的驅動功率為: P= U2/Re,U:芯片向晶體提供的電壓;Re:晶體的等效電阻;在晶體振蕩器回路中串上一個小電阻RS后,加大晶體的等效電阻。這樣,不僅可以減少在晶體上的功率消耗、還可以防止晶體過驅動、穩定晶體的振蕩頻率以及延長晶體壽命。RS的取值范圍是0~10KΩ,主要基于Timer1振蕩器,所有內建Timer1芯片都可以用外部晶體來實現RTC。如:PIC16F72、PIC16F73、PIC16F877、PIC18F452和PIC18F85等。

圖1 晶體振蕩器
I/O 管腳的處理,在低功耗系統里非常重要。設置為輸出的管腳可以驅動20~25mA電流。所以檢查你的設計,優化每個輸出管腳上的電流消耗是非常重要的,即使是弱上拉的管腳,依然可以輸出 400uA電流,為達到節能目的,可以禁止內部上拉,使用外部較大的電阻做上拉。必要時還可以用一個I/O口來控制外部上拉,以便在不需要檢測輸入時或在休眠狀態下進一步節能。如圖二中的輸入口I1、I2和I3的外部電路。I/O口管腳可以吸收1uA電流,而MCLR,RA4/T0CKI和OSC1可能吸收5uA電流。在干擾的環境下,讓I/O管腳懸空(輸入、高阻),可能因內部鎖存器頻繁翻轉,極大地增加電流消耗,所以對于沒有用的管腳,都設置為輸出(高或者低均可)。
在需要實時時鐘的場合,在Timer1上接入一個32.768kHz 晶振,就可以實現成本低和電耗低。Timer1可以在不用外部時鐘芯片、允許芯片進入睡眠模式下,繼續走時鐘(時間/日期)。
執行一條SLEEP指令后,便進入了休眠(SLEEP)方式。在這種方式中,為了使耗電量降至最低,把所有I/O引腳接至VDD或VSS,以確保沒有外部電路從I/O引腳上引出電流,關閉A/D轉換,禁止使用外部時鐘,引腳必須處于一個邏輯高電平狀態。
單片機從耗電的角度出發常常會進入休眠狀態,但由于某個特殊的原因,又會及時從休眠狀態中喚醒。
1)如果芯片出現以下事件,單片機便可以從休眠狀態進入喚醒狀態:
(1)將外部的復位信號輸入到引腳 ;
(2)監視定時器激活(如果WDT使能);
(3)來自引腳INT的中斷,RB端口的電平變位,或者其他一些外圍設備中斷。
當休眠狀態被喚醒,設置成電源開啟標志位被清零。如果WDT發生了定時時間到而引起喚醒狀態, 位被清零。
2)如果以下外圍設備出現中斷請求,也可使單片機從休眠狀態中喚醒:
(1)并行從動端口讀/寫操作;
(2)在異步計數方式下,定時器TMR1中斷;
(3)CCP捕捉方式中斷;
(4)特殊事件觸發在異步方式下,定時器1采用外部時鐘;
(5)SSP(起始/停止)位探測中斷;
(6)在從動方式下,SSP發送或接收中斷(SPI/I2C);
(7)USAR的RX/TX(同步從動方式);
(8)當A/D時鐘源為RC時,A/D轉換中斷;(9)EEPROM寫入操作完成。
當執行SLEEP指令時,下一個指令(PC+1)被預先取出。為了使器件能通過某一中斷事件而激活,與之對應的中斷允許位必須被置位。喚醒狀態與GIE位的狀態無關,如果GIE位被清零,器件將繼續執行SLEEP指令后面的指令;如果GIE位被置位,器件將執行SLEEP指令后面的指令,然后轉移到中斷地址(0004H)。若用戶不希望執行SLEEP指令后面的指令,那么在SLEEP指令后面必須要有一個NOP指令。
設計一個低功耗系統產品,是一個綜合規劃的內容,需要考慮的因素很多。如圖2所示,給出了一個具體硬件實施方案:
單片機的系統時鐘采用外接R1、C1阻容振蕩方式提供。既可以節省成本,又可以快速啟動單片機,減少喚醒時的能耗。
日期、小時、分鐘、秒的計時采用定時器/計數器TMR1完成。TMR1是具有獨立的低功耗、低頻率振蕩器,既便是在單片機處于睡眠狀態,TMR1依然可以精確計時并能在計時溢出時產生中斷請求,喚醒單片機。石英晶體XTL采用32768Hz的低頻晶體,在晶體回路中串有電阻R5,以便進一步降低能耗。

圖2 低功耗硬件設計方案
芯片采用5V電源供電,掉電保持電源BT1采用2.4V的鋰電池。BT1接在一個模擬I/O口上,R6為充電限流電阻。單片機可以通過該電阻以脈沖方式對電池充電,而停止充電時,可以通過該口以模擬輸入方式,檢測電源電壓并調整充電脈沖的寬度,即通過軟件實現智能PWM充電。在外部電源掉電時,電池BT1可以經電阻R6和I/O口輸入端保護二極管D向單片機供電。由于這時的供電電流僅為微安級,因此電阻R6上的壓降可以忽略不計,D1的作用是防止電池BT1向其它芯片或電路放電。如果掉電時間不是很長的話,可用漏電較小的膽電容代替電池;如果掉電時間較長的話,可用CSC-4法拉級大電容代替電池,持續時間可以從幾分鐘到幾天。
輸入口I1、I2、I3均接有120KΩ的上拉電阻R2、R3、R4,但該上拉電阻不是接到電源正極,而是接到輸出端口O1上。單片機處于工作狀態時,O1口輸出高電平;單片機進入睡眠狀態時,將O1口置成低電平或高阻狀態。注意,在這里一定要把內部上拉屏蔽掉。
輸出口O2接有一只二極管D2。二極管D2的作用是防止在系統掉電后高電平輸出時,消耗較多的維持電能。當O2口輸出低電平時,二極管D2導通,三極管基極被嵌位而截止;當O2口輸出高電平時,二極管D2截止,電源經R7向三極管提供基極偏流,三極管飽和導通,繼電器線圈得電,常開觸點閉合。
總之,PIC單片機工作時要最大限度地降低功耗,就要根據具體的應用場合,從硬件設計和軟件設計上綜合考慮,并采用相應的措施,以達到降低功耗之目的。
[1] 劉啟中,李榮正.PIC單片機原理及應用[M].北京:航空航天大學出版社,2003.
[2] 丁躍軍,來清民.PIC單片機基礎教程[M].北京:航空航天大學出版社,2005.
[3] 張明峰.PIC單片機入門與實戰[M].北京:航空航天大學出版社,2004.
[4] 李建忠.單片機原理及應用[M].西安:電子科技大學出版社,2006.