日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

arduino 休眠 节能_Arduino低功耗掉电模式看门狗唤醒

發(fā)布時(shí)間:2025/3/11 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 arduino 休眠 节能_Arduino低功耗掉电模式看门狗唤醒 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.



最近在做一個(gè)低功耗的設(shè)備,發(fā)射紅外來檢測(cè)前面1米以內(nèi)左右的地方是否有人,紐扣電池供電,需要持續(xù)工作至少兩年,因此,要求設(shè)備工作電流在ua級(jí)別。

(1)紅外發(fā)射接收

由于一般的紅外發(fā)射接收(下圖所示)都會(huì)比較耗電(幾十ma),所以紅外發(fā)射接收是不能一直打開的,需要每隔一段時(shí)間(30s)打開一次,檢測(cè)是否有人,檢測(cè)完畢后立即關(guān)閉紅外發(fā)射接收。這樣耗電的大戶解決了,但是如果單片機(jī)一直處于工作狀態(tài),也就是循環(huán)程序里等待30s來進(jìn)行紅外發(fā)射檢測(cè)的話,本身單片機(jī)也會(huì)耗電,達(dá)到ma的級(jí)別,這樣的話,紐扣電池幾百mah的電量也撐不了太久。?

紅外發(fā)射接收

(2)單片機(jī)休眠

考慮到單片機(jī)具有休眠功能,在不需要的時(shí)候可以MCU休眠,在喚醒的時(shí)候,打開紅外并進(jìn)行檢測(cè),檢測(cè)完成后單片機(jī)繼續(xù)休眠,這樣就可以達(dá)到要求了,單片機(jī)休眠狀態(tài)下,耗電很低,手冊(cè)上一般都是幾u(yù)a,完全符合要求,這里有一個(gè)問題就是,單片機(jī)的工期喚醒,一般情況下,單片機(jī)休眠后可以利用外部中斷(電平、上升沿和下降沿)喚醒,但是設(shè)備中不存在這樣的信號(hào)源能夠定期(30s)喚醒單片機(jī),因此這里需要單片機(jī)自己喚醒,也就是下面提到的看門狗喚醒。?

(3)看門狗喚醒?

AVR單片機(jī)的看門狗有三種模式,第一,系統(tǒng)復(fù)位,看門狗一般是用來監(jiān)視程序是否正常運(yùn)行的,當(dāng)程序跑飛的時(shí)候,沒有及時(shí)喂狗,看門狗就會(huì)強(qiáng)制單片機(jī)復(fù)位,達(dá)到重新運(yùn)行程序的目的;第二,中斷模式,在定時(shí)時(shí)間到的時(shí)候,會(huì)進(jìn)入中斷,這個(gè)中斷會(huì)將掉電模式的單片機(jī)喚醒;第三,中斷與系統(tǒng)復(fù)位(綜合)。這里需要使用單片機(jī)的中斷模式?

(4)Arduino??

Arduino本身是一個(gè)集成的開發(fā)平臺(tái),核心是一個(gè)avr單片機(jī),優(yōu)點(diǎn)在于平臺(tái)集成了很多庫函數(shù),有很多外圍器件,使用起來很方便,不需要使用者去了解單片機(jī)的寄存器,開發(fā)起來更快,但是做產(chǎn)品的話不一定能滿足要求,最常用的就是Arduino

Uno了,核心是atmega328,單片機(jī)本身資源豐富,考慮到成本等因素,并不需要這么多資源,造成浪費(fèi),當(dāng)然也有其他的型號(hào)的低成本的avr單片機(jī),但本質(zhì)上來說,自己做一塊板子,再利用Arduino

IDE

編程,下來bootloader和程序,就不如直接進(jìn)行單片機(jī)開發(fā)了。當(dāng)然前期開發(fā)的話,還是適合的,之前的時(shí)候,學(xué)過一段時(shí)間51單片機(jī),對(duì)avr還不是很熟悉,因此,這個(gè)低功耗設(shè)備,最開始還是使用Arduino

Uno

開發(fā)的,這個(gè)過程中遇到了各種問題,最后直接使用attiny13,進(jìn)行單片機(jī)的開發(fā),拋棄了Arduino。???

(5)最終,休眠狀態(tài)下設(shè)備耗電60多ua,達(dá)到了要求,后續(xù)將使用attiny13直接進(jìn)行開發(fā)。

程序:(轉(zhuǎn)自一個(gè)網(wǎng)友的文章,進(jìn)行了一些注釋)

#include

#include?

volatile byte data=0;

int val;

void setup()

{

pinMode(2,OUTPUT);

pinMode(6,INPUT);

pinMode(7,OUTPUT);

pinMode(8,OUTPUT);

setup_watchdog(8);//設(shè)置看門狗超時(shí)時(shí)間

// 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms

// 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec

ACSR=_BV(ACD);//關(guān)閉比較器ACD

ADCSRA=0;//關(guān)閉模數(shù)轉(zhuǎn)換器ADC

Sleep_avr();//進(jìn)入休眠模式

}

void loop()

{

if(data>=1){

data=0;

digitalWrite(7,HIGH);//紅外

delay(50);

val = digitalRead(6);

if(val == LOW)//read led

{

digitalWrite(8,HIGH);//無線

digitalWrite(2,HIGH);//測(cè)試led

delay(2);

digitalWrite(2, LOW);//測(cè)試LED閃爍一次

delay(2850);

digitalWrite(8,LOW);//關(guān)閉無線

digitalWrite(7,LOW);//關(guān)閉紅外發(fā)射器

}

digitalWrite(7,LOW);

Sleep_avr();

}

else

{

Sleep_avr(); //繼續(xù)睡眠

}

}

//設(shè)置看門狗參數(shù),輸入?yún)?shù)為定時(shí)時(shí)間

void setup_watchdog(int ii){

byte bb;

if (ii > 9 ) ii=9;

bb=ii & 7;

if (ii > 7) bb

= (1<<5);

bb

= (1<

p="">

//開始設(shè)置看門狗中斷

MCUSR &=

~(1<

p="">

WDTCSR

= (1<

p="">

(1<

p="">

//設(shè)置新的看門狗超時(shí)時(shí)間

WDTCSR = bb;

//設(shè)置為進(jìn)入中斷

WDTCSR= _BV(WDIE);

//看門狗喚醒后,從之前的程序繼續(xù)執(zhí)行

}

//超時(shí)后,只有在睡眠模式或空閑模式才會(huì)喚醒進(jìn)入中斷中斷函數(shù),除此之外,看門狗直接控制單片機(jī)復(fù)位

ISR(WDT_vect)

{

data++;

//繼續(xù)執(zhí)行睡眠之前的程序

}

//睡眠模式

void Sleep_avr()

{

set_sleep_mode(SLEEP_MODE_PWR_DOWN ); //設(shè)置睡眠模式

sleep_enable(); //使能睡眠模式

sleep_mode(); //進(jìn)入睡眠模式,看門喚醒后在這里繼續(xù)執(zhí)行

}

總結(jié)

以上是生活随笔為你收集整理的arduino 休眠 节能_Arduino低功耗掉电模式看门狗唤醒的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。