njabsw 发表于 2019-12-2 08:14:20

低功耗arduino程序、电流测量值及电流与电池电量时间换算...

本帖最后由 njabsw 于 2019-12-2 17:14 编辑

最近做项目需要用到低功耗,参考了论坛内各位前辈的帖子,自己做了实验并测定了电流值。原计划用arduino pro mini,实验发现耗电量仍然比较大,最后采用328p最小系统。独乐乐不如众乐乐,不敢独享,分享给大家。
1:低功耗程序如下
#include <avr/sleep.h>
#include <avr/wdt.h>

volatile byte data = 0;

void setup() {
pinMode(13, OUTPUT);
setup_watchdog(8);
// 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 >= 2) {
          //ON ACD
ACSR &= ~_BV(ACD);    //开启模拟比较器

//ON ADC
ADCSRA |= _BV(ADEN);   //ADC使能开启
   
    data = 0;
    //-------------------------------
    digitalWrite(13, HIGH);
    delay(3000);                      //此处是到达设置唤醒时间允许的程序
    digitalWrite(13, LOW);
    //--------------------------------
    ACSR |= _BV(ACD); //OFF ACD
ADCSRA = 0; //OFF ADC
    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
}2:实验发现采用上述程序,5v供电情况下,arduino pro mini的低功耗电流为69uA,采用328p最小系统(一个16M晶振+2个22pf电容)低功耗电流为29uA。
3:实验发现采用上述程序,如果不关闭ACD和ADC,也就是注释这两句ACSR |= _BV(ACD); //OFF ACD   ADCSRA = 0; //OFF ADC,328p最小系统的低功耗电流为159uA,因此关闭ACD和ADC有助于节省电流。
4:电流与电池电量时间换算关系
电流为:Ⅰ=40uA,电池容电量一共Q=300mA.h,则该电池理论上可用的时间为:t=Q/Ⅰ=300/0.04=7500小时。

40303838 发表于 2019-12-2 10:36:00

3:实验发现采用上述程序,如果不关闭ACD和ADC,也就是注释这两句ACSR |= _BV(ACD); //OFF ACD   ADCSRA = 0; //OFF ADC,328p最小系统的低功耗电流为0.159uA,因此关闭ACD和ADC有助于节省电流。
上边单位是不是写错了?0.159uA?不可能吧。

wing 发表于 2019-12-2 11:00:39

楼主的意思是:关闭ADC和ACD后,在睡眠状态下0.1几 uA, 这个电流单位是微安(μA ) 么?
核实下测量工具,这个单位其实有可能是毫安(mA)

njabsw 发表于 2019-12-2 17:15:30

笔误,是159uA

yzz163 发表于 2019-12-5 14:08:52

电池自放电,也不会少于1mA吧。。。7500 不能这样算

碌碌无为 发表于 2019-12-10 16:27:05

过来学习一下,感谢楼主分享。
页: [1]
查看完整版本: 低功耗arduino程序、电流测量值及电流与电池电量时间换算...