测试 Arduino 的省电模式

目录 Content
[hide]

在  geek-workshop 看到一篇文章介绍 Arduino 的节电方法,能“让arduino用2颗5号电池运行1年以上”,LT 转到weibo上,被某网友转载并戏称为“黑科技”,2节电池运行1年以上应该属于高科技嘛。元旦放假在家,于是有时间测试下代码。

测试思路

按照作者代码,以点亮LED为实际的工作过程。测试下面几个指标:

  1. Watchdog能否唤醒 Atmega168和 Atmega328
  2. 测试LED熄灭,在普通模式下的F1上的压降,和在sleep模式下的F1上的压降
  3. 测试LED点亮,在普通模式下的F1上的压降,和在sleep模式下的F1上的压降
  4. 将 Atemaga 芯片拔掉后F1上的压降

测试代码

普通模式

void setup() {
  // initialize digital pin 13 as an output.
  pinMode(13, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(10000);              // wait for 10 second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(56000);              // wait for 56 second
}

省电模式

#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(10000);                        // process!
    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
}

 测试结果

使用Arduino Duemilanove。处理器为Atmega168,USB连接电脑供电,用万用表毫伏档测试保险F1上的压降。

普通模式F1压降

  • LED点亮:F1压降为 23.2 mV
  • LED熄灭:F1压降为 21.7 mV

省电模式F1压降

  • LED点亮:F1压降为 23.5 mV
  • LED熄灭:F1压降为 8.8 mV

Watchdog唤醒

  • Watchdog 均能唤醒 Atmega168 和 Atmega328

拔掉Atmega后F1的压降

  • F1压降为 8.2 mV

测试结论

在 Arduino Duemilanove 断开USB后,测试F1电阻为0.5Ω,假设其电阻不会变化,那么

  • 普通模式,LED熄灭时,Atmega168 消耗电流为 27 mA
  • 省电模式,LED熄灭时,Atmega168 消耗电流为 1.2 mA

扩展阅读

Leave a Reply

Your email address will not be published. Required fields are marked *