Arduino 低功耗优化

来自Jack's Lab
(版本间的差异)
跳转到: 导航, 搜索
(代码)
第32行: 第32行:
 
   pinMode(13,OUTPUT);
 
   pinMode(13,OUTPUT);
 
   setup_watchdog(9);
 
   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
 
   ACSR |=_BV(ACD);//OFF ACD
 
   ADCSRA=0;//OFF ADC
 
   ADCSRA=0;//OFF ADC
第41行: 第40行:
 
void loop() {
 
void loop() {
 
   
 
   
if(data>=7){
+
  if(data>=7){
  data=0;
+
    data=0;
//-------------------------------
+
    //-------------------------------
  digitalWrite(13,HIGH);
+
    digitalWrite(13,HIGH);
  delay(100);                     //此处是到达设置唤醒时间允许的程序
+
    delay(100);
  digitalWrite(13,LOW);  
+
    digitalWrite(13,LOW);  
//--------------------------------     
+
    //--------------------------------     
Sleep_avr();
+
    sleep_avr();
}
+
  } else {
else {
+
    sleep_avr();  //Continue Sleep
  Sleep_avr();  //Continue Sleep
+
  }
}
+
+
 
}
 
}
 
   
 
   
//Sleep mode is activated
+
// 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) {
 
void setup_watchdog(int ii) {
 
   
 
   
第72行: 第70行:
 
   WDTCSR = bb;
 
   WDTCSR = bb;
 
   WDTCSR |= _BV(WDIE);
 
   WDTCSR |= _BV(WDIE);
 
 
 
}
 
}
 +
 
//WDT interrupt
 
//WDT interrupt
 
ISR(WDT_vect) {
 
ISR(WDT_vect) {
 
   
 
   
 
   ++data;
 
   ++data;
// wdt_reset();
+
  // wdt_reset();
+
 
 
}
 
}
 
   
 
   
void Sleep_avr(){
+
void sleep_avr(){
 
   set_sleep_mode(SLEEP_MODE_PWR_DOWN  ); // sleep mode is set here
 
   set_sleep_mode(SLEEP_MODE_PWR_DOWN  ); // sleep mode is set here
 
   sleep_enable();
 
   sleep_enable();

2015年3月17日 (二) 19:10的版本

1 概述

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



2 深入 ATMEGA 328

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

  • 空闲模式
  • ADC 噪声抑制模式
  • 掉电模式
  • 省电模式
  • Standby 模式
  • 扩展Standby 模式


Atmega328p-power-mode.png



3 代码

#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
}





















个人工具
名字空间

变换
操作
导航
工具箱