




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 煙草柜組的知識(shí)培訓(xùn)
- 小學(xué)教師教學(xué)個(gè)人心得總結(jié)模版
- 高鈉血癥臨床診療規(guī)范
- 職場菁英的社團(tuán)發(fā)言稿模版
- 2025發(fā)票管理培訓(xùn)
- 2025年學(xué)校學(xué)年度工作總結(jié)模版
- 貿(mào)易專業(yè)培訓(xùn)
- 格林童話《灰姑娘》經(jīng)典故事解析
- 感染科護(hù)理規(guī)范化培訓(xùn)體系
- 暑假會(huì)計(jì)助理實(shí)習(xí)報(bào)告總結(jié)模版
- 公共組織績效評估-形考任務(wù)二(占10%)-國開(ZJ)-參考資料
- 太原高考三模試題及答案
- 2024年黑龍江省三支一扶考試真題
- 貿(mào)易人居間合同協(xié)議
- 2025至2030中國聚苯并咪唑(PBI)行業(yè)供需態(tài)勢及未來發(fā)展?jié)摿?bào)告
- 北京2025年中國工業(yè)互聯(lián)網(wǎng)研究院社會(huì)在職人員招聘15人筆試歷年參考題庫附帶答案詳解
- GB 38031-2025電動(dòng)汽車用動(dòng)力蓄電池安全要求
- 期權(quán)開戶考試題及答案
- DBJT45-全過程工程咨詢服務(wù)績效評價(jià)標(biāo)準(zhǔn)
- 2025年奉化農(nóng)商集團(tuán)考題
- 血透患者的血壓管理
評論
0/150
提交評論