我的账户
中国电子DIY

科技成就未来

亲爱的游客,欢迎!

已有账号,请

如尚未注册?

[Arduino]关于省电模式的探索以及ACD、ADC配置说明

[复制链接]
境由心转。 发表于 2019-9-21 19:22:29 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
本帖最后由 境由心转。 于 2019-9-21 19:27 编辑

前言

资料来源:
(1)2月2号-外置采集温度_让arduino用2颗5号电池运行1年以上
(2)C:\Program Files (x86)\Arduino\hardware\tools\avr\avr\include\avr目录下的sleep.h里的例程
(3)ATMEGA328P详细资料数据手册(提取码:qft2),第302页(ACSR寄存位配置)和第319页(ADCSRA寄存位配置)
(4)ACSRACSR寄存位配置中文翻译

因为本人在做一个便携的自动浇水系统,只用电池和太阳能板供电,所以不浇水时需要用到休眠模式,以增加续航。
浇水部分已经完成,休眠部分完成一半还未整合进浇水系统,先上浇水系统给大家看看,看视频点这里。
本文使用干掉电源指示灯的arduino pro mini进行测试。 浇水.png DF7AD71FB1AA2F308BA465C26EBCE6F6.jpg
ACD、ADC的开关配置

接下来是本篇文章的重点之一,ACD、ADC的配置。
我查询了ATMEGA328P详细资料数据手册以及网上的其他文章,得知:
休眠前关闭ACD和ADC更省电,0.12ma,不关ACD和ADC就休眠,0.26ma,这样我们又省了一半的电。
但是不知道关闭ACD和ADC后会不会对后续的外部中断的唤醒休眠有影响,有待测试。
接下来我们看一下如何开启和关闭ACD、ADC,代码如有错误请指出。
  1.   //ON ACD
  2.   ACSR &= ~_BV(ACIE);   //禁止模拟比较器中断后再对ACD位操作,否则ACD位变化会发生中断,写入0关闭
  3.   ACSR &= ~_BV(ACD);    //开启模拟比较器
  4.   ACSR |= _BV(ACIE);    //开启模拟比较器中断
  5.   //ON ADC
  6.   ADCSRA |= _BV(ADEN);   //ADC使能开启
  7.   ADCSRA |= _BV(ADIF);   //ADC中断使能开启

  8. //OFF ACD
  9.   ACSR &= ~_BV(ACIE);    //禁止模拟比较器中断后再对ACD位操作,否则ACD位变化会发生中断,写入0关闭
  10.   ACSR |= _BV(ACD);      //关闭模拟比较器 ,写入1关闭
  11.   //OFF ADC
  12.   ADCSRA |= _BV(ADIF);   //清除标志,写1清除
  13.   ADCSRA &= ~_BV(ADIE);  //ADC中断使能关闭
  14.   ADCSRA &= ~_BV(ADEN);  //ADC使能关闭,写入0关闭
复制代码
这段代码,也就是ACD、ADC的配置说明可以从手册里查出。
第302页(ACSR寄存位配置)和第319页(ADCSRA寄存位配置)。
ACSR.png ADCSRA.png

休眠模式

接下来是休眠模式,我直接使用了文章2月2号-外置采集温度_让arduino用2颗5号电池运行1年以上里的部分代码,并做了一下改进和注释。

原文章把休眠模式已经说的很清楚了,我就不多做介绍了。

需要注意的地方是sleep_mode()这个API,根据sleep.h文件里的说明使用sleep_mode()可能会在某些状态下失效。

所以,根据例程,我将进入休眠模式的步骤改成:

  cli();                                //关闭全局中断,防止中断引起意外

  set_sleep_mode(SLEEP_MODE_PWR_DOWN);  //这里设置睡眠模式

  sleep_enable();                       //开启休眠功能

  sei();                                //开启全局中断

  sleep_cpu();                          //进入休眠

  sleep_disable();                      //关闭休眠功能

  sei();                                //开启全局中断



所以,在休眠前是否要开关ADC/ACD,进入休眠的方式是否要使用sleep_mode()或者我的分步进入,看个人所需。













精彩评论1

 楼主| 境由心转。 发表于 2019-9-21 19:29:01 | 显示全部楼层
2月2号-外置采集温度_让arduino用2颗5号电池运行1年以上https://www.geek-workshop.com/forum.php?mod=viewthread&tid=12261&highlight=2%E6%9C%882%E5%8F%B7

ATMEGA328P详细资料数据手册(提取码:qft2)
https://pan.baidu.com/s/1ZjL-ZOGHOUfgRMI6jMgJ0Q

ACSRACSR寄存位配置中文翻译
http://www.21ic.com/3g/765414
回复

使用道具 举报

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

本版积分规则

关注0

粉丝2

帖子2

发布主题
最新发布
推荐阅读
关注我们
中国电子DIY官方微信

客服电话:000-000-0000

客服邮箱:776513803@qq.com

周一至周五 9:00-18:00

公司地址:深圳市南山区美丽湾大厦B座

Powered by Discuz! X3.4@ 2001-2013 Comsenz Inc.