AVR電源管理_睡眠模式范例_第1頁
AVR電源管理_睡眠模式范例_第2頁
AVR電源管理_睡眠模式范例_第3頁
AVR電源管理_睡眠模式范例_第4頁
AVR電源管理_睡眠模式范例_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、/* *      AVR  電源管理_睡眠模式范例         * */ /* 本程序簡單的示范了如何令A(yù)VR ATMEGA16進(jìn)入睡眠狀態(tài)及喚醒 電源管理及睡眠模式的介紹 進(jìn)入最低耗電的掉電模式 關(guān)閉各種模塊 外部中斷喚醒  M16掉電模式的耗電情況(看門狗關(guān)閉),時(shí)鐘為內(nèi)部RC 1MHz      0.9uAVcc=5.0V &

2、#160;手冊的圖表約為1.1uA      0.3uAVcc=3.3V  手冊的圖表約為0.4uA      /測量的數(shù)字萬用表是FLUKE 15B,分辨率0.1uA 這個(gè)程序需要MCU進(jìn)入休眠狀態(tài),為實(shí)現(xiàn)最低功耗,JTAG接口會(huì)被關(guān)閉,只能通過LED的變化來觀察程序的運(yùn)行。 這個(gè)實(shí)驗(yàn)里面,用STK500(AVRISP) ISP下載線來燒錄更方便。 熔絲位設(shè)置  1 關(guān)斷BOD功能 BODEN=1  2 

3、如果用ISP方式燒錄,就可以完全關(guān)閉JTAG口了  OCEEN=1,JTAGEN=1   熔絲位狀態(tài)顯示框,顯示芯片的各個(gè)熔絲位的詳細(xì)狀況,AVR的熔絲位打勾表示0,表示啟用該選項(xiàng);取消表示1,表示不啟用該選項(xiàng)。*/ #include <avr/io.h> #include <avr/signal.h> #include <avr/interrupt.h> #include <avr/delay.h> /時(shí)鐘定為內(nèi)部RC 1MHz,F_CPU=1000000

4、 也可以采用其他時(shí)鐘 #include <avr/sleep.h> /* sleep.h里面定義的常數(shù),對應(yīng)各種睡眠模式 #define SLEEP_MODE_IDLE         0 空閑模式 #define SLEEP_MODE_ADC          _BV(SM0) ADC 噪聲抑制模式 #define SLEEP_MOD

5、E_PWR_DOWN     _BV(SM1) 掉電模式 #define SLEEP_MODE_PWR_SAVE     (_BV(SM0) | _BV(SM1) 省電模式 #define SLEEP_MODE_STANDBY      (_BV(SM1) | _BV(SM2) Standby 模式 #define SLEEP_MODE_EXT_STANDB

