魔法书3:让 Arduino 慢下来 20倍省电

我是潘,曾经是个工程师。这是为 Ardui.Co 制作的 “Arduino 魔法书” 系列的专栏。上节课介绍了怎么让Arduino 全速运行,但大部分时候我们更希望 Arduino 能慢下来,节省更多的电能,让设备在户外数据采集等取电不便的地方,运行的更久。

降低 Arduino 的速度,最简单粗暴的方式就是换一个频率低的晶振(硬件层面),UNO 和Mage2560 默认使用16MHz的晶振,换成8MHz,速度就会降下来一半。对即将进入成品阶段的设计,建议在硬件层面修改,因为这是最可靠稳定的。如果还在验证和开发的阶段呢?软件方式会比较便利。

软件方式就是修改时钟分频寄存器(CLKPR),它决定了CPU 运行的速度。要注意的是,速度一旦改变,就会影响delay()、millis() 等时间相关的函数,而且会影响ADC、串口等外围设备。CLKPR 根据下表的值控制CPU的分频比(晶振频率除以分频比,即为CPU运行速度):

修改CLKPR 需要一个特殊过程,第一步,先将它的第7位(即 CLKCE)设置为1,并将其他位置零;第二步,给CLKPR 赋值。而且这个过程必须在4个周期内完成写入动作 -_-!! 所以过程中,最好禁止所有中断。

由于 CPU 的速度只有原来的1/256,Arduino 的示例程序程序Blink 中,延时函数 delay(1000) ,延迟时间即 1000ms * 256,超过4分种,闪烁实在太慢了,所以这里将延迟函数改为  delay(4),即1.024秒。

使用USB计量器测量降速后(下图一)和原速(下图二)的功耗,降速后功耗降低了10mA左右,节约了 20% 功耗。

节约10mA 是什么概念呢?计算一下:

原速运行时,Arduino UNO的功耗为 P = 0.05A * 5V = 0.25W

2节AA碱性电池升压(假设转换效率100%),工作在100mA 放电电流时,电量约 Q = 2Ah * 3V = 6Wh

即Arduino 可以运行 Q/P = 6Wh / 0.25A = 24h, 节能后 24h * (1 + 20%) = 28.8h

Arduino UNO 已经在龟速运行了,应该很省电,为什么也就能跑一天多?看来 Arduino 是相当耗电的。

不过,元凶是CPU吗?

其实,最耗电的是Arduino UNO 上的USB模块,而不是CPU。如果换成不带USB模块的 Arduino mini 来重复这个实验 Arduino 省电效果达90%以上,实际测试一下:

去掉 USB 模块后,耗电大幅下降80%以上。降速(上图一)和满速(上图二)的Arduino mini 功耗分别只有 4mA 和 10.55mA!

由于两颗板载 LED 功耗大概2mA * 2左右(其中一颗常亮),也就是说 Arduino mini 上单块 ATmega328P 的功耗只有 <1mA 和 6.5mA,降速后的功耗还不到原来的1/6!与满速的 Arduino UNO 相比不到 1/50 。

Arduino mini 的供电只需 3.3V,降速后的功率为 0.0033W。2节AA电池就可以让其运行 6Wh / 0.0033W = 1818h = 78天,两个多月时间!

但这个数字还不够理想,如果是户外采集数据,我们往往希望电池的寿命在半年、甚至一年以上,即使采用太阳能供电,Arduino 越省电,电池板体积也就能做的越小、成本越低。

另外,耗电的不止Arduino,还有更耗电的外部设备。有没有比降速更省电,同时让外围设备不耗电的方式呢?答案是肯定的。

后面的章节将介绍 Arduino 睡眠模式,不需要工作时,让系统打个盹,甚至睡个懒觉,进入冬眠状态,达到极致省电的状态,甚至2节AA电池就能让它工作2年以上。

One thought on “魔法书3:让 Arduino 慢下来 20倍省电

  1. Andrew

    感謝你這個系列的分享,很少人關注耗電的議題。但如果要做出一個實際運作的產品,耗電是很重要的!

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *