前言
随着物联网的兴起,各式各样的物联网设备涌向市场,这些设备有一个共同的特点就是电池供电,电池的容量是有限的,如何在电池容量有限的情况下延长设备的使用时间呢?万恶始于源头,最好的办法就是在设计中降低设备的功耗,设计又进一步分为软件设计、硬件设计。
硬件设计
根据低功耗的产品需求,一般会有两种方式,一种是平时处于断电状态,需要使用的时候上电即可,工作一会继续断电。另一种是一直处于待机状态,使用的时候,“唤醒”产品,工作一会继续“睡觉”。
低功耗产品一般是通过锂电池或者干电池供电的,前者主要用于易于携带或者移动的产品,比如,智能手表,共享单车等等,干电池应用的比较多的场合是智能门锁等,一般有3-4节干电池,用完电之后用户可以更换。
选取低功耗器件
这点自不必说,谁不选谁傻x,不选坑自己~
开关机电路设计
对于平时断电的设备,既然平时主要是断电状态,需要时开启,开关机设计必然少不了,接下来介绍一种实用的开关机电路。(关于此电路的详细解析,可参看:一种简单可靠的开关机电路设计)
AD采集电路设计
电池供电,电量的提示就很重要,如果说智能锁电池没电了,用户竟然一无所知,那不得骂娘,好好的一扇门,非要砸个窟窿才能进~
如果想要比较精确的采集电池电量,那一定是首选电量计,可是啊~设计者一切不得为了资本服务,为了节约成本,大家都懂得,有的厂家还是会采用简单的AD采集,根据电池放电曲线大概估算电量。
说到这里,来看一看,电池的放电曲线是怎样的呢?
电池供应商一般会提供给客户某款电池放电曲线,下面是某厂家提供的纽扣电池的放电曲线,其他电池其实也类似,可以明显的看到,新电池的“富裕电压”其实降得是非常快的,然后会进入一段非常长的“平缓期”,电池电量放的差不多的时候,又开始进入“快速衰老”期,可以看到,电量跟电压并没有什么严格的比例关系。
既然没有严格的比例关系,那如何根据电压来“计算(估算)”电量呢,负责的厂家会真枪实弹的做放电测试(谁知道厂家提供的是不是真实的呢),大量测试后,大概得出一个算法来模拟电压与电量的“近似关系”,根据电压大概估算电量,或者根据使用时间及次数,每次使用的功耗等,计算得出剩余电量。
所有这种都是“不太准确的”,但是只要能在彻底MCU“死掉”之前提醒用户换电池或者充电即可,我提醒了,你没换,那关我什么事~
言归正传,AD采集也需要做一些处理,如下图,这个电路分情况,在断电的设备情况下,这个电路是没问题的,但可能不是最好的,要注意,不能直接接在电池端,要接在受控的电源端,如果直接接在电池端,这两个电阻会一直耗电。
再来看一个AD采集的电路设计,如下图,相比于上面的设计,这个设计有什么好处呢?这个设计电压是可控制的,那只需要在采集的时候开启就可以了,采集完MCU控制关闭,相比于上面的电路,虽然多了几个器件,但在不需要的时候可以随时关闭,能够有效降低功耗,这种设计在不断电的设备中是要明显优于第一种设计的,因为电池是有一段“平稳期”的,1秒采集一次和1天采集一次可能都没有区别,所以降低采集频率,不需要的时候,把电源断开即可,很实用。
模块电源加控制
这点类似于上面的AD采集带电源控制,稍微改一下即可,物联网设计中可能会用到各种各样的模组。信息上报不频繁的情况下,可能1天几次或者几天1次,这时候可以考虑,是不是可以不用的时候把电源断掉,当然要考虑上电重新连接所花费的功耗与休眠状态下所花费的功耗,二者取其优,功耗差别不大的情况下,我觉得休眠是好的选择,毕竟频繁开关机会对模组有影响。
避免IO漏电
“漏电”是什么意思呢?漏水大家一定熟悉吧,容器开了个口,水往低处流嘛,一样的道理,MCU与模组或者与其他芯片之间免不了要进行通讯,拿最基本的串口来说,下面表格的连接方式通讯肯定没问题…
但是考虑一下,如果一个MCU不需要工作,下电以降低功耗之后会发生什么事情?
主MCU的RX一般会保持高电平以等待串口下降沿的到来,直连之后,这个高电平便会“漏电”到你下电的MCU,引起功耗的增大,设计中要避免这种IO直连的设计。
以上这种情况,可以采用信号隔离的方式处理,方法也很多种,简单介绍一种:
不需要工作时候,隔离芯片是没有电的,需要使用的时候,供电即可。
硬件设计小结
关于硬件的设计是方方面面的,大家伙一定要注意硬件设计上的低功耗考虑,成熟的电路也越累越多,小飞哥列举的不过皮毛,欢迎大家一起交流更多好的方案与考虑。
软件设计
低功耗从硬件上能够解决一部分,但单纯依靠硬件肯定是不行的,需要软件的密切配合,才能达到最好的效果。
软件设计通常需要考虑一下几种情况
GPIO引脚的模式配置
对于GPIO的模式,就拿STM32来说,模式多达8种,4种输入,4种输出,那应该配置为什么模式,系统功耗才会比较低呢?
仅讨论产品休眠模式下,GPIO的配置,正常工作按照需要该怎么配置就怎么配置就可以了~
对于没有用到的GPIO,需要配置为模拟输入状态
从cubemx中,可以看到有个选项,意思是,为了省电,不用的GPIO可以配置为模拟输入模式。
前面说了模式那么多,为什么选择模拟输入模式呢?
模拟输入模式:信号从左边编号1的端口进入,从右边编号2的一端直接进入ADC模块。这里我们看到所有的上拉、下拉电阻和施密特触发器,均处于断开状态,因此“输入数据寄存器”将不能反映端口上的电平状态,也就是说,模拟输入配置下,CPU不能在“输入数据寄存器”上读到有效的数据。
用到的IO同样需要关注,先来看一个由于IO配置不正确导致的功耗问题。
休眠模式一般能通过专门设计的唤醒引脚或者中断触发唤醒,例如,通过串口中断唤醒MCU,进而通讯获取数据等,由于串口协议起始位是低电平,所有MCU的RX要保持高电平才能更好地检测到数据,但如果仅仅是设置了输入模式,恐怕还不够,对比一下下面的配置结果:
仅仅配置了输入模式,硬件设计无上拉,软件未配置上拉,结果电流测出来有29uA,而正确的电流应该在0.7uA以下
再来看配置为上拉输入之后,电流降为0.63uA,恢复正常。
对于比较简单的MCU来说,GPIO模式可能比较少,并没有模拟输入的配置,设置下拉配置也没有,只有上拉,那也不用慌,对于此类MCU,可以配置为输入上拉或者输出低模式,输入上拉肯定没问题的,但是配置为输出低的时候要注意了,看下图:
此时若配置为了输出低,会产生什么结果?WC,竟然多了VCC/R6的消耗,很明显,此时配置输出低是不合适的,若外部无连接,配置输出低是没问题的。
关于GPIO的配置还有很多,要参考具体的外设进行适当的配置。
关掉不需要的外设
在休眠状态下,除了保留必要的功能外,应该关掉所有不需要的外设的时钟源,避免造成额外的功耗消耗。
降低时钟频率
时钟频率越高,必然会带来更高的能量消耗,能量守恒嘛,干活快,消耗的能量肯定大。可以降到够MCU“活着”就行了,拿出大学考试,“60分及格,多1分浪费”的精神。
在工作中还要学会频率的切换,比如有大数据需要运算,运算的时间要尽可能短以便及时响应,此时,就必须把频率切换到越高越好,但是计算完,比如是要显示出来计算结果,那刷屏速率,能满足即可,过高的频率反而会增加功耗。
下面是STM32F103的一个功耗表,可以看到,不同频率下的功耗差异还是很大的。
模式切换
此图与下面描述无关
MCU是设置了好几个工作模式的,在合适的模式下做合适的事情,是低功耗设计的一大特点。
来看看STM32的几个模式及功耗:
可以看出,频率相同下,模式不同,功耗差异巨大,同一模式下,频率不同,功耗也有很大不同。
如果觉得《软硬件低功耗设计》对你有帮助,请点赞、收藏,并留下你的观点哦!