功耗是設(shè)備長時(shí)間連續(xù)運(yùn)行而不斷電的關(guān)鍵因素。因此,為了解決這個(gè)問題,幾乎每個(gè)控制器都帶有睡眠模式,這有助于開發(fā)人員設(shè)計(jì)電子設(shè)備以實(shí)現(xiàn)最佳功耗。休眠模式通過關(guān)閉未使用的模塊將器件置于省電模式。
今天我們將了解Arduino睡眠模式(Sleep Mode)并使用Ammeter演示功耗。 Arduino睡眠模式也稱為Arduino省電模式(Power Save mode)或Arduino待機(jī)模式(Standby Mode)。
Arduino睡眠模式
睡眠模式允許用戶停止或關(guān)閉微控制器中未使用的模塊,從而顯著降低功耗。 Arduino UNO、Arduino Nano和Pro-mini配備了ATmega328P,它有一個(gè)欠壓檢測(cè)器(BOD),用于監(jiān)控睡眠模式時(shí)的電源電壓。
ATmega328P有六種睡眠模式:
要進(jìn)入任何睡眠模式,我們需要在睡眠模式控制寄存器(SMCR.SE)中啟用睡眠位。然后,睡眠模式選擇位選擇Idle、ADC noise reduction、Power-Down、Power-Save、Standby和External Standby的睡眠模式。
內(nèi)部或外部Arduino中斷或復(fù)位可以將Arduino從睡眠模式喚醒。
空閑(Idle)模式
要進(jìn)入空閑休眠模式,請(qǐng)寫入控制器“000”的SM [2,0]位。此模式停止CPU,但允許SPI、2線串行接口、USART、看門狗、計(jì)數(shù)器、模擬比較器工作。空閑模式基本上停止CLKCPU和CLKFLASH。通過使用外部或內(nèi)部中斷,可以隨時(shí)喚醒Arduino。
空閑睡眠模式的Arduino代碼:
LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF);
有一個(gè)用于在arduino中設(shè)置各種低功耗模式的庫。因此,首先從給定鏈接下載并安裝庫,然后使用上面的代碼將Arduino置于空閑睡眠模式。通過使用上面的代碼,Arduino將進(jìn)入8秒的睡眠狀態(tài)并自動(dòng)喚醒。正如您在代碼中所看到的,空閑模式會(huì)關(guān)閉所有定時(shí)器、SPI、USART和TWI(2線接口)。
ADC降噪模式(ADC noise reduction)
要使用此睡眠模式,請(qǐng)將SM [2,0]位寫入“001”。該模式會(huì)停止CPU,但允許ADC、外部中斷、USART、2線串行接口、看門狗和計(jì)數(shù)器運(yùn)行。 ADC降噪模式基本上停止CLKCPU、CLKI / O和CLKFLASH。我們可以通過以下方法從ADC降噪模式喚醒控制器:
● 外部復(fù)位
● 看門狗系統(tǒng)復(fù)位
● 看門狗中斷
● 欠壓復(fù)位
● 2線串行接口地址匹配
● INT上的外部電平中斷
● 引腳更改中斷
● 定時(shí)器/計(jì)數(shù)器中斷
● SPM / EEPROM就緒中斷
掉電模式(Power-Down Mode)
掉電模式會(huì)停止所有生成的時(shí)鐘,并且只允許異步模塊的操作。可以通過將SM [2,0]位寫入'010'來啟用它。在此模式下,外部振蕩器關(guān)閉,但2線串行接口、看門狗和外部中斷繼續(xù)運(yùn)行。它只能通過以下方法之一禁用:
● 外部復(fù)位
● 看門狗系統(tǒng)復(fù)位
● 看門狗中斷
● 欠壓復(fù)位
● 2線串行接口地址匹配
● INT上的外部電平中斷
● 引腳更改中斷
用于掉電周期模式的Arduino代碼:
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
該代碼用于打開省電模式。通過使用上面的代碼,Arduino將進(jìn)入8秒的睡眠狀態(tài)并自動(dòng)喚醒。
我們還可以使用具有中斷的掉電模式,其中Arduino將進(jìn)入休眠狀態(tài),但僅在提供外部或內(nèi)部中斷時(shí)才會(huì)喚醒。
用于掉電中斷模式的Arduino代碼:
void loop()
{
// Allow wake up pin to trigger interrupt on low.
attachInterrupt(0, wakeUp, LOW);
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
// Disable external pin interrupt on wake up pin.
detachInterrupt(0);
// Do something here
}
省電模式(Power-Save)
要進(jìn)入省電模式,我們需要將SM [2,0]引腳寫入'011'。該睡眠模式類似于掉電模式,只有一個(gè)例外,即如果啟用定時(shí)器/計(jì)數(shù)器,即使在睡眠時(shí)它也將保持運(yùn)行狀態(tài)。可以使用定時(shí)器溢出喚醒設(shè)備。
如果您沒有使用時(shí)間/計(jì)數(shù)器,建議使用掉電模式而不是省電模式。
待機(jī)模式(Standby)
待機(jī)模式與掉電模式相同,它們之間的唯一區(qū)別是外部振蕩器在此模式下保持運(yùn)行。要啟用此模式,請(qǐng)將SM [2,0]引腳寫入“110”。
擴(kuò)展待機(jī)模式(Extended Standby)
此模式類似于省電模式,只有振蕩器保持運(yùn)行的一個(gè)例外。當(dāng)我們將SM [2,0]引腳寫入'111'時(shí),器件將進(jìn)入擴(kuò)展待機(jī)模式。從延長待機(jī)模式喚醒器件需要6個(gè)時(shí)鐘周期。
需要的組件
● Arduino UNO開發(fā)板
● DHT11溫濕度傳感器
● 面包板
● 連接線
USB電流表
USB電流表是一種即插即用設(shè)備,用于測(cè)量任何USB端口的電壓和電流。加密狗插入U(xiǎn)SB電源(計(jì)算機(jī)USB端口)和USB設(shè)備(Arduino)之間。該器件具有與電源引腳串聯(lián)的0.05歐姆電阻,通過它可以測(cè)量所消耗的電流值。該設(shè)備配有四個(gè)七段顯示屏,可立即顯示連接設(shè)備消耗的電流和電壓值。這些值以每三秒的間隔刷新。
電路原理圖
在上面的演示中演示了Arduino深度睡眠模式,Arduino插入U(xiǎn)SB電流表,然后將USB電流表插入筆記本電腦的USB端口。 DHT11傳感器的數(shù)據(jù)引腳連接到Arduino的D2引腳。
代碼說明
首先包含DHT11傳感器和LowPower庫。要下載LowPower庫,請(qǐng)單擊此鏈接。然后我們定義了DHT11的數(shù)據(jù)引腳所連接的Arduino引腳編號(hào),并定義了一個(gè)DHT對(duì)象。
#include
#include
#define dataPin 2
dht DHT;
在void setup()函數(shù)中,我們使用serial.begin(9600)啟動(dòng)了串行通信,這里9600是波特率。我們使用Arduino的內(nèi)置LED作為睡眠模式的指示器。因此,我們將引腳設(shè)置為輸出,將數(shù)字寫入設(shè)置為低電平。
void setup() {
Serial.begin(9600);
pinMode(LED_BUILTIN,OUTPUT);
digitalWrite(LED_BUILTIN,LOW);
}
在void loop()函數(shù)中,我們將內(nèi)置LED設(shè)為HIGH,并從傳感器讀取溫度和濕度數(shù)據(jù)。在這里,DHT.read11();函數(shù)是從傳感器讀取數(shù)據(jù)。計(jì)算完數(shù)據(jù)后,我們可以通過將值保存到任何變量來檢查這些值。在這里,我們采用了兩個(gè)浮點(diǎn)型變量't'和'h'。因此,溫度和濕度數(shù)據(jù)在串口監(jiān)視器上串行打印。
void loop() {
Serial.println("Get Data From DHT11");
delay(1000);
digitalWrite(LED_BUILTIN,HIGH);
int readData = DHT.read11(dataPin); // DHT11
float t = DHT.temperature;
float h = DHT.humidity;
Serial.print("Temperature = ");
Serial.print(t);
Serial.print(" C | ");
Serial.print("Humidity = ");
Serial.print(h);
Serial.println(" % ");
delay(2000);
在啟用睡眠模式之前,我們正在打印“Arduino: - I am going for a Nap”并使內(nèi)置LED為低電平。之后,在代碼中使用下面提到的命令啟用Arduino睡眠模式。
下面的代碼啟用Arduino的空閑周期性睡眠模式,并提供8秒的睡眠。它將ADC、定時(shí)器、SPI、USART、2線接口轉(zhuǎn)為OFF狀態(tài)。
然后它會(huì)在8秒后自動(dòng)從睡眠中喚醒Arduino并打印出“Arduino:- Hey I just Woke up”。
Serial.println("Arduino:- I am going for a Nap");
delay(1000);
digitalWrite(LED_BUILTIN,LOW);
LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF,
SPI_OFF, USART0_OFF, TWI_OFF);
Serial.println("Arduino:- Hey I just Woke up");
Serial.println("");
delay(2000);
}
因此,通過使用此代碼,Arduino將在一分鐘內(nèi)喚醒24秒,并在36秒的剩余時(shí)間內(nèi)保持睡眠狀態(tài),這將顯著降低Arduino氣象站的功耗。
因此,如果我們將Arduino與睡眠模式一起使用,我們可以將設(shè)備運(yùn)行時(shí)間顯著增加。
編輯:hfy
-
控制器
+關(guān)注
關(guān)注
112文章
16416瀏覽量
178761 -
Arduino
+關(guān)注
關(guān)注
188文章
6474瀏覽量
187432 -
控制寄存器
+關(guān)注
關(guān)注
0文章
34瀏覽量
11505
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論