查看: 2492|回复: 4
打印 上一主题 下一主题

Arduino 掉电唤醒模式(用于电池供电的传感器)

[复制链接] qrcode

32

主题

40

帖子

118

积分

注册会员

Rank: 2

积分
118
楼主
跳转到指定楼层
发表于 2016-7-7 11:01 AM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 QiaoJiannan 于 2016-7-7 11:04 编辑

   
Arduino面向业余电子爱好者们设计,其强大的三方(社区)资源使得原型搭建非常轻松!对于非专业产品设计师来说,很少从产品的整个生命周期去考虑,
通常只
考虑最简单的方法。普通爱好者想做
到电池供电,首先关注静态电流、电压范围,然后根据条件选择合适的MCU,Arduino通常不在备选范围,因为,它并没有为电池专门优化过。但其实,Arduino也能用于电池供电设备,只是没有那么优秀而已,本文给出几点提示,对如何优化Arduino使其用于电池供电。


    虽然不考虑产品生命周期,咱还是得有个总体设计:


  • 用什么电池?可充电锂离子,还是普通AA电池。
  • 信号采集频度,需要待机多久?3~5个月还是3~5年,如果是后者,还是找专门芯片吧,Arduino真的很难做到。
  • 是否需要显示。
  • 数据本地保存还是上传到网络。


    如果想用电池供电Arduino就不能选择Uno、Nano这类的5V产品,要用Pro min这种3.3V的产品,例如淘宝这种:


    3.3V 版本Arduino只工作在8MHz时钟,绝大多数情况下够用。这个小坂上有两样东西可以去掉,一个是防止电源反接(倒灌)的肖特基二极管,还有一个是3.3V LDO。前者短接以减少压降;后者视情况而定,Arduino Pro Mini可以在2.4V~5V都正常工作,这个LDO消耗大约1~2uA静态电流,几乎可以忽略。我通常保留这个LDO,因为2.4G或WiFi芯片需稳定3.3V电压,板载这个LDO可以胜任。



  板上的两个LED指示灯可以拆掉,把限流电阻拆掉即可。但通常Pin13的LED我保留,Pin13用于SPI SCK通信指示灯,可以检查SPI是否正常工作(电池供电不可能常开SPI)。





    这个板子与串口接法跟别的不同,你需要一个USB转串口TTL的芯片。还有,如果你想自动下载程序,需要接串口管脚4到DTR,否则每次下载程序要手动按一下复位键
(某些USB转串口没有引出DTR,那就只能手动了)
。不能
早也不能按太晚,挺考验手眼一致的,我经常失败。。。


    我用的是FT232+MAX232做电平转换,额外接4脚出来到DTR,此处可直接,Pro mini上有电容隔离。




好,接下来就下载下载Low Power的Arduino 库吧:

Low Power库下载 https://github.com/rocketscream/Low-Power

Low Power库手册 http://www.rocketscream.com/blog/2011/07/04/lightweight-low-power-arduino-library/



点击 Download ZIP,然后通过Arduino的导入Zip Library库



打开它的例子




看到它对不同芯片有不同的idle函数。idle函数可关闭很多不用的模块,但idle模块全关仍要消耗1~2mA的电流,作为电池供电还是不行,所以,接下来的部分才最重要:

file:///C:/Users/dfsdf/AppData/Local/YNote/data/qiaojiannan@vip.qq.com/9c5d9db1ce224811a39f81f4da7c7ba1/clipboard.png

这里选择过一段时间唤醒,当然,用外部中断可以进一步降低待机功耗,AVR芯片纯掉电模式是1.7uA,CMOS唤醒电路做到10uA以下不难。
因外部中断模式需要额外的硬件,本文以开启WDT为例。



PowerDown模式只有两个参数,关闭ADC和BOD。实际上PowerDown所有时钟都停止了,这些模块也干不了啥。

用万用表测一下电流的话,你会发现整个Arduino耗电降到了40~50uA,每隔8秒钟会唤醒一下下,然后继续掉电休眠。

4~50uA对于电池供电不能算优异,但3~5个月的待机没问题的,大致计算了一下:

如果按照这个数值计算那就太完美了,实际上不可能滴!

  • 首先,Arduino不可能永远掉电,它需要时不时唤醒一下,如果按照每分钟采集一次数据(假设采集电流8mA),每次采集一秒,平均182uA;但如果还要2.4G模块或WiFi模块的话,平均就需要0.5~1.8mA,电池用不了太久,只能延长休眠时间;
  • 其次,电池本身有自放电损耗,放着不用它也会每个月少个5%~20%的,温度越高损失的越快;
  • 然后,如果带显示,比如LCD显示,通常还要消耗100~300uA(段划的比较少,点阵多些);
  • 还有,锂电池保护电路也会消耗,通常是几~十几uA;


综上,用电池给Arduino供电是可行的,待机半年并不需要特别的硬件电路,控制好休眠和唤醒的时间比例就好!


下图就是我做的电子秤,20Kg量程,精度5g,分辨度0.1g,用来称宝宝体重正合适。只要有变化就点亮LED,显示实时重量,不像其它产品还要按个开关或者敲一下。平均电流2.5mA。不能算优秀,但为快速响应尚可接受,多绑两块18650好了,这东西有的是(旧电脑拆出来的),不要钱。



成品








上面泡沫的目的是。。。



源码下载:file:///C:/Users/dfsdf/AppData/Local/YNote/data/qiaojiannan@vip.qq.com/c748590a88fb458386d6ae1a3d17fc4e/attachment.png?1467823782894


关于电池自放电的介绍网站

http://batteryuniversity.com/learn/article/elevating_self_discharge


http://batteryuniversity.com/learn/article/the_secrets_of_battery_runtime











本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

0

主题

73

帖子

10

积分

新手上路

Rank: 1

积分
10
沙发
发表于 2016-7-7 11:02 AM | 只看该作者
WeightSensor20Kg.rar

源代码。

回复 支持 反对

使用道具 举报

0

主题

81

帖子

2

积分

新手上路

Rank: 1

积分
2
板凳
发表于 2016-7-7 12:33 PM | 只看该作者
长见识了
回复 支持 反对

使用道具 举报

2

主题

96

帖子

58

积分

注册会员

Rank: 2

积分
58
地板
发表于 2016-7-7 03:46 PM | 只看该作者
本帖最后由 shaoziyang 于 2016-7-7 15:48 编辑

主要还是Atmega328的低功耗特性不够好,不支持时钟切换,使用外部晶体,功耗就偏高了。
如果修改熔丝,将时钟改为内部RC模式,应该还可以降低一定功耗。再使用WDT唤醒,休眠功耗应该降低到10uA以下。
回复 支持 反对

使用道具 举报

2

主题

108

帖子

52

积分

注册会员

Rank: 2

积分
52
5#
发表于 2016-7-19 04:28 PM | 只看该作者
学习一下……
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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