如何让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= 8secACSR |=_BV(ACD);//OFF ACDADCSRA=0;//OFF ADCSleep_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 sequenceWDTCSR |= (1<<WDCE) | (1<<WDE);// set new watchdog timeout valueWDTCSR = 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 heresleep_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

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

  1. Arduino控制1302颗ws2812灯珠显示圣诞树和圣诞老人(附程序源码)

    Arduino控制1302颗ws2812灯珠显示圣诞树和圣诞老人 设计者:STCode(公众号同名) 效果直接看视频~ Arduino控制ws2812灯带显示圣诞树和圣诞老人 1)项目介绍 该设计一共 ...

  2. 关于富斯遥控器5号电池改锂电的问题探究

    富斯遥控器原本是4节5号电池串联来给电路供电的,每节5号电池1.5V,一共6V.而这款遥控器十分费电,用不了多久就要买新电池,广大模友为了保护环境和自己的钱包,选择了干电池改锂电池这个方法. 拧下遥控 ...

  3. arduino与风向传感器的接线_小白如何开始学习Arduino?

    大家平时在作品集里会看到很多用Arduino实现的装置,可能是交互装置,可能是艺术装置.很多同学会对Arduino这个部分感兴趣,也喜欢做相关项目,觉得做起来很有意思.今天马克笔设计留学的程老师来讲一 ...

  4. arduino nano 蓝牙_用Arduino玩转掌控板(ESP32):ESP32概述与Arduino软件准备

    前言 近年来,掌控板(英文名:mPython)在创客教育中应用越来越广泛.掌控板集成了 ESP32 高性能双核芯片,具备 WiFi 和蓝牙连接功能,同时在板子上又配置了丰富的传感器,最重要的是它是专门 ...

  5. arduino 读取当前时间_Arm难以撼动,暴露下的Arduino与RISCV联合体就是个笑话

    嵌入式系统开发人员一直在想方设法进一步缩短开发时间,特别是针对概念验证和快速原型开发.虽然开发套件已成为捷径之选,但设计人员需要找到一个平衡点,既兼顾外形尺寸和广受支持的生态系统,又要考虑性能要求. ...

  6. 天河二号上运行ZHT(a zero-hop distributed table)

    最近做的研究室是空间信息网络中分布式元数据的管理,基于ZHT实现,需要搭建一个集群环境,老师就提供了天河二号,以下是在天河二号上运行ZHT的步骤,作为记录: 使用ZHT首先需要安装protobuf以及 ...

  7. 《Arduino与LabVIEW开发实战》第3章 如何连接Arduino与LabVIEW

    第3章 如何连接Arduino与LabVIEW 前两章分别讲解了Arduino和LabVIEW的基础知识,但是如何将Arduino控制器与LabVIEW软件连接起来,并做出一系列有趣的应用呢? 下面本 ...

  8. 车用计算机电路板,使用车充、LED头灯电路板制作1.5V电源模块(可代替1号电池)...

    前阵子买了个电子湿温度计,使用1节7号电池,加上家里使用天然气后,使用的燃气灶用的是1节1号电池,就翻了一下吃灰的备件,发现了这两个物件,iCharge车充和不知名的LED头灯电路板散件,就利用上了. ...

  9. TOM带你玩充电 篇三:15款5号电池横评及选购建议——南孚金霸王小米宜家耐时品胜一个都逃不了...

    双鹿电池的几个版本 理论上来说性价比:绿骑士>金骑士>黑骑士>蓝骑士 绿骑士和金骑士都很不错.哪个便宜买哪个. 小米性价比虽然最高,但是超市买不到. 蓝骑士是普通碳性电池,黑骑士是高 ...

最新文章

  1. 求最小众倍数java,【python网易】最小倍众数
  2. oracle的sequence是什么,关于Oracle的序列(Sequence)使用内容是什么呢?
  3. File类 判断功能和获取功能
  4. mysql数据库入门教程(11):视图讲解大全
  5. 编译期间确定类型安全——泛型(Generics)
  6. spring使用JdbcTemplate和jdbcDaosupport及具名参数使用
  7. 如何在springboot中使用PageHelper分页插件
  8. java静态变量实例变量_java中静态变量和实例变量的区别
  9. 29.Jwt集成(3):token设置过期时间、异常判断
  10. 阿里云新版云计算架构师ACE认证专家解读会重磅来袭
  11. wh计算公式_功率计算公式
  12. kali Linux外网渗透控制Android安卓手机系统。
  13. 手机上获取地图某个定位的经纬度坐标的方法 - 查询经度、纬度 - 百度地图app、高德地图app、Earth地球
  14. (七)线程的优先级Priority和关键词:synchronized
  15. 第一站 Theano 简介
  16. element-UI设置背景色和边框色
  17. python数据分析:数据拆分,数据合并,数据筛选
  18. nginx视频在线播服务器,Windows环境上用jwplayer+Nginx搭建视频点播服务器
  19. 面试时算法为什么如此重要?高薪,外企,为什么迟迟没有进入?
  20. ExpRe[29] Windows下的“bootstrap”深度神秘过程

热门文章

  1. VS中调试QT项目报错合集
  2. 汶川大地震随感谢摘录
  3. mac完全卸载tuxera
  4. View UI中textarea字数统计不变问题
  5. 检索式对话系统在美团客服场景的探索与实践
  6. 计算机网络应用智能家居,计算机智能化网络应用研究
  7. 循环神经网络(RNN, Recurrent Neural Networks)学习笔记:源码分析(一)
  8. 精通特征工程 —— 2.简单得数字奇特技巧
  9. ORA-00392: log 4 of thread 2 is being cleared, operation not allowed
  10. 解决:Plug-in org.eclipse.wst.jsdt.ui was unable to instantiate class org.eclipse.wst.jsdt.inte