arduino 休眠 节能_Arduino低功耗掉电模式看门狗唤醒
最近在做一個(gè)低功耗的設(shè)備,發(fā)射紅外來(lái)檢測(cè)前面1米以?xún)?nèi)左右的地方是否有人,紐扣電池供電,需要持續(xù)工作至少兩年,因此,要求設(shè)備工作電流在ua級(jí)別。
(1)紅外發(fā)射接收
由于一般的紅外發(fā)射接收(下圖所示)都會(huì)比較耗電(幾十ma),所以紅外發(fā)射接收是不能一直打開(kāi)的,需要每隔一段時(shí)間(30s)打開(kāi)一次,檢測(cè)是否有人,檢測(cè)完畢后立即關(guān)閉紅外發(fā)射接收。這樣耗電的大戶(hù)解決了,但是如果單片機(jī)一直處于工作狀態(tài),也就是循環(huán)程序里等待30s來(lái)進(jìn)行紅外發(fā)射檢測(cè)的話(huà),本身單片機(jī)也會(huì)耗電,達(dá)到ma的級(jí)別,這樣的話(huà),紐扣電池幾百mah的電量也撐不了太久。?
紅外發(fā)射接收
(2)單片機(jī)休眠
考慮到單片機(jī)具有休眠功能,在不需要的時(shí)候可以MCU休眠,在喚醒的時(shí)候,打開(kāi)紅外并進(jìn)行檢測(cè),檢測(cè)完成后單片機(jī)繼續(xù)休眠,這樣就可以達(dá)到要求了,單片機(jī)休眠狀態(tài)下,耗電很低,手冊(cè)上一般都是幾u(yù)a,完全符合要求,這里有一個(gè)問(wèn)題就是,單片機(jī)的工期喚醒,一般情況下,單片機(jī)休眠后可以利用外部中斷(電平、上升沿和下降沿)喚醒,但是設(shè)備中不存在這樣的信號(hào)源能夠定期(30s)喚醒單片機(jī),因此這里需要單片機(jī)自己?jiǎn)拘?#xff0c;也就是下面提到的看門(mén)狗喚醒。?
(3)看門(mén)狗喚醒?
AVR單片機(jī)的看門(mén)狗有三種模式,第一,系統(tǒng)復(fù)位,看門(mén)狗一般是用來(lái)監(jiān)視程序是否正常運(yùn)行的,當(dāng)程序跑飛的時(shí)候,沒(méi)有及時(shí)喂狗,看門(mén)狗就會(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è)集成的開(kāi)發(fā)平臺(tái),核心是一個(gè)avr單片機(jī),優(yōu)點(diǎn)在于平臺(tái)集成了很多庫(kù)函數(shù),有很多外圍器件,使用起來(lái)很方便,不需要使用者去了解單片機(jī)的寄存器,開(kāi)發(fā)起來(lái)更快,但是做產(chǎn)品的話(huà)不一定能滿(mǎn)足要求,最常用的就是Arduino
Uno了,核心是atmega328,單片機(jī)本身資源豐富,考慮到成本等因素,并不需要這么多資源,造成浪費(fèi),當(dāng)然也有其他的型號(hào)的低成本的avr單片機(jī),但本質(zhì)上來(lái)說(shuō),自己做一塊板子,再利用Arduino
IDE
編程,下來(lái)bootloader和程序,就不如直接進(jìn)行單片機(jī)開(kāi)發(fā)了。當(dāng)然前期開(kāi)發(fā)的話(huà),還是適合的,之前的時(shí)候,學(xué)過(guò)一段時(shí)間51單片機(jī),對(duì)avr還不是很熟悉,因此,這個(gè)低功耗設(shè)備,最開(kāi)始還是使用Arduino
Uno
開(kāi)發(fā)的,這個(gè)過(guò)程中遇到了各種問(wèn)題,最后直接使用attiny13,進(jìn)行單片機(jī)的開(kāi)發(fā),拋棄了Arduino。???
(5)最終,休眠狀態(tài)下設(shè)備耗電60多ua,達(dá)到了要求,后續(xù)將使用attiny13直接進(jìn)行開(kāi)發(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è)置看門(mén)狗超時(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);//無(wú)線(xiàn)
digitalWrite(2,HIGH);//測(cè)試led
delay(2);
digitalWrite(2, LOW);//測(cè)試LED閃爍一次
delay(2850);
digitalWrite(8,LOW);//關(guān)閉無(wú)線(xiàn)
digitalWrite(7,LOW);//關(guān)閉紅外發(fā)射器
}
digitalWrite(7,LOW);
Sleep_avr();
}
else
{
Sleep_avr(); //繼續(xù)睡眠
}
}
//設(shè)置看門(mén)狗參數(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="">
//開(kāi)始設(shè)置看門(mén)狗中斷
MCUSR &=
~(1<
p="">
WDTCSR
= (1<
p="">
(1<
p="">
//設(shè)置新的看門(mén)狗超時(shí)時(shí)間
WDTCSR = bb;
//設(shè)置為進(jìn)入中斷
WDTCSR= _BV(WDIE);
//看門(mén)狗喚醒后,從之前的程序繼續(xù)執(zhí)行
}
//超時(shí)后,只有在睡眠模式或空閑模式才會(huì)喚醒進(jìn)入中斷中斷函數(shù),除此之外,看門(mén)狗直接控制單片機(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)入睡眠模式,看門(mén)喚醒后在這里繼續(xù)執(zhí)行
}
總結(jié)
以上是生活随笔為你收集整理的arduino 休眠 节能_Arduino低功耗掉电模式看门狗唤醒的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java settime_Java日历s
- 下一篇: python点线图_Python | 点