如何让Arduino用2颗5号电池运行1年以上--Arduino低功耗

如何让Arduino用2颗5号电池运行1年以上--Arduino低功耗
如何电池

LD工作室(mylife1213) · 2016-01-11 18:11
如何让Arduino用2颗5号电池运行1年以上--Arduino低功耗
本文转自极客工坊:
如果你想把arduino avr类的开发项目用来便携式设置上,不管商业还是个人DIY,那么你头一个要对付的问题就是设备功耗!
我测试atmega328p(大部分arduino 都是基于这个处理器) 最小系统下(16Mhz)运行功耗是10ma,那么如果不对处理器进行任何节电处理的话一块手机1500mah的电池只能不间断运行 1500/10/24=6.5天 ,这个还是在没有任何外围元器件的情况下的运行时间! 
现在物联网非常火,那么物联网正常情况是需要多个节点进行数据采集,然后上报给主机进行联网操作,或者接收主机命令进行对其他电器的操作. 那个问题就出现了,很多时候数据采集的地方是没有电源的,比如外置气象数据采集,这个时候就需要采集设备可以使用电池来驱动,而且不能频繁的更换电池!这就需要用到处理器的节电方案!
下面我将介绍ATMEGA328P的节电解决方案.
328P有8种节电设置,分别是:

空闲模式
当SM2..0 为000 时, SLEEP 指令将使MCU 进入空闲模式。在此模式下,CPU 停止运行,而SPI、USART、模拟比较器、ADC、两线串行接口、定时器/ 计数器、看门狗和中断系统继续工作。这个睡眠模式只停止了clkCPU 和clkFLASH,其他时钟则继续工作。象定时器溢出与USART 传输完成等内外部中断都可以唤醒MCU。如果不需要从模拟比较器中断唤醒MCU,为了减少功耗,可以切断比较器的电源。方法是置位模拟比较器控
制和状态寄存器ACSR 的ACD。如果ADC 使能,进入此模式后将自动启动一次转换。

ADC 噪声抑制模式
当SM2..0 为001 时, SLEEP 指令将使MCU 进入噪声抑制模式。在此模式下,CPU 停止运行,而ADC、外部中断、两线接口地址配置、定时器/ 计数器2 和看门狗继续工作。这个睡眠模式只停止了clkI/O、clkCPU 和clkFLASH,其他时钟则继续工作。此模式提高了ADC 的噪声环境,使得转换精度更高。ADC 使能的时候,进入此模式将自动启动一次AD 转换。ADC 转换结束中断、外部复位、看门狗复位、BOD 复位、两线接口地址匹配中断、定时器/ 计数器2 中断、SPM/EEPROM 准备好中断、外部电平中断INT0 或INT1,或外部中断INT2 可以将MCU 从ADC 噪声抑制模式唤醒。

掉电模式
当SM2..0 为010 时, SLEEP 指令将使MCU 进入掉电模式。在此模式下,外部晶体停振,而外部中断、两线接口地址匹配及看门狗(如果使能的话)继续工作。只有外部复
位、看门狗复位、BOD 复位、两线接口地址匹配中断、外部电平中断INT0 或INT1,或
外部中断INT2 可以使MCU 脱离掉电模式。这个睡眠模式停止了所有的时钟,只有异步
模块可以继续工作。

省电模式
当SM2..0 为011 时, SLEEP 指令将使MCU 进入省电模式。这一模式与掉电模式只有一点不同:
如果定时器/ 计数器2 为异步驱动,即寄存器ASSR 的AS2 置位,则定时器/ 计数器2 在睡眠时继续运行。除了掉电模式的唤醒方式,定时器/ 计数器2 的溢出中断和比较匹配中断也可以将MCU 从休眠方式唤醒,只要TIMSK 使能了这些中断,而且SREG 的全局中
断使能位I 置位。如果异步定时器不是异步驱动的,建议使用掉电模式,而不是省电模式。因为在省电模式下,若AS2 为0,则MCU 唤醒后异步定时器的寄存器数值是没有定义的。这个睡眠模式停止了除clkASY 以外所有的时钟,只有异步模块可以继续工作。

Standby 模式
当SM2..0 为110 时, SLEEP 指令将使MCU 进入Standby 模式。这一模式与掉电模式唯一的不同之处在于振荡器继续工作。其唤醒时间只需要6 个时钟周期。

