基于Arduino的低功耗睡眠模式设计方案

风筝 发表于 2021-01-13 17:00:09 收藏 已收藏
赞(0) •  评论(0
400万+工程师在用
400万+工程师在用

基于Arduino的低功耗睡眠模式设计方案

风筝 发表于 2021-01-13 17:00:09

功耗是设备长时间连续运行而不断电的关键因素。因此,为了解决这个问题,几乎每个控制器都带有睡眠模式,这有助于开发人员设计电子设备以实现最佳功耗。休眠模式通过关闭未使用的模块将器件置于省电模式。

今天我们将了解Arduino睡眠模式(Sleep Mode)并使用Ammeter演示功耗。 Arduino睡眠模式也称为Arduino省电模式(Power Save mode)或Arduino待机模式(Standby Mode)。

Arduino睡眠模式

睡眠模式允许用户停止或关闭微控制器中未使用的模块,从而显着降低功耗。 Arduino UNO、Arduino Nano和Pro-mini配备了ATmega328P,它有一个欠压检测器(BOD),用于监控睡眠模式时的电源电压。

ATmega328P有六种睡眠模式:

pIYBAF_-tgmAa_0CAAFGMzyf0fU022.png

要进入任何睡眠模式,我们需要在睡眠模式控制寄存器(SMCR.SE)中启用睡眠位。然后,睡眠模式选择位选择Idle、ADC noise reduction、Power-Down、Power-Save、Standby和External Standby的睡眠模式。

内部或外部Arduino中断或复位可以将Arduino从睡眠模式唤醒。

空闲(Idle)模式

要进入空闲休眠模式,请写入控制器“000”的SM [2,0]位。此模式停止CPU,但允许SPI、2线串行接口、USART、看门狗、计数器、模拟比较器工作。空闲模式基本上停止CLKCPU和CLKFLASH。通过使用外部或内部中断,可以随时唤醒Arduino。

空闲睡眠模式的Arduino代码:

LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF);

 

有一个用于在arduino中设置各种低功耗模式的库。因此,首先从给定链接下载并安装库,然后使用上面的代码将Arduino置于空闲睡眠模式。通过使用上面的代码,Arduino将进入8秒的睡眠状态并自动唤醒。正如您在代码中所看到的,空闲模式会关闭所有定时器、SPI、USART和TWI(2线接口)。

ADC降噪模式(ADC noise reduction)

要使用此睡眠模式,请将SM [2,0]位写入“001”。该模式会停止CPU,但允许ADC、外部中断、USART、2线串行接口、看门狗和计数器运行。 ADC降噪模式基本上停止CLKCPU、CLKI / O和CLKFLASH。我们可以通过以下方法从ADC降噪模式唤醒控制器:

●    外部复位

●    看门狗系统复位

●    看门狗中断

●    欠压复位

●    2线串行接口地址匹配

●    INT上的外部电平中断

●    引脚更改中断

●    定时器/计数器中断

●    SPM / EEPROM就绪中断

掉电模式(Power-Down Mode)

掉电模式会停止所有生成的时钟,并且只允许异步模块的操作。可以通过将SM [2,0]位写入'010'来启用它。在此模式下,外部振荡器关闭,但2线串行接口、看门狗和外部中断继续运行。它只能通过以下方法之一禁用:

●    外部复位

●    看门狗系统复位

●    看门狗中断

●    欠压复位

●    2线串行接口地址匹配

●    INT上的外部电平中断

●    引脚更改中断

用于掉电周期模式的Arduino代码:

LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);

 

该代码用于打开省电模式。通过使用上面的代码,Arduino将进入8秒的睡眠状态并自动唤醒。

我们还可以使用具有中断的掉电模式,其中Arduino将进入休眠状态,但仅在提供外部或内部中断时才会唤醒。

用于掉电中断模式的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)

要进入省电模式,我们需要将SM [2,0]引脚写入'011'。该睡眠模式类似于掉电模式,只有一个例外,即如果启用定时器/计数器,即使在睡眠时它也将保持运行状态。可以使用定时器溢出唤醒设备。

如果您没有使用时间/计数器,建议使用掉电模式而不是省电模式。

待机模式(Standby)

待机模式与掉电模式相同,它们之间的唯一区别是外部振荡器在此模式下保持运行。要启用此模式,请将SM [2,0]引脚写入“110”。

扩展待机模式(Extended Standby)

此模式类似于省电模式,只有振荡器保持运行的一个例外。当我们将SM [2,0]引脚写入'111'时,器件将进入扩展待机模式。从延长待机模式唤醒器件需要6个时钟周期。

需要的组件

●    Arduino UNO开发板

●    DHT11温湿度传感器

●    USB电流表

●    面包板

●    连接线

USB电流表

USB电流表是一种即插即用设备,用于测量任何USB端口的电压和电流。加密狗插入USB电源(计算机USB端口)和USB设备(Arduino)之间。该器件具有与电源引脚串联的0.05欧姆电阻,通过它可以测量所消耗的电流值。该设备配有四个七段显示屏,可立即显示连接设备消耗的电流和电压值。这些值以每三秒的间隔刷新。

o4YBAF_-tiCAOKPfAALBCCH9yL8026.png

电路原理图

o4YBAF_-tjSAH-3bAADYlj-mK98471.png

在上面的演示中演示了Arduino深度睡眠模式,Arduino插入USB电流表,然后将USB电流表插入笔记本电脑的USB端口。 DHT11传感器的数据引脚连接到Arduino的D2引脚。

代码说明

首先包含DHT11传感器和LowPower库。要下载LowPower库,请单击此链接。然后我们定义了DHT11的数据引脚所连接的Arduino引脚编号,并定义了一个DHT对象。

#include

#include

#define dataPin 2

dht DHT;

 

在void setup()函数中,我们使用serial.begin(9600)启动了串行通信,这里9600是波特率。我们使用Arduino的内置LED作为睡眠模式的指示器。因此,我们将引脚设置为输出,将数字写入设置为低电平。

void setup() {

Serial.begin(9600);

pinMode(LED_BUILTIN,OUTPUT);

digitalWrite(LED_BUILTIN,LOW);

}

 

在void loop()函数中,我们将内置LED设为HIGH,并从传感器读取温度和湿度数据。在这里,DHT.read11();函数是从传感器读取数据。计算完数据后,我们可以通过将值保存到任何变量来检查这些值。在这里,我们采用了两个浮点型变量't'和'h'。因此,温度和湿度数据在串口监视器上串行打印。

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”并使内置LED为低电平。之后,在代码中使用下面提到的命令启用Arduino睡眠模式。

下面的代码启用Arduino的空闲周期性睡眠模式,并提供8秒的睡眠。它将ADC、定时器、SPI、USART、2线接口转为OFF状态。

然后它会在8秒后自动从睡眠中唤醒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将在一分钟内唤醒24秒,并在36秒的剩余时间内保持睡眠状态,这将显着降低Arduino气象站的功耗。

pIYBAF_-tk6AMeV-AAUJaj1Q2nM456.png

因此,如果我们将Arduino与睡眠模式一起使用,我们可以将设备运行时间显著增加。
编辑:hfy

打开APP阅读更多精彩内容

收藏

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉

相关话题

评论(0)

加载更多评论

分享到

QQ空间 QQ好友 微博
取消