0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

电子设计 来源:一板网 作者:风筝 2021-01-13 17:00 次阅读

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

今天我们将了解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_-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气象站的功耗。

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

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

    关注

    112

    文章

    16152

    浏览量

    177259
  • Arduino
    +关注

    关注

    187

    文章

    6461

    浏览量

    186569
  • 控制寄存器
    +关注

    关注

    0

    文章

    34

    浏览量

    11475
收藏 人收藏

    评论

    相关推荐

    CKS32F4xx系列MCU的低功耗模式睡眠模式

    本课讲为大家讲解CKS32F4xx系列产品的低功耗模式睡眠(Sleep)模式。MCU为满足某些应用场景:如小型化低容量设备,长期监测设备等,低功耗
    发表于 06-26 10:02 615次阅读
    CKS32F4xx系列MCU的<b class='flag-5'>低功耗</b><b class='flag-5'>模式</b>之<b class='flag-5'>睡眠</b><b class='flag-5'>模式</b>

    第30章 FreeRTOS低功耗睡眠模式

    ,STM32F407和STM32F429的低功耗方式之睡眠模式的一些知识点,第33章讲解FreeRTOS支持的tickless模式睡眠
    发表于 09-12 17:21

    第21章 RTX低功耗睡眠模式

    STM32F103和STM32F407的低功耗方式之睡眠模式在RTX操作系统上面的实现方法(RTX本身支持的tickless低功耗模式在第2
    发表于 10-08 17:40

    怎么使PIC处于低功耗睡眠模式

    你好,我正在使用PIC 18F26J50。对于一个应用程序,我需要使PIC处于低功耗睡眠模式,大部分时间。我已经编程了两种中断睡眠模式的可
    发表于 03-30 09:26

    STM32的低功耗模式

    STM32的低功耗模式1.睡眠模式2.停止模式3.待机模式各种
    发表于 08-11 07:35

    介绍STM32低功耗睡眠模式事件唤醒的实现

    STM32 低功耗睡眠模式(SLEEP)事件(EVENT)唤醒实现及优化1. 介绍STM32具有多种低功耗模式,当前以STM32L4系列的
    发表于 02-23 06:02

    模式电源管理IC的低功耗设计方案

    针对降低多模式电源管理IC在轻载与待机工作模式功耗,提高其全负载条件下工作效率的需要,提出一种电源管理IC供电系统的设计方案,实现了其在启动、关断、重载、轻载以及待机等各种工作情况下
    的头像 发表于 05-20 09:50 3911次阅读

    STM32CubeMX学习笔记(15)——电源管理(PWR)低功耗睡眠模式

    一、低功耗模式简介系统提供了多个低功耗模式,可在 CPU 不需要运行时(例如等待外部事件时)节省功耗。由用户根据应用选择具体的
    发表于 12-05 11:06 0次下载
    STM32CubeMX学习笔记(15)——电源管理(PWR)<b class='flag-5'>低功耗</b><b class='flag-5'>睡眠</b><b class='flag-5'>模式</b>

    STM32低功耗模式测试

    stm32单片机低功耗模式共用3中,下来对3中低功耗进行分析测试。先看手册上相关低功耗资料介绍:先来分析睡眠
    发表于 12-31 19:05 10次下载
    STM32<b class='flag-5'>低功耗</b><b class='flag-5'>模式</b>测试

    STM32 低功耗睡眠模式(SLEEP)事件(EVENT)唤醒实现及优化

    STM32 低功耗睡眠模式(SLEEP)事件(EVENT)唤醒实现及优化1. 介绍STM32具有多种低功耗模式,当前以STM32L4系列的
    发表于 12-31 19:08 34次下载
    STM32 <b class='flag-5'>低功耗</b><b class='flag-5'>睡眠</b><b class='flag-5'>模式</b>(SLEEP)事件(EVENT)唤醒实现及优化

    STM32 低功耗睡眠模式(SLEEP)中断(INTERRUPT)唤醒实现及优化

    STM32 低功耗睡眠模式(SLEEP)中断(INTERRUPT)唤醒实现及优化1. 介绍STM32具有多种低功耗模式,当前以STM32L4
    发表于 12-31 19:09 38次下载
    STM32 <b class='flag-5'>低功耗</b><b class='flag-5'>睡眠</b><b class='flag-5'>模式</b>(SLEEP)中断(INTERRUPT)唤醒实现及优化

    PWR低功耗模式介绍

    低功耗模式,以在低功耗、短启动时间、可用外设和可用唤醒源之间实现最佳折衷。 睡眠模式 低功耗运行
    发表于 03-23 14:30 1256次阅读
    PWR<b class='flag-5'>低功耗</b><b class='flag-5'>模式</b>介绍

    PWR低功耗睡眠模式介绍

    添加进入低功耗睡眠模式的功能 /* 无限循环 */ /* USER CODE BEGIN WHILE */ while ( 1 ) { /* USER CODE END WHILE */ /* 用户
    发表于 03-23 14:47 925次阅读
    PWR<b class='flag-5'>低功耗</b><b class='flag-5'>睡眠</b><b class='flag-5'>模式</b>介绍

    您真的了解睡眠模式对超低功耗无线MCU有多重要吗?(内附活动中奖名单)

    员应当仔细选择采用蓝牙低功耗技术的 MCU 的规格,确定超低功耗的真正含义。这不是对照数据表确定最低电流消耗值,针对应用寻求最佳解决方案并非易事。 睡眠
    的头像 发表于 05-25 10:45 823次阅读
    您真的了解<b class='flag-5'>睡眠</b><b class='flag-5'>模式</b>对超<b class='flag-5'>低功耗</b>无线MCU有多重要吗?(内附活动中奖名单)

    低功耗无线 MCU:玩转睡眠模式

    支持蓝牙低功耗 (LE) 的设计可让设备长时间处于非工作状态,因此,您可能需要选用具有超低功耗睡眠模式的高能效无线微控制器 (MCU),这对于优化整体系统性能至关重要。
    的头像 发表于 07-10 10:44 863次阅读
    超<b class='flag-5'>低功耗</b>无线 MCU:玩转<b class='flag-5'>睡眠</b><b class='flag-5'>模式</b>