ATMEGA328P(Arduino Pro Mini)超低运行
2022-03-03 本文已影响0人
VellBibi
目的
最近在做一个低功耗的项目,需要一款超低功耗的mcu,整体运行功耗不超过3mA(3.3v),同时要有i2c、spi以及uart通信,并且能承载一定的计算量,需要跑100hz以上的两层卡尔曼滤波,最重要的是,要可以用Arduino系的库,为了非常方便开发验证,所以还是基于ATMEGA328P进行低功耗探索,看看到底能做到多低的运行功耗
硬件准备
电压将为3.3v,频率降为8MHz,由于我手头上有一块Arduino Pro Mini的小板子,所以基于这个板子进行改造,如果不是同款板子,也可以参照着进行改造,只要都是ATMEGA328P芯片就行
-
拆除LDO(低压差稳压器)和LED,我板子上的LDO大概会消耗50uA的电流
-
使用usbisp修变板子的熔丝位为:
0xFDDAFF
,熔丝位参照Arduino官方板子Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328P
的设置,官方板子配置在:
用porgisp软件修改熔丝位:
我用的usbisp:
Arduino官方最低支持的就是3.3v 8Mhz的频率,ATMEGA328P还可以通过修改熔丝位来调整是否使用外部晶振,从而达到更低功耗,但修改后就得自己写bootloader了,所以硬件部分就只能优化到这了,如果大神们还有更低的方案欢迎评论区留言
软件修改
在做完硬件修改后,整体功耗在8.1mA左右,跑我的算法可以到1000hz左右,我的传感器只需要100hz刷新即可,算力有点浪费了
- 引入avr/power库,
#include <avr/power.h>
,通过clock_prescale_set
函数进行降频,对应的电流值如下:
/**
* clock_div_1 8.1 mA
* clock_div_2 5 mA
* clock_div_4 3.3 mA
* clock_div_8 2.2 mA
* clock_div_16 1.6 mA
* clock_div_32 1.3 mA
*/
clock_prescale_set(clock_div_8);
由于我需要保证100hz刷新,所以选择clock_div_8,最后刷新率在120hz左右,电流在2.2mA左右,加上外围电路的消耗,总消耗也在3mA以内,达标
- 调整时间计算,由于通过avr的库降频了,Arduino的库函数并没有对应做处理,也就是说整体的运算速度下降了,原本的时间间隔也被拉长了,比如最常用的
millis()
和delay()
函数已经不能对应上实际发生的时间了,因为这些时间相关的函数都是通过定时器来计算时间的,定时器降频了,所以时间变慢了,要回到正确的时间上必须对时间进行处理,比如我是clock_div_8,那么millis()需要乘8,delay()需要除以8