美文网首页
ATMEGA328P(Arduino Pro Mini)超低运行

ATMEGA328P(Arduino Pro Mini)超低运行

作者: VellBibi | 来源:发表于2022-03-03 16:28 被阅读0次

    目的

    最近在做一个低功耗的项目,需要一款超低功耗的mcu,整体运行功耗不超过3mA(3.3v),同时要有i2c、spi以及uart通信,并且能承载一定的计算量,需要跑100hz以上的两层卡尔曼滤波,最重要的是,要可以用Arduino系的库,为了非常方便开发验证,所以还是基于ATMEGA328P进行低功耗探索,看看到底能做到多低的运行功耗

    硬件准备

    电压将为3.3v,频率降为8MHz,由于我手头上有一块Arduino Pro Mini的小板子,所以基于这个板子进行改造,如果不是同款板子,也可以参照着进行改造,只要都是ATMEGA328P芯片就行

    1. 拆除LDO(低压差稳压器)和LED,我板子上的LDO大概会消耗50uA的电流


    2. 使用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刷新即可,算力有点浪费了

    1. 引入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以内,达标

    1. 调整时间计算,由于通过avr的库降频了,Arduino的库函数并没有对应做处理,也就是说整体的运算速度下降了,原本的时间间隔也被拉长了,比如最常用的millis()delay()函数已经不能对应上实际发生的时间了,因为这些时间相关的函数都是通过定时器来计算时间的,定时器降频了,所以时间变慢了,要回到正确的时间上必须对时间进行处理,比如我是clock_div_8,那么millis()需要乘8,delay()需要除以8

    相关文章

      网友评论

          本文标题:ATMEGA328P(Arduino Pro Mini)超低运行

          本文链接:https://www.haomeiwen.com/subject/wofurrtx.html