Arduino 低功耗模式下电流与atmega328数据手册不符合的问题
如题,用atmega328自己焊的最小系统,烧pro mini 3.3V的bootloader,在set_sleep_mode(SLEEP_MODE_PWR_DOWN) 和sleep_mode()两条指令后测得电流200微安,与数据手册上给出的“1微安以下”严重不符。不用arduino的boot直接在AVR环境下测试此二条指令测得电流17微安,还是有出入。
ps之前用atmega8做低功耗实测电流确实可以低到1微安以下。。。
是我的328买的假货?还是有什么玄机还没参透?请知道的朋友指点我一下! 怎么没有人回复啊。。。自己顶顶 其实这不用太过纠结
单片机最终还是用来工作而不是低功耗待机的。
低功耗待机可以考虑用一个外部定时器定时激活(比如气象站模式下 定时采集数据回传 平时低功耗状态)平时就直接断电就好了
而且0.2ma的水平对于一块普通的18650来说也小的可怜,一块普通的2400MAH的电池能支撑其很久了
可用电池容量=2.4AH*3.7v*0.8电压转换系数=7.104WH
功耗:0.0002*3.3=0.00066W
算下来时间就很长很长了 转换系数按照0.8其实都算比较保守了 很多高效率的降压芯片可以做到更高
何况现在项目的供电方式可以有多重选择。
比如微波无线输电技术
比如光伏供电方案
比如POE输电方案都是完全可行的 所以很多户外数据采集终端都已经把电池作为备用电源在使用
更何况2400MAH的电池已经不算大容量锂电池
现在3400MAH的电池都早就已经市售了 PCB是你自己做的吗? 本帖最后由 mf314 于 2015-1-11 13:54 编辑
darkorigin 发表于 2015-1-10 16:46 static/image/common/back.gif
更何况2400MAH的电池已经不算大容量锂电池
现在3400MAH的电池都早就已经市售了
我要用在可穿戴,电池容量请以几十毫安时计。。。而且相当一部分时间就是在待机的 本帖最后由 mf314 于 2015-1-11 13:51 编辑
好了问题已解决部分,关掉ADC可以省大量电,但是待机功耗还是有19微安,没有达到手册上的标准,外国有人能做到0.35微安。。。降频的效果不是很明显
就先这样吧 我用的atmega644掉电模式只有90uA。 我使用 328 内部RC,最小系统待机耗电 27uA,看来不仅仅是我这样,我也怀疑过的328是不是假的
http://www.geek-workshop.com/forum.php?mod=redirect&goto=findpost&ptid=12261&pid=82447
http://www.geek-workshop.com/forum.php?mod=redirect&goto=findpost&ptid=12261&pid=82458 我用的另外一个帖子里的程序测了一下328P最小系统的掉电模式,耗电大概在6-7uA.
http://www.geek-workshop.com/thread-12261-1-1.html
LZ可以参考以下。
http://img2.ph.126.net/foqV9C_-mPrdq7Xt1Rjd1w==/6630928127722731980.jpg 我把那里的代码复制过来一下:
为了方便观察,我将中断时间设置成了4秒,点灯时间为8秒(4x2)#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) {
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
}
可参考stm32的低功耗配置,引脚不用的要置低 本帖最后由 RimeLink 于 2020-1-4 14:09 编辑
Arduino Pro Mini 休眠极限 0.1uA,这是我们测试的结果,如上图所示。请百度搜索“ArduinoLoRa 休眠极限 1.4uA”(抱歉,极客工坊不允许我发送 URL)
第 1 步:改制 Arduino Pro Mini
如上图所示,新购的 Arduino Pro Mini 需要卸掉 2 个器件:LDO(低压差稳压器)和电源指示灯处的 1k 电阻。
本帖最后由 RimeLink 于 2020-1-4 15:25 编辑
按下表连接 Arduino Pro Mini 和 下载烧录器
设置 Arduino IDE
编译和烧录下述休眠代码
#include <avr/sleep.h>
void setup ()
{
pinMode(LED_BUILTIN, OUTPUT);
intcount;
for (count = 0; count < 5; ++count)
{
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(200); // wait for 200ms
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(200); // wait for 200ms
}
// disable ADC
ADCSRA = 0;
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
noInterrupts (); // timed sequence follows
sleep_enable();
// turn off brown-out enable in software
MCUCR = bit (BODS) | bit (BODSE);
MCUCR = bit (BODS);
interrupts (); // guarantees next instruction executed
sleep_cpu (); // sleep within 3 clock cycles of above
}// end of setup
void loop () { }
页:
[1]