系统功耗管理---耗流测试指导

耗流测试指导

耗流测试概述

有多种方法可以测量模组消耗的电流。首选方法通常是使用专用功率分析仪。功率分析仪通常能够根据电流大小自动切换电流测量范围,采样频率和精度也较高。可以精确测量电流,并记录具有大动态范围的电流消耗。

除了功率分析仪外,也可以用电流表来测试模组耗流,但电流表的范围并不能动态变化,故难以记录动态范围较大的模组耗流。

需要注意的是,若要测试准确的模组电流,需要尽量排除外围电路的影响,最好将模组电源直连到功耗仪上。

耗流测试前的准备

首先,将功耗分析仪的电压调整到待测设备的额定电压(注意,这一步必须先进行,防止给待测设备输入过高电压导致损坏),将功耗分析仪的输出和GND连接到待测设备的输入引脚上(对蜂窝通信模组而言,供电引脚一般称为VBAT,部分模组有两路独立的VBAT, 分为VBAT_RF和VBAT_BB,都要连接到功耗分析仪上)。

对于上图的耗流待测设备而言,模组供电来自于红框内的VBAT,底板上其它器件的供电来自于底板DC电源或USB,因此,VBAT的耗流就完全是模组功耗。

检测耗流测试环境

在进行耗流测试前,我们应检测耗流测试的健全性。用已知功耗符合标准的待测设备,接入当前测试环境并测试耗流。

将此时获取的结果和标准耗流进行对比,若数据与标准相符合,则本测试环境是符合要求的,可以进行功耗测试。反之,需要排除影响耗流检测结果的因素。

测量关机耗流

待测设备硬件连接完毕后,不进行开机,断开USB_VBus,即可直接测量关机电流。此时,模组不工作,对外的输出引脚也全部拉低或悬空,整体平均耗流保持相对稳定,基本都在uA级。

测量模组休眠电流

完成关机电流测量后,长按powerkey开机,模组开机默认的功耗模式是IDLE,我们需要调用休眠相关的接口,让模组在空闲时进入休眠,操作方法参见autosleep相关API说明。设置完休眠后,注意断开USB,USB连接时模组无法进入休眠。

进入休眠模式后,模组应有的耗流波形会有周期稳定的凸起,这就是上文所述的DRX周期,如下图:

因为单个DRX周期的功耗具有一定随机性,此时模组平均耗流的计算应选取数个完整的DRX周期,取平均值。如上图,即是选取了三个完整周期,算出此时休眠的平均耗流。功率分析仪一般提供了特定时间段内平均耗流的计算功能,选取数个DRX周期即可。

测量开机时模组的底电流

完成联网情况下耗流测试后,重新连接USB,指令模组将射频关闭,接口见此处net - 网络工作模式配置 。配置完成后,断开USB,观察耗流,此时模组空闲且射频被关闭,所耗的电流是模组休眠时可达的最低水平,这时候的电流一般可称之为底电流:

底电流近似一条稳定直线,选取一段平均电流即可。

测量PSM电流

测量PSM耗流之前,我们要设置PSM模式并检测是否生效,应用方法和检测PSM是否生效的方法可参照前文PSM模式

确认能正常进入PSM休眠后,断开USB,我们开始测试。等待ACT定时器超时后,我们可查看PSM休眠下的底电流。

如图可见,PSM的底电流远低于普通的autosleep模式,和关机耗流的大小、特征较为相似。

PSM会定期被TAU定时器唤醒,完成网络交互,所以会有一个周期和TAU相符的耗流尖峰:

同样,PSM平均耗流需要取多个周期计算平均值

常见的耗流源以及排查思路

软件和硬件的设计失误均会导致模组耗流无法达到预期水准,以下介绍一些常见的唤醒或耗流源,以及对应的排查思路。

1.代码运行

在任何线程中,代码运行必然会导致模组定期唤醒,此时的耗流特征为:底电流符合要求,但不能一直保持休眠。如果代码持续运行或两次运行的间隔时间过短,模组就无法进入休眠。

import utime

while 1:
    print("Can't sleep!")#软件耗流源例1:死循环,任何线程出现死循环时无法进入休眠
    utime.sleep(1)#任务运行的间隔足够长时,在两次运行的间隔可以进入休眠,但任务再次运行时,模组将被唤醒

排查思路:分解业务逻辑,逐个关闭运行的代码块,当出现某一块逻辑关闭后,耗流恢复预期。则可定位此处逻辑是否有异常唤醒。

2.定时器

定时器,包括osTimer、RTC和硬件定时器,超时都会唤醒模组,此时的耗流特征为:底电流符合要求,但不能一直保持休眠。如果两次超时时间过短,模组会无法进入休眠。

import osTimer
 
def test_cb(arg):
    print("Will wakeup!!")
# 创建os定时器
timer = osTimer()#软件耗流源例2:定时器,定时器超时会唤醒模组
# 启动循环定时器,未停止就会一直定期唤醒
timer.start(10000,1,test_cb)

排查思路:分解业务逻辑,逐个关闭定时器,当出现某一个定时器,耗流恢复预期。则可定位此处定时器是否有异常唤醒。

3.外设通信
外设通信,包括SPI、串口和I2C等。这些外设通信需要高速时钟的保障,因此通信时无法休眠。此时的耗流特征为:底电流符合预期,但不能一直保持休眠,唤醒行为和外设是否来数据有关。

排查思路:

  1. 关闭外设通信,寻找是哪一路通信引发的模组功耗异常。

  2. 排查对端,与模组通信的时间和频率是否符合需求。

  3. 如果对端发送不可控制,而模组又需求进入休眠,可在休眠前关闭响应的外设,不接收对端的数据。

4.休眠锁

休眠锁会直接锁定RTOS状态,使之在模组空闲且使能过休眠的情况下,仍保持在IDLE,而非进入sleep。此时无法进入休眠,模组空闲时耗流特征和模组IDLE耗流对应。

排查思路:
模组日志中一般可见休眠锁阻止休眠的条目,可通过日志分析是否有休眠锁未释放。

5.硬件漏电
在实际应用中,常出现某电压域漏电的情况。对整机而言,任何电压域产生漏电(例如:不经电阻接地、电压域内元件异常耗电等),就会引起整体耗流上升。此时的耗流特征为:底电流不符合预期,但开启和关闭休眠能观察到明显的耗流变化(即模组能正常进入休眠,但底电流不符合预期)。

排查思路:

  1. 对于模组IO能够控制的电压域,根据实际情况做拉高或拉低处理,原则是将电压域的电源切断。对于切断后耗流下降显著的电压域进行排查,检查是否有对地漏电或元器件异常耗流。

  2. 对于模组无法控制的电压域,可在硬件上做断开处理,对于切断后耗流下降显著的电压域进行排查,检查是否有对地漏电或元器件异常耗流。

常见的耗流器件:

  • LCD:背光和驱动芯片均有耗流,如果LCD持续刷新,还会导致模组无法进入休眠,休眠时LCD应停止刷新并熄屏

  • 上拉电路:没有电阻或二极管进行扼流时,上拉电路对低电平会产生较大漏电

  • 电平转换芯片:部分电平转换芯片输入阻抗较低,漏电流较高。

  • audio 功放电路:漏电流较高,不用时应关闭

  • 触摸芯片:耗流较高,进入休眠时可指令触摸芯片进入低功耗或直接关闭

  • PHY网卡:耗流较高,进入休眠时应控制网卡进入低功耗(但为了保持网络连接,此设备不能关闭)