风筝
发表于: 2019-9-14 09:04:17 | 显示全部楼层

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


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


Arduino睡眠模式

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


ATmega328P有六种睡眠模式:

Six-Sleep-modes-in-ATmega328P.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代码:

  1. 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代码:

  1. LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
复制代码

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

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

用于掉电中断模式的Arduino代码:

  1. void loop()
  2. {
  3.     // Allow wake up pin to trigger interrupt on low.
  4.     attachInterrupt(0, wakeUp, LOW);

  5.     LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
  6.     // Disable external pin interrupt on wake up pin.

  7.     detachInterrupt(0);

  8.     // Do something here
  9. }
复制代码

省电模式(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欧姆电阻,通过它可以测量所消耗的电流值。该设备配有四个七段显示屏,可立即显示连接设备消耗的电流和电压值。这些值以每三秒的间隔刷新。

USB-Ammeter.jpg


电路原理图

Circuit-Diagram-for-Arduino-Weather-Station-with-Sleep-Mode.png

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


代码说明

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

  1. #include <dht.h>
  2. #include <LowPower.h>

  3. #define dataPin 2
  4. dht DHT;
复制代码

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

  1. void setup() {
  2.   Serial.begin(9600);
  3.   pinMode(LED_BUILTIN,OUTPUT);
  4.   digitalWrite(LED_BUILTIN,LOW);
  5. }
复制代码

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

  1. void loop() {
  2.   Serial.println("Get Data From DHT11");
  3.   delay(1000);
  4.   digitalWrite(LED_BUILTIN,HIGH);
  5.   int readData = DHT.read11(dataPin); // DHT11

  6.   float t = DHT.temperature;
  7.   float h = DHT.humidity;

  8.   Serial.print("Temperature = ");
  9.   Serial.print(t);
  10.   Serial.print(" C | ");

  11.   Serial.print("Humidity = ");
  12.   Serial.print(h);
  13.   Serial.println(" % ");

  14.   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”。

  1.   Serial.println("Arduino:- I am going for a Nap");
  2.   delay(1000);
  3.   digitalWrite(LED_BUILTIN,LOW);
  4.   LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF,
  5.                  SPI_OFF, USART0_OFF, TWI_OFF);
  6.   Serial.println("Arduino:- Hey I just Woke up");
  7.   Serial.println("");
  8.   delay(2000);
  9. }
复制代码

因此,通过使用此代码,Arduino将在一分钟内唤醒24秒,并在36秒的剩余时间内保持睡眠状态,这将显着降低Arduino气象站的功耗。

Arduino-Weather-Station-with-Sleep-Mode.jpg

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


代码

本文使用的完整代码如下: main.rar (543 Bytes, 下载次数: 68)

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-22 14:01 , Processed in 0.052369 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表