技术干货 | 如何实现软硬件的低功耗设计与开发?

在产品工作过程中,为了达到更长久的续航能力,所以很多厂家都会采用低功耗模式,今天来介绍一下低功耗的一些方法。简单来说,低功耗实现可以通过硬件选型或者软件两方面进行实现。

技术干货 | 如何实现软硬件的低功耗设计与开发?

一、先从硬件上来分析,有哪些元器件选型上面可以实现低功耗

(1)DCDC电源部分:选用低压降、超低功耗DC-DC芯片:由于低功耗设备往往采用电池供电,一些锂电池随着电量的降低,输出电压也会降低,所以我们的DC-DC芯片要保证低压降,至少要能做到0.1V的压降下,仍能正常工作。
(2)开关控制电路:如果我们的外围中,有开关控制需求,比如ADC电压 采集、信号通断等,那么优先考虑 CPU低功耗时,IO口引脚默认为低电平。这样的话,本身GPIO为输出配置,输出低电平肯定要比输出高电平要保险一些(功耗),比如采用三极管实现通断,那么最好使用NPN的管子实现,因为NPN的管子,控制引脚为低电平,三极管不导通,这部分的电路相当于全部断掉,功耗比较小。

(3)对于一些的传感器,比如温度传感器芯片,如果这个传感器是超低功耗还好,但是多数情况下,传感器的功耗都是有的,即便是不测量的情况下,所以最保险的方式就是控制传感器的电源,这里面要特别注意,要控制整个传感器电源的源头,包括信号线上拉的电源,所以,还是考虑使用P沟道的mos管,mos管的S极接电源,D极给传感器电源和信号线上拉电阻供电,这样我们就能够通过IO口控制G极,实现整个传感器的完全断电了。

(4)外围模组供电:模组电源尽量不要使用LDO,多数超低功耗设备都是采用标准锂电池,所以选用的模组的工作电源要尽可能的与电池电压一致,而且需要宽范围,如果不一致,就要使用LDO,多使用LDO就涉及到产品的成本和整体的功耗增加。

如果方案中涉及到通信模组,比如说NB-Iot模组、LoRa模组、蓝牙模组等,模组和外围芯片还不太一样,模组是一个特别大的耗电器件,这个耗电不仅仅在于发送数据时,还在于发送数据前的连接过程也是很费电的,所以如果想要采用直接断电的方式就要好好的衡量一下,是否得不偿失,比如说NB-Iot模组,每次的数据发送,都要经过很漫长的连接过程,举例,可能整个数据发送过程是50秒,那么连接过程可能就要48秒,因为一旦连接成功后,发送数据就很快了,所以NB-Iot模组都有一个叫做PSM模式的东西,这个时候,我们就要采用它本身的PSM模式了,而不是直接断电,因为NB-Iot的PSM模式普遍功耗都特别低,小于10uA。

另外由于模组需要一直带电运行,如果我们添加了mos管进行备用控制,mos管的控制电路本身也有功耗,这部分的功耗也是需要考虑的,所以,可能比较合适方案是,将电池的输出电压直接给模组供电,模组的外围接口比如reset、唤醒引脚等都接入到CPU,这样就能最大可能的保证模组的稳定。

二、软件方面降低功耗,可以从以下几方面进行着手

在M3中,提供三种模式,sleep stop standby模式。具体区别在相应文档中有详细说明。stop模式,也就是深度休眠,需要将功耗降低到1mA以下。通过按键和串口可以将设备唤醒,并继续工作。

(1)进入休眠模式前,需要配置好唤醒中断,库中有提供相应的进入stop模式的函数void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry),调用这个函数就可以进入到stop模式了。 在进入到stop模式或者其它的省电模式的时候需要手动关闭自己外设的时钟,有的cpu在汇编中会做好,但是更多的cpu没有做这一步所以这些动作都要我们来完成。

(2)原理图仔细分析判断,哪些元件会损耗电流(尤其关注电阻,还有芯片),如果相应芯片在stop模式中不需要工作,那么在设计上可以考虑用多余的管脚来控制这个芯片的VCC来达到stop模式下不工作。

(3)未使用的管脚按理来说,应该要配置成浮空输入,这样就不会产生压降差,也就不会有电流的损耗(有的cpu管脚默认就是浮空输入的状态)。这点尤其注意。我用的这款stm32f4XXcpu不知道为什么是需要配置成下拉输入才会不消耗电流。(没有去细究,已经牵扯到了架构了)

通过以上3步基本上可以完成stop模式的功耗要求了。

第二个,在sleep模式下需要打到省电的目的,但是这个时候USB要保持在工作状态。 
如果同样使用stop模式的话会关闭所有的外设电源,这个时候唤醒了设备然后进行USB通信,由于USB通信是需要相对较长的交互过程,如果使用stop模式的话在唤醒的这几毫秒内USB与上位机还没有交互完成,会导致通讯数据丢失。

(1)ST库中没有给出相应进入sleep模式的函数,但是通过调用__WFI()就能进入到sleep模式,这时尤其需要注意对MPU中的(vu32 *)((u32)0xE000ED10) &= ~((u32)0x00000004);这个位的清除,否则进入的是stop模式。

所以我们可以模拟stop模式下的操作: 
关闭所有可以关闭而又不需要使用的电源时钟。 
然后采用wile()循环来监控是否有唤醒事件。如果有就跳出。 
采用这个方式最终也将sleep功耗降低了15mA左右。
退出休眠模式操作 
退出休眠模式后的第一件事情是将之前配置的管脚全部还原成工作状态,开启被关掉的时钟等等。

来源:瑞奇Ricky

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年1月11日
下一篇 2021年1月11日

相关推荐