扩展Standby 模式
当SM2..0 为111 时, SLEEP 指令将使MCU 进入扩展的Standby 模式。这一模式与省掉电模式唯一的不同之处在于振荡器继续工作。其唤醒时间只需要6 个时钟周期。

下图是各个模式下关闭的模块


那么我们正常使用的是掉电模式,在掉电模式下328p测试耗电1ua,这是什么概念,2颗5号电池在处理器没有进行其他操作的情况下可以工作79年!
当然了,我们不可能让处理器就这样一直待机不做其他事情,我们需要定期唤醒328P,让他处理事情,比如采集温湿度,PM2.5数据发送给主机.那么如何唤醒呢? 答案是在掉电模式下你只能通过外部中断和看门狗来唤醒328P,外部中断唤醒需要外围电路,我们优先选择WDT看门狗进行唤醒.这里的看门狗不是你们知道的只有重启328P的功能!他也可以配置成中断事件! "ISR(WDT_vect) "中断函数,通过看门狗我们就可以在不添加外围元件的情况设置唤醒时间了!

下面看实例:

#include <avr/sleep.h>
#include <avr/wdt.h>

volatile byte data=0;

void setup() {
  pinMode(13,OUTPUT);
  setup_watchdog(9);
// 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);//OFF ACD
  ADCSRA=0;//OFF ADC
  Sleep_avr();//Sleep_Mode
}

void loop() {

if(data>=7){
  data=0;
//-------------------------------
   digitalWrite(13,HIGH);
  delay(100);                      //此处是到达设置唤醒时间允许的程序
  digitalWrite(13,LOW);
//--------------------------------    
Sleep_avr();
}
else {
  Sleep_avr();  //Continue Sleep
}

}

//Sleep mode is activated
void setup_watchdog(int ii) {

  byte bb;

  if (ii > 9 ) ii=9;
  bb=ii & 7;
  if (ii > 7) bb|= (1<<5);
  bb|= (1<<WDCE);

  MCUSR &= ~(1<<WDRF);
  // start timed sequence
  WDTCSR |= (1<<WDCE) | (1<<WDE);
  // set new watchdog timeout value
  WDTCSR = bb;
  WDTCSR |= _BV(WDIE);


}
//WDT interrupt
ISR(WDT_vect) {

  ++data;
// wdt_reset();

}

void Sleep_avr(){
  set_sleep_mode(SLEEP_MODE_PWR_DOWN  ); // sleep mode is set here
  sleep_enable();
  sleep_mode();                        // System sleeps here
}

这是一个配置成56秒唤醒一次对5号端口设置高电平100ms的程序,其中if(data>=7)是data(看门狗)超时大于7次就唤醒CPU进行高电平100ms的函数,看门狗超时时间已设置成8秒,你可以调节if(data>=7)设置成你想要的唤醒时间!
通过这样的节电设置以后这个程序可以运行至少几年!
要改变唤醒时间是改这个函数:
if(data>=7) 
函数里面7的意思是有7次看门狗8秒超时复位.比如你要设置24秒那就写if(data>=3)
公式是:3*8=24
如果喜欢观看类似科技新奇事物,以及了解创客圈最新资讯,或者您对Arduino有所耳闻,可以关注我们微信公众号,一定会带给您最新的资讯,最实用的教程,以及创客最新的玩意。

微信公众号:liudaosixway


