arduino 休眠 节能_Arduino低功耗掉电模式看门狗唤醒
最近在做一個(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java settime_Java日历s
- 下一篇: 查找两个字符串中相同字符串_使两个字符串