极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 37627|回复: 14

Arduino 低功耗模式下电流与atmega328数据手册不符合的问题

[复制链接]
发表于 2015-1-9 22:14:06 | 显示全部楼层 |阅读模式
如题,用atmega328自己焊的最小系统,烧pro mini 3.3V的bootloader,在set_sleep_mode(SLEEP_MODE_PWR_DOWN)       和  sleep_mode()两条指令后测得电流200微安,与数据手册上给出的“1微安以下”严重不符。

不用arduino的boot直接在AVR环境下测试此二条指令测得电流17微安,还是有出入。
ps之前用atmega8做低功耗实测电流确实可以低到1微安以下。。。
是我的328买的假货?还是有什么玄机还没参透?请知道的朋友指点我一下!

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2015-1-10 16:33:01 | 显示全部楼层
怎么没有人回复啊。。。自己顶顶
回复 支持 反对

使用道具 举报

发表于 2015-1-10 16:45:36 | 显示全部楼层
其实这不用太过纠结
单片机最终还是用来工作而不是低功耗待机的。
低功耗待机可以考虑用一个外部定时器定时激活(比如气象站模式下 定时采集数据回传 平时低功耗状态)平时就直接断电就好了

而且0.2ma的水平对于一块普通的18650来说也小的可怜,一块普通的2400MAH的电池能支撑其很久了
可用电池容量=2.4AH*3.7v*0.8电压转换系数=7.104WH
功耗:0.0002*3.3=0.00066W
算下来时间就很长很长了 转换系数按照0.8其实都算比较保守了 很多高效率的降压芯片可以做到更高

何况现在项目的供电方式可以有多重选择。
比如微波无线输电技术
比如光伏供电方案
比如POE输电方案都是完全可行的 所以很多户外数据采集终端都已经把电池作为备用电源在使用
回复 支持 反对

使用道具 举报

发表于 2015-1-10 16:46:35 | 显示全部楼层
更何况2400MAH的电池已经不算大容量锂电池
现在3400MAH的电池都早就已经市售了
回复 支持 反对

使用道具 举报

发表于 2015-1-10 22:05:57 | 显示全部楼层
PCB是你自己做的吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-11 13:48:10 | 显示全部楼层
本帖最后由 mf314 于 2015-1-11 13:54 编辑
darkorigin 发表于 2015-1-10 16:46
更何况2400MAH的电池已经不算大容量锂电池
现在3400MAH的电池都早就已经市售了


我要用在可穿戴,电池容量请以几十毫安时计。。。而且相当一部分时间就是在待机的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-11 13:49:26 | 显示全部楼层
本帖最后由 mf314 于 2015-1-11 13:51 编辑

好了问题已解决部分,关掉ADC可以省大量电,但是待机功耗还是有19微安,没有达到手册上的标准,外国有人能做到0.35微安。。。降频的效果不是很明显

就先这样吧
回复 支持 反对

使用道具 举报

发表于 2015-1-12 15:12:58 | 显示全部楼层
我用的atmega644掉电模式只有90uA。
回复 支持 反对

使用道具 举报

发表于 2015-1-12 19:08:41 | 显示全部楼层
我使用 328 内部RC,最小系统待机耗电 27uA,看来不仅仅是我这样,我也怀疑过的328是不是假的

http://www.geek-workshop.com/forum.php?mod=redirect&goto=findpost&ptid=12261&pid=82447

http://www.geek-workshop.com/forum.php?mod=redirect&goto=findpost&ptid=12261&pid=82458
回复 支持 反对

使用道具 举报

发表于 2015-4-29 15:51:59 | 显示全部楼层
我用的另外一个帖子里的程序测了一下328P最小系统的掉电模式,耗电大概在6-7uA.
http://www.geek-workshop.com/thread-12261-1-1.html

LZ可以参考以下。

回复 支持 反对

使用道具 举报

发表于 2015-4-29 15:55:00 | 显示全部楼层
我把那里的代码复制过来一下:
为了方便观察,我将中断时间设置成了4秒,点灯时间为8秒(4x2)
  1. #include <avr/sleep.h>
  2. #include <avr/wdt.h>

  3. volatile byte data = 0;

  4. void setup() {
  5.   pinMode(13, OUTPUT);
  6.   setup_watchdog(8);
  7.   // 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
  8.   // 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
  9.   ACSR |= _BV(ACD); //OFF ACD
  10.   ADCSRA = 0; //OFF ADC
  11.   Sleep_avr();//Sleep_Mode
  12. }

  13. void loop() {

  14.   if (data >= 2) {
  15.     data = 0;
  16.     //-------------------------------
  17.     digitalWrite(13, HIGH);
  18.     delay(100);                      //此处是到达设置唤醒时间允许的程序
  19.     digitalWrite(13, LOW);
  20.     //--------------------------------
  21.     Sleep_avr();
  22.   }
  23.   else {
  24.     Sleep_avr();  //Continue Sleep
  25.   }

  26. }

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

  29.   byte bb;

  30.   if (ii > 9 ) ii = 9;
  31.   bb = ii & 7;
  32.   if (ii > 7) bb |= (1 << 5);
  33.   bb |= (1 << WDCE);

  34.   MCUSR &= ~(1 << WDRF);
  35.   // start timed sequence
  36.   WDTCSR |= (1 << WDCE) | (1 << WDE);
  37.   // set new watchdog timeout value
  38.   WDTCSR = bb;
  39.   WDTCSR |= _BV(WDIE);


  40. }
  41. //WDT interrupt
  42. ISR(WDT_vect) {

  43.   ++data;
  44.   // wdt_reset();

  45. }

  46. void Sleep_avr() {
  47.   set_sleep_mode(SLEEP_MODE_PWR_DOWN  ); // sleep mode is set here
  48.   sleep_enable();
  49.   sleep_mode();                        // System sleeps here
  50. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2017-8-27 07:50:37 | 显示全部楼层
可参考stm32的低功耗配置,引脚不用的要置低
回复 支持 反对

使用道具 举报

发表于 2020-1-4 11:36:08 | 显示全部楼层
本帖最后由 RimeLink 于 2020-1-4 14:09 编辑



Arduino Pro Mini 休眠极限 0.1uA,这是我们测试的结果,如上图所示。请百度搜索“ArduinoLoRa 休眠极限 1.4uA”(抱歉,极客工坊不允许我发送 URL)

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2020-1-4 14:08:33 | 显示全部楼层


第 1 步:改制 Arduino Pro Mini
如上图所示,新购的 Arduino Pro Mini 需要卸掉 2 个器件:LDO(低压差稳压器)和电源指示灯处的 1k 电阻

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2020-1-4 15:23:49 | 显示全部楼层
本帖最后由 RimeLink 于 2020-1-4 15:25 编辑

按下表连接 Arduino Pro Mini 和 下载烧录器





设置 Arduino IDE




编译和烧录下述休眠代码

#include <avr/sleep.h>
void setup ()
{
  pinMode(LED_BUILTIN, OUTPUT);


  int  count;
  for (count = 0; count < 5; ++count)
  {
    digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(200);                       // wait for 200ms
    digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
    delay(200);                       // wait for 200ms   
  }
  
  // disable ADC
  ADCSRA = 0;  
  
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);  
  noInterrupts ();           // timed sequence follows
  sleep_enable();

  // turn off brown-out enable in software
  MCUCR = bit (BODS) | bit (BODSE);
  MCUCR = bit (BODS);
  interrupts ();             // guarantees next instruction executed
  sleep_cpu ();              // sleep within 3 clock cycles of above


}  // end of setup


void loop () { }


本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 02:43 , Processed in 0.042968 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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