极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 773|回复: 5

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

[复制链接]
发表于 2019-12-2 08:14:20 | 显示全部楼层 |阅读模式
本帖最后由 njabsw 于 2019-12-2 17:14 编辑

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

  3. volatile byte data = 0;

  4. void setup() {
  5.   pinMode(13, OUTPUT);
  6.   setup_watchdog(8);
  7.   // 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
  8.   // 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec

  9. ACSR |= _BV(ACD); //OFF ACD
  10. ADCSRA = 0; //OFF ADC

  11.   Sleep_avr();//Sleep_Mode
  12. }

  13. void loop() {

  14.   if (data >= 2) {
  15.           //ON ACD
  16.   ACSR &= ~_BV(ACD);    //开启模拟比较器
  17.   
  18.   //ON ADC
  19.   ADCSRA |= _BV(ADEN);   //ADC使能开启
  20.    
  21.     data = 0;
  22.     //-------------------------------
  23.     digitalWrite(13, HIGH);
  24.     delay(3000);                      //此处是到达设置唤醒时间允许的程序
  25.     digitalWrite(13, LOW);
  26.     //--------------------------------
  27.     ACSR |= _BV(ACD); //OFF ACD
  28. ADCSRA = 0; //OFF ADC
  29.     Sleep_avr();
  30.   }
  31.   else {
  32.     Sleep_avr();  //Continue Sleep
  33.   }

  34. }

  35. //Sleep mode is activated
  36. void setup_watchdog(int ii) {

  37.   byte bb;

  38.   if (ii > 9 ) ii = 9;
  39.   bb = ii & 7;
  40.   if (ii > 7) bb |= (1 << 5);
  41.   bb |= (1 << WDCE);

  42.   MCUSR &= ~(1 << WDRF);
  43.   // start timed sequence
  44.   WDTCSR |= (1 << WDCE) | (1 << WDE);
  45.   // set new watchdog timeout value
  46.   WDTCSR = bb;
  47.   WDTCSR |= _BV(WDIE);


  48. }
  49. //WDT interrupt
  50. ISR(WDT_vect) {

  51.   ++data;
  52.   // wdt_reset();

  53. }

  54. void Sleep_avr() {
  55.   set_sleep_mode(SLEEP_MODE_PWR_DOWN  ); // sleep mode is set here
  56.   sleep_enable();
  57.   sleep_mode();                        // System sleeps here
  58. }
复制代码
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小时。


回复

使用道具 举报

发表于 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?不可能吧。
回复 支持 反对

使用道具 举报

发表于 2019-12-2 11:00:39 | 显示全部楼层
楼主的意思是:关闭ADC和ACD后,在睡眠状态下0.1几 uA, 这个电流单位是微安(μA ) 么?
核实下测量工具,这个单位其实有可能是毫安(mA)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-2 17:15:30 | 显示全部楼层
笔误,是159uA
回复 支持 反对

使用道具 举报

发表于 2019-12-5 14:08:52 | 显示全部楼层
电池自放电,也不会少于1mA吧。。。7500 不能这样算
回复 支持 反对

使用道具 举报

发表于 6 天前 | 显示全部楼层
过来学习一下,感谢楼主分享。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2019-12-16 22:00 , Processed in 0.089960 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表