Arduino 低功耗优化

来自Jack's Lab
(版本间的差异)
跳转到: 导航, 搜索
(代码)
(Reference)
第112行: 第112行:
 
</source>
 
</source>
 
<br><br>
 
<br><br>
 +
 +
== 328 Note ==
 +
 +
<br>
  
 
== Reference ==
 
== Reference ==

2019年5月30日 (四) 20:54的版本

目录

1 概述

常用的 Atmega328p 最小系统下 16MHz 运行功耗大约是10mA,一块手机1200mAh的电池大约可不间断运行 1200/10/24 = 5天,这个还是在没有任何外围器件的情况下,算上外围设备如温度传感器等,连续运行的时间更短



2 深入 ATMEGA 328

328P有6种节电设置,分别是:

  • 空闲模式 (SLEEP_MODE_IDLE)
  • ADC 噪声抑制模式 (SLEEP_MODE_ADC)
  • 掉电模式 (SLEEP_MODE_PWR_DOWN)
  • 省电模式 (SLEEP_MODE_PWR_SAVE)
  • Standby 模式
  • 扩展Standby 模式


Atmega328p-power-mode.png


其中,关掉内部部件最多的掉电模式,328P 的耗电约为 1uA


另外:Watchdog 触发中断,不仅只有重启的功能,亦可配置为执行中断函数:

ISR(WDT_vect) {

  // interrupt function

}

WDT_vect 为 watchdog 中断向量入口



3 ATtiny13

  • 空闲模式 (SLEEP_MODE_IDLE)
  • ADC 噪声抑制模式 (SLEEP_MODE_ADC)
  • 掉电模式 (SLEEP_MODE_PWR_DOWN)
  • 省电模式 (SLEEP_MODE_PWR_SAVE)



4 代码

#include <avr/sleep.h>
#include <avr/wdt.h>
 
volatile byte data=0;
 
void setup() {
  pinMode(13,OUTPUT);
  setup_watchdog(9);

  ACSR |=_BV(ACD);//OFF ACD
  ADCSRA=0;//OFF ADC
  Sleep_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
  }
}
 
// 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
// 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
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
}



5 328 Note


6 Reference



















个人工具
名字空间

变换
操作
导航
工具箱