Arduino 低功耗优化

来自Jack's Lab
(版本间的差异)
跳转到: 导航, 搜索
(深入 ATMEGA 328)
第19行: 第19行:
 
[[文件:Atmega328p-power-mode.png]]
 
[[文件:Atmega328p-power-mode.png]]
  
 +
<br><br>
  
 +
== 代码 ==
  
 
+
<source lang=java>
<br><br>
+
#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(100);                      //此处是到达设置唤醒时间允许的程序
 +
  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
 +
}
 +
</source>
 
<br><br>
 
<br><br>
 
<br><br>
 
<br><br>

2015年3月17日 (二) 16:06的版本

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);
// 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(100);                      //此处是到达设置唤醒时间允许的程序
  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
}





















个人工具
名字空间

变换
操作
导航
工具箱