6、Y  (_BV(SM0) | _BV(SM1) | _BV(SM2) 擴(kuò)展Standby模式 函數(shù) void set_sleep_mode (uint8_t mode); 設(shè)定睡眠模式 void sleep_mode (void); 進(jìn)入睡眠狀態(tài) */ /管腳定義 #define LED 0   /PB0 驅(qū)動(dòng)LED,低電平有效 #define KEY_INT0 0   /按鍵, 

7、60; 低電平有效 #define KEY_INT1 0   /按鍵,   低電平有效 #define KEY_INT2 0   /按鍵,   低電平有效 void delay_10ms(unsigned int t) /* 由于內(nèi)部函數(shù)_delay_ms() 最高延時(shí)較短   262.144mS1MHz / 32.768ms8MHz / 16.384ms1

8、6MHz 故編寫了這條函數(shù),實(shí)現(xiàn)更長的延時(shí),并能令程序能適應(yīng)各種時(shí)鐘頻率 */ while(t-) _delay_ms(10); int main(void) unsigned char i;     /上電默認(rèn)DDRx=0x00,PORTx=0x00 輸入,無上拉電阻     PORTA=0xFF; /不用的管腳使能內(nèi)部上拉電阻。     PORTB=0xFF;     PORTC=0xFF;

9、    PORTD=0xFF;     DDRB|=(1<<LED); /PB0設(shè)為輸出高電平,燈滅        /*     端口引腳     進(jìn)入休眠模式時(shí),所有的端口引腳都應(yīng)該配置為只消耗最小的功耗。     最重要的是避免驅(qū)動(dòng)電阻性負(fù)載。     在休眠模式下I/O&

10、#160;時(shí)鐘clkI/O 和ADC 時(shí)鐘clkADC 都被停止了,輸入緩沖器也禁止了,從而保證輸入電路不會(huì)消耗電流。     在某些情況下輸入邏輯是使能的,用來檢測喚醒條件。用于此功能的具體引腳請參見“ 數(shù)字輸入使能和休眠模式” 。      如果輸入緩沖器是使能的,此時(shí)輸入不能懸空,信號(hào)電平也不應(yīng)該接近VCC/2,否則輸入緩沖器會(huì)消耗額外的電流。       IO作輸出(DDR=1)時(shí),維持狀

11、態(tài)不變    */ /* 看門狗定時(shí)器(上電默認(rèn)是關(guān)閉的) 如果系統(tǒng)無需利用看門狗,這個(gè)模塊也可以關(guān)閉。 若使能,則在任何休眠模式下都持續(xù)工作,從而消耗電流。 在深層次的睡眠模式下,這個(gè)電流將占總電流的很大比重。 假設(shè)看門狗定時(shí)器使能了,關(guān)閉程式如下 1. 在同一個(gè)指令內(nèi)對WDTOE 和WDE 寫"1“,即使WDE 已經(jīng)為"1“ 2. 在緊接的4 個(gè)時(shí)鐘周期之內(nèi)對WDE 寫"0” */ WDTCR=(1<<WDTOE)|(1<<WDE); WDTCR=

12、(0<<WDE); /或使用wdt.h里面的wdt_disable()函數(shù)    /*    模數(shù)轉(zhuǎn)換器(上電默認(rèn)是關(guān)閉的)    使能時(shí), ADC在睡眠模式下繼續(xù)工作。    為了降低功耗,在進(jìn)入睡眠模式之前需要禁止ADC。    重新啟動(dòng)后的第一次轉(zhuǎn)換為擴(kuò)展的轉(zhuǎn)換。    假設(shè)模數(shù)轉(zhuǎn)換器使能了,關(guān)閉程式如下      */     ADCSRA=(0<<ADEN);&#

13、160;     /*     模擬比較器(上電默認(rèn)是打開的,需要手工關(guān)閉)     在空閑模式時(shí),如果沒有使用模擬比較器,可以將其關(guān)閉。在ADC 噪聲抑制模式下也是如此。     在其他睡眠模式模擬比較器是自動(dòng)關(guān)閉的。     如果模擬比較器使用了內(nèi)部電壓基準(zhǔn)源,則不論在什么睡眠模式下都需要關(guān)閉它。否則內(nèi)部電壓基準(zhǔn)源將一直使能。  關(guān)閉程式如下   */

14、ACSR=(1<<ACD); /* 掉電檢測BOD (由熔絲位BODEN控制) 如果系統(tǒng)沒有利用掉電檢測器BOD,這個(gè)模塊也可以關(guān)閉。 如果熔絲位BODEN 被編程,從而使能了BOD 功能,它將在各種休眠模式下繼續(xù)工作。 在深層次的休眠模式下,這個(gè)電流將占總電流的很大比重。 設(shè)置熔絲位BODEN=1 關(guān)斷BOD功能 */ /* 片內(nèi)基準(zhǔn)電壓 使用BOD、模擬比較器和ADC 時(shí)可能需要內(nèi)部電壓基準(zhǔn)源。 若這些模塊都禁止了,則基準(zhǔn)源也可以禁止。 重新使能后用戶必須等待基準(zhǔn)源穩(wěn)定之后才可以使用它。 如果基準(zhǔn)源在休眠過程中是使能的,其輸出立

15、即可以使用。 當(dāng)BOD、模擬比較器和ADC都禁止了,則基準(zhǔn)源也自動(dòng)禁止了。 */ /* JTAG 接口與片上調(diào)試系統(tǒng) 如果通過熔絲位OCDEN使能了片上調(diào)試系統(tǒng),當(dāng)芯片進(jìn)入掉電或省電模式時(shí)主時(shí)鐘保持運(yùn)行。 在休眠模式中這個(gè)電流占總電流的很大比重。 下面有三種替代方法: 1 不編程OCDEN     2 不編程JTAGEN     3 置位MCUCSR 的JTD 當(dāng)JTAG 接口使能而JTAG TAP 控制器沒有進(jìn)行數(shù)據(jù)交換時(shí),引腳TDO

16、 將懸空。 如果與TDO 引腳連接的硬件電路沒有上拉電阻,功耗將增加。 器件的引腳TDI 包含一個(gè)上拉電阻,因此在掃描鏈中無需為下一個(gè)芯片的TDO 引腳設(shè)置上拉電阻。 通過置位MCUCSR寄存器的JTD 或不對JTAG 熔絲位編程可以禁止JTAG 接口。 JTD: 禁止JTAG 接口(MCU控制與狀態(tài)寄存器MCUCSR Bit7) 此位為0 時(shí),如果JTAGEN熔絲位被編程則JTAG 接口使能。 如果這位為1, JTAG接口禁止。 為了避免無意的禁止或使能JTAG接

17、口,必須通過一個(gè)時(shí)間序列來改變JTD 位。 應(yīng)用軟件必須在四個(gè)時(shí)鐘周期內(nèi)將期望的數(shù)值兩次寫入JTD。 如果JTAG 接口沒有與其他JTAG電路連接, JTD應(yīng)該置位。這樣做的原因是為了避免JTAG接口TDO引腳的靜態(tài)電流。 在軟件中關(guān)閉JTAG接口的方法      */ MCUCSR=(1<<JTD); MCUCSR=(1<<JTD); /* 掉電模式 當(dāng)SM2.0 為010 時(shí), SLEEP 指令將使MCU 進(jìn)入掉電模式。 在此模式下,外部

18、晶體停振,而外部中斷、兩線接口地址匹配及看門狗(如果使能的話)繼續(xù)工作。 只有外部可以運(yùn)行中斷例程了。然后返回到SLEEP 的下一條指令。 */ /MCUCSR|=(0<<ISC0)|(0<<ISC1)|(0<<ISC2); /INT2 的下降沿激活中斷(默認(rèn)的,這句話可以不寫) GICR|=(1<<INT0)|(1<<INT1)|(1<<INT2);  /使能外部中斷INT2 sei(); /使能全局中斷 while(1) for (i=0;i<5;i+) 

19、0;/LED閃動(dòng)10次后進(jìn)入掉電模式的睡眠狀態(tài)復(fù)位、看門狗復(fù)位、BOD 復(fù)位、兩線接口地址匹配中斷、外部電平中斷INT0 或INT1,或外部中斷INT2 可以使MCU 脫離掉電模式。 這個(gè)睡眠模式停止了所有的時(shí)鐘,只有異步模塊可以繼續(xù)工作。 當(dāng)使用外部電平中斷方式將MCU 從掉電模式喚醒時(shí),必須保持外部電平一定的時(shí)間。 從施加掉電喚醒條件到真正喚醒有一個(gè)延遲時(shí)間,此時(shí)間用于時(shí)鐘重新啟動(dòng)并穩(wěn)定下來。 喚醒周期與由熔絲位CKSEL 定義的復(fù)位周期是一樣的。 如果在睡眠過程中發(fā)生了復(fù)位,則MCU 喚醒后從中斷向量開始執(zhí)行 使能的中

20、斷可以將進(jìn)入睡眠模式的MCU 喚醒, 經(jīng)過啟動(dòng)時(shí)間,外加4個(gè)時(shí)鐘周期后,MCU就 delay_10ms(30); PORTB&=(1<<LED);   /點(diǎn)亮LED delay_10ms(30); PORTB|=(1<<LED); /熄滅LED set_sleep_mode(SLEEP_MODE_PWR_DOWN); /設(shè)定為掉電模式 sleep_mode(); /進(jìn)入睡眠狀態(tài) /* 也可以自行編寫 MCUCR=(0<<SM2)|(1<<SM1)|(0<<SM0);  

21、;  /設(shè)定為掉電模式 asm volatile(“sleep” : : ); /進(jìn)入睡眠狀態(tài) */ SIGNAL(SIG_INTERRUPT0)  /外部中斷2服務(wù)程序 喚醒源 PORTB&=(1<<LED);   /點(diǎn)亮LED delay_10ms(50); PORTB|=(1<<LED); /熄滅LED delay_10ms(10); /*LED長亮5秒鐘,熄滅1秒鐘后,退出中斷服務(wù)程序,然后返回到SLEEP 的下一條指令*/ SIGNA

22、L(SIG_INTERRUPT1)  /外部中斷2服務(wù)程序 喚醒源 PORTB&=(1<<LED);   /點(diǎn)亮LED delay_10ms(50); PORTB|=(1<<LED); /熄滅LED delay_10ms(10); /*LED長亮5秒鐘,熄滅1秒鐘后,退出中斷服務(wù)程序,然后返回到SLEEP 的下一條指令*/ SIGNAL(SIG_INTERRUPT2)  /外部中斷2服務(wù)程序 喚醒源 PORTB&=(1<<LED); 

23、  /點(diǎn)亮LED delay_10ms(50); PORTB|=(1<<LED); /熄滅LED delay_10ms(10); /*LED長亮5秒鐘,熄滅1秒鐘后,退出中斷服務(wù)程序,然后返回到SLEEP 的下一條指令*/ /*    程序運(yùn)行效果      萬用表打到直流電流的最小檔位(uA分辨率),接到開關(guān)的兩頭      燒錄后要把STK500拔出,否則無法測得正確的電流數(shù)據(jù)。    &#

24、160; 上電后LED閃動(dòng)10次后進(jìn)入掉電模式的睡眠狀態(tài)  此時(shí)可斷開開關(guān)  看看萬用表的讀數(shù)  然后接通開關(guān)      按下 INT2按鍵,將會(huì)發(fā)現(xiàn)LED長亮5秒鐘,熄滅1秒鐘后,退回主程序,LED閃動(dòng)10次后進(jìn)入掉電模式的睡眠狀態(tài)      如果按下復(fù)位按鍵,馬上復(fù)位。  */ /* 電源管理及睡眠模式 睡眠模式可以使應(yīng)用程序關(guān)閉MCU中沒有使用的模塊,從而降低功耗。 AVR 具有不同的睡眠模式,允許用戶根據(jù)自己的應(yīng)用要求

25、實(shí)施剪裁。 進(jìn)入睡眠模式的條件是置位寄存器MCUCR的SE,然后執(zhí)行SLEEP 指令。 具體哪一種模式( 空閑模式、ADC 噪聲抑制模式、掉電模式、省電模式、Standby 模式和擴(kuò)展Standby模式) 由MCUCR 的SM2、SM1 和SM0 決定。 使能的中斷可以將進(jìn)入睡眠模式的MCU 喚醒。 經(jīng)過啟動(dòng)時(shí)間,外加4個(gè)時(shí)鐘周期后,MCU就可以運(yùn)行中斷例程了。然后返回到SLEEP 的下一條指令。 喚醒時(shí)不會(huì)改變寄存器文件和SRAM的內(nèi)容。 如果在睡眠過程中發(fā)生了復(fù)位,則MCU 喚醒后從中斷向量開始執(zhí)行 需要了解AVR芯片內(nèi)部不同的時(shí)鐘系統(tǒng)及其分布,在選擇合適的睡眠模式時(shí)非常有用。 MCU控制寄存器MCUCR  MCU控制寄存器包含了電源管理的控制位。    Bits 7, 5, 4  SM2

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論