本帖最后由 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小时。
|