<think>好的,用户想了解Arduino Nano的低功耗相关的内容。首先,我需要确定用户的需求是什么。可能他们正在开发一个需要长时间运行的项目,比如传感器节点、环境监测设备或者可穿戴设备,这些情况下低功耗非常重要。 接下来,我需要考虑Arduino Nano的硬件特性。Arduino Nano使用的是ATmega328P微控制器,默认情况下,它的功耗可能较高,尤其是在持续运行的情况下。用户可能想知道如何降低功耗,延长电池寿命。 然后,我应该从几个方面来展开:硬件调整、睡眠模式的使用、时钟频率调整、外围设备的控制以及软件优化。这些是常见的低功耗策略。需要具体说明每个方法如何操作,比如如何禁用不必要的模块,如何使用中断唤醒,如何调整时钟等。 同时,用户可能对具体的功耗数据感兴趣,比如在不同睡眠模式下的电流消耗,这样他们可以估算电池寿命。需要确保数据的准确性,比如掉电模式下的电流大约是0.1mA,而运行模式下的电流可能高达20mA。 还要注意提醒用户可能遇到的陷阱,比如使用某些外设或库可能会阻止进入深度睡眠,或者调整时钟频率可能影响时序相关的功能,比如串口通信。这些注意事项对用户实际应用时非常重要,避免出现问题。 另外,用户可能不太熟悉Arduino低功耗库,比如LowPower.h,需要简单介绍如何安装和使用,给出示例代码,这样他们可以直接应用。同时,硬件上的修改比如断开电源指示灯可能需要一定的动手能力,需要提示用户谨慎操作。 最后,总结关键点,帮助用户形成一个清晰的实施步骤:评估需求,选择睡眠模式,硬件调整,软件优化,测试验证。这样他们可以逐步优化自己的项目,达到低功耗的目标。 需要确保回答结构清晰,分点说明,语言简洁,同时使用正确的中文术语。检查是否有遗漏的重要点,比如不同睡眠模式的区别,或者具体的电流数值是否准确。可能还需要比较Arduino Nano与其他低功耗开发板的差异,但用户没有提到,所以可能不需要深入,除非有助于他们的理解。 总之,整理以上思路,分步骤详细说明如何实现Arduino Nano的低功耗配置,提供实际可行的建议和示例,确保用户能够根据指导进行操作,同时提醒注意事项,确保他们能够顺利应用这些方法到项目中。</think>好的!以下是关于Arduino Nano低功耗模式的逐步解析: --- ### 1. **低功耗的核心目标** 降低Arduino Nano的功耗主要通过减少**工作频率**、**关闭未用模块**和**启用睡眠模式**实现,从而延长电池供电项目的续航时间(从几天到数月)。 --- ### 2. **硬件基础分析** - **主控芯片**: ATmega328P(默认运行频率16MHz,5V供电) - **典型功耗**: - 运行模式:~20mA(全速运行- 空闲模式:~6mA - 低功耗模式:可降至**0.1mA以下** --- ### 3. **降低功耗5个关键方法** #### **方法1:启用睡眠模式** - **支持的睡眠模式**(功耗由高到低): 1. `IDLE`:CPU暂停,外设仍运行(~6mA) 2. `ADC_NOISE_REDUCTION`:关闭CPU和ADC(~1mA) 3. `POWER_DOWN`:仅外部中断/看门狗可唤醒(~0.1mA) - **实现步骤**: ```cpp #include <avr/sleep.h> void setup() { set_sleep_mode(SLEEP_MODE_PWR_DOWN); // 选择掉电模式 sleep_enable(); sleep_mode(); // 进入睡眠 // 唤醒后继续执行此处代码 } void loop() {} ``` #### **方法2:调整时钟频率** - **降低主频**:通过熔丝位设置将16MHz改为8MHz/1MHz(需编程器工具) - **副作用**:延迟函数(如`delay()`)时序需重新校准。 #### **方法3:关闭未用外设** - 禁用ADC:`ADCSRA &= ~(1 << ADEN);` - 关闭稳压器:通过熔丝位关闭(仅适用于外部稳定电源)。 #### **方法4:切断板载组件供电** - **硬件改造**: - 移除电源LED(串联电阻:R1- 断开USB转串口芯片(如CH340)的VCC(需焊接跳线) #### **方法5:优化软件逻辑** - 使用中断唤醒代替轮询(如`attachInterrupt()`) - 缩短唤醒时间:仅在需要时启动传感器/通信模块。 --- ### 4. **功耗实测对比** | 模式 | 电流消耗(3.3V) | 唤醒方式 | |--------------------|------------------|------------------------| | 正常运行 | ~20mA | - | | IDLE模式 | ~6mA | 任意中断 | | POWER_DOWN模式 | ~0.1mA | 外部中断/看门狗定时器 | --- ### 5. **低功耗库推荐** - **LowPower库**(简化代码): ```cpp #include <LowPower.h> void loop() { LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); // 睡眠8秒,关闭ADC和电压监测 } ``` --- ### 6. **注意事项** - **唤醒源**:需提前配置中断引脚或看门狗定时器。 - **电压监测**:关闭BOD(Brown-Out Detector)可进一步省电,但可能导致电压不稳时程序异常。 - **通信模块**:如Wi-Fi/蓝牙需单独控制电源,避免睡眠时漏电。 --- ### 7. **应用场景示例** - **环境传感器**:每小时唤醒一次采集温湿度(AA电池运行1以上) - **远程遥控器**:按下按钮时唤醒并发送信 通过组合以上策略,可显著降低Arduino Nano的功耗。建议先用万用表测量实际电流,再逐步优化硬件和软件配置!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值