低功耗总结(IOT)

本文主要讲低功耗的调试思路,而不涉及具体代码

一、开发环境

  硬件环境:STM32、STM8、CC2541

  软件环境:蓝牙协议栈4.0

二、概述

随着物联网的兴起,低功耗越来越让人们看重,接下来讲一下低功耗的本质。

  低功耗实质上就是让产品间歇性工作,比如说一个温度检测的产品,在正常使用中,我们并不需要知道每时每刻的

温度,大多数时候我们想要知道的只是某个时间段里的平均值,那么这个时候我们就可以设置成每5S采集一次温度值,

每分钟通过蓝牙向APP发送一次数据。那么在这一分钟内,MCU的工时常不会超过2S,蓝牙的工作时常也不会超过2S,

这样整个系统的工作时常就变为原来的1/30,功耗自然也就降下来了。(当然会有更合理的分配方式,你可以根据具体

的项目需求去做调节)

三、调试

 低功耗的调试一般分为以下几个步骤:

1、休眠模式的设置;

2、I/O口状态的配置;

3、硬件电路的调试;

4、各个功能之间的工作间隙。

现在从上面四个方面进行深入的分析:

1、休眠模式

  现在越来越多的芯片具有休眠模式,主要也是针对低功耗这一要求而设计的,比如STM32、STM8、MSP430、

还有一些蓝牙芯片等。

以STM32为例,可以分为三个模式,(1)正常工作模式;(2)休眠模式,可通过RTC定时器或外部中断唤醒;

(3)深度睡眠模式,可通过外部中断或者复位唤醒。

电流的大小:I1 > I2 > I3

不同芯片的电流值不同,一般休眠模式的电流可以达到10μA以下,而深度睡眠可达到2μA以下,甚至接近0μA

休眠模式与断电是有本质区别的。比如说,我们将某个引脚设置为输出高电频,当我们断电的时候,它自然而然就

会变为低电平了,但如果是进入休眠模式的话,它依然会保持高电平。就跟人睡觉一样,你睡觉前,房间的布置是怎么

样的,第二天醒来,房间的布置还是和原来一样的。所以说,并不是进入了休眠模式,功耗就一定会降低,这也是我们

经常会犯的一个错误。

实际上,我们要做的是将板子上每条可控的线路的电流调到最低值,我们要做的有这几个方面:(1)将MCU的主

时钟降到最低;(2)将没用的外设全部关闭,需要用到时再开启,例如外挂芯片、ADC或者DMA等;(3)I/O口状态

的配置。

2、I/O口状态的配置

在很多文章中都有提到“休眠模式下,I/O口应该设置为低电平输出”。但在实践的过程中,发现其实这句话只讲对

了一半,正确的做法应该是,板子上没有走线的引脚,设置为低电平输出;有走线的引脚,要根据具体的电路去设置。例

如下图显示,我们先忽略元器件A那边的状态,假设我们将P1.0设置为输出低电平,那么分析电路图,我们可以很快的知

道,此时这一线路上的电流为I = VCC/R;如果将P1.0设置为输出高电平,那么产生的电流可以说几乎为0。

再者,大多数外围元器件的片选脚都为低电平触发,倘若设置为输出低的话,那么无疑会增加几个mA的电流。

对于有走线的I/O口,一般分成以下几种情况,(1)LED灯要低电平触发的,则设置为高电平;(2)对于原本为

输入的引脚,可以设置为高阻态或者浮空状态(GPIO_MODE_OUT_OD_HIZ_SLOW/GPIO_MODE_IN_FL_NO_IT);(3)输出引脚,则根据

具体电路,去设置输出高或者低,也可设置为浮空。

3、硬件电路的调试

如果经过以上两步,电流还没有达到理想的状态,那么可以对硬件电路进行适当的调试。

比如一些基本的元器件是不是选用了低功耗的,或者说某些电容值、电阻值是不是偏小了。对于低功耗的产品,在

电路设计阶段,需要特别的考究,很多元器件的型号很多,类别也很多,很多低功耗的元器件都可以做到电流低于1μA

4、各个功能之间的工作间隙

这一步是针对正常工作模式下降低电流的,把每个功能岔开时间去工作,这样子同一时间内的电流就不会是叠加状态

了。比如,功能1为采集温度数据,功能2为采集ADC数据。如果功能1和2同时工作,那么电流则为I = I1+I2,功耗

W = I * T;如果为间隔工作,那么假设电流为I1=I2=I/2,功耗则为W = I1 *T/2 + I2*T/2 = I*T/2,功耗为原来的一半。

假设原本的工作电流为15mA,且为持续工作,则1分钟内的功耗为W = 900mAs。如果改为休眠模式,假设休眠电流

为0.5mA,休眠时间为5S(每5S工作一次),则功耗为W = 180 + 24 = 204 mAs,功耗为原来的22%

四、蓝牙低功耗

由于蓝牙的特殊性,这里单独一节进行讲解。

CC2541也是分为三种模式,我们这里讲它的休眠模式,由于是基于协议栈的,所以它的休眠模式相对简单,只要在预处

理的时候,增加power_saving定义就可以了,但很多时候我们会发现,即便定义了power_saving,功耗依然很大,难道是没

有配置成功吗?要解释这个问题,必须要理解清楚CC2541休眠模式的原理。它的休眠时间是由协议栈自己去设置的,由这个

函数osal_pwrmgr_powerconserve可以知道,休眠时间取决于你的定时事件,如果你的下一个事件是500ms之后执行,那么

休眠时间就是500ms;那么如果说一个定时100ms的任务,那么休眠时间则为100ms,那当我们去测量电流的时候,我们几乎

是测不出它的休眠电流的。

除了设置休眠模式外,还要去关闭一些没必要的定时任务,或者适当的延长定时时间,也可以将这些任务改为中断触发的

方式去运行。

以上就是全文,如有不对的地方,麻烦请指正。

猜你喜欢

转载自blog.csdn.net/Smile_Smilling/article/details/79284976