超低功耗设计经验总结
从大学开始就断断续续的摸索超低功耗系统的设计,过程中也遇到了很多坑,通过前几次的迭代积累的经验,外加这段时间正好闲下来,完成了一个比较满意的超低功耗传感采集节点的设计,待机电流0.1uA, 工作时包括射频系统在内最大峰值电流30mA,理论上不考虑电池的自放电下,单节CR2032电池可以让设备工作数年. 总结一下经验以便后面的设计能吸取前面的教训,少走弯路。
几次迭代的产物:
目标
原始的目标就是设计一个小型的无线传感网络:
- 网络节点采用电池供电
- 电池续航寿命需要在至少要在1年以上
- 电池可更换
- 体积尽可能小
- 无线收发器需要一定的穿透能力,需要穿透数层钢筋混凝土
- 节点设备每天触发次数约5-20次
- 网络要求:
- 网络传输加密
- 可配置中继节点
- 支持丢包重传
- 能够识别重放攻击
过往的尝试
第一版
第一次设计是在大学的时候,作为一个探索小项目,在没有充分的考虑需求和实际设计指标的情况下盲目动手,结果可以说是完全失败的。这个设计采用了单节AA电池供电,一个DCDC-boost芯片负责升压供MCU、RF子系统和传感器共同使用。
- 没有电源分离,单独的使能引脚无法有效切断RF子系统和传感单元的静态电流。
- 升压电路芯片选型有问题,即便在提前根据手册的最大负荷预留了两倍的载荷,瞬态响应太差以至于在RF部分突然工作时电压瞬间大幅度下降从而影响稳定性,增加大的旁路电容改善有限。
- 升压芯片本身静态电流就过大,最终导致系统休眠功耗过高
- 缺少足够的调试接口和逻辑分析仪触点
第二版
尝试用自己设计RF电路来替代模块,并莫名其妙的选择了白色PCB,更改电池为单节CR2032电池,更换主控制器为MSP430F2272, 射频电路采用陶瓷天线替换原来的弹簧天线
- 白色PCB非常难以调试,覆铜和线路之间非常的不明显,难以定位
- 陶瓷天线衰减太大,无法满足穿透能力的需求
- 巴伦部分的分立元件质量把控不严(网购三无产品),射频的效果大幅度打折,甚至连26MHz晶振都发错了,将25MHz芯片标注为26MHz发货
- 加了一个MOS管来切断RF部分电源,但这个电路设计是有问题的,本身漏电流就不算太小
第三版
尝试使用第三方模块,但是这个模块要求3.3V以上供电,为了提高续航采用了两个CR2032串联的方式供电,增加更多的MOS管来完成电源管理和电平转换
- 大开脑洞的供电方式,为了避开升压、降压导致的损耗和静态电流,使用两个电池串联,MCU用下半个电池(2-3V)供电,而射频模块用两个电池(4-6V)供电,这种不平衡的供电方式会导致靠近地端的电池会更快的耗尽
- 第三方的模块在其上层封装自己的协议更加的复杂
- 第三方的模块的功耗更高,因为它并不单独的是一个RF收发器,同时增加了一个效率不高的LDO和功耗不小的MCU
第四版
更换了另一种模块只是单纯的继承了RF收发器和巴伦(先绕靠射频的调试),这样更宽的工作电压,不需要两个电池串联来提供更高电压,改成并联来提高总电池容量,这个版本也是雏形都具备了。另外装备了一个与第一版不同的DCDC升压模块给其他传感器供电,型号TPS61021A, 在EN关断时静态电流大概0.4uA,这部分仍然可以继续优化。
- 这个版本对于功耗的管理已经出局雏形,主要的精力用来设计和验证网络协议,并在压力与干扰环境中验证可靠性
第五版
有了前面的经验,这次设计做了进一步的修改:
- 电路上尝试取消RF模块而直接使用RF收发器芯片,并通过MOS可以直接切断其电源
- 在关键子系统的供电接口处串接0欧姆电阻,以用来进一步分析各种工作模式下,每个子系统的功耗情况
- 采用的芯片都考察了供电范围,使供电范围可以允许但纽扣电池(CR2032)供电而不再采用外部LDO或者DCDC,以提高效率和减少静态损耗
经验总结
宏观
在开始设计之初,应该花更多的时间思考:核心目标是什么?次要目标是什么?如何拆分这些目标并如何设计各个系统?可能会遇到何种困难并大致如何解决?
工程是一种权衡和取舍的过程,需要工程师在设计的时候考虑清楚各个方案的优缺点,包括但不限于各个方案的效果,系统复杂度,部署时间(是否具备一些技术储备以提高部署时间),可维护性和成本。
整体上,并不要太过于贪图一次成功或者一次就能实现所有功能,在电路、系统的复杂度,功耗,体积上同时追求最优。可以适当的放宽第一版的一些指标,比如牺牲体积,增加更多的调试接口和备用方案。
微观
I. 认真考虑核心需求,并围绕核心需求严谨的展开设计
比如低功耗传感设备,那么低功耗必然为核心需求,这就需要综合的考察到底多低才能满足需要,是一节AA电池还是一节纽扣电池?更换一次电池或者充电一次到底需要工作多久?休眠与工作的时间比例以及二者功耗的差异。
II. 开始具体的设计前,关键的电路要进行仿真,确保漏电流,负载电流和环路响应在内的各种指标达到需求,并留有足够的冗余
在设计电路前能充分的了解电路的特点和对应元件参数的调节会为后期实际硬件的调试避免走很多弯路,节约大量时间。
III. 不同的功能单元具有单独的电源域,独立控制
一个系统中,从低功耗唤醒中并不是所有的的单元同时开始工作,比如采集数据-整理分析数据-传输数据这种模型,不同阶段可以使能不同的单元,从而降低工作时间的峰值功耗。
IV. 不要盲目相信芯片、模块的使能引脚
很多芯片、模块提供了使能引脚,前面提到的单独控制时,使能引脚,设置包括复位在内,并不能等同于电源控制,使能或者复位仅仅是让门电路停止翻转,而并不是关断电源或者设定到一个适合的状态从而满足最低功耗的需求。比如我们最近设计的芯片,如果是拉低复位,SoC的电流反比最低功耗睡眠的情况下大很多。这种情况下,独立的外部电源控制电路是必要的。
V. 电阻-电阻-电阻
很多平常用的电路中,电阻的大小需要进行调整,比如10K上拉,如果是3.3V供电,电路导通的时候流过电阻的电流大约就是0.33mA。适当增大电阻可以减小这部分消耗的电流,但是电阻越大,对于模拟电路而言热噪声越显著,而数字电路则需要考虑更好的电磁兼容设计,微弱的感应电流就有可能导致系统的误动作。
VI. 除了必要的硬件调试接口,关键的分路应该还预留有电流测试的接口
总电源处的电流测试点可以让测试者了解系统的整体功耗,但是一旦在开发过程中开始尝试优化系统功耗,能够快速了解每个子单元的功耗会对调试提供更好的指向性,节约许多调试时间。
VII. 了解分立元件
在追求极端的低功耗时,充分的了解每一个元件是大有益处的,借助可靠的元件供应商,使用具有具体规格的元件, 避免采购三无元件
另外一点,小批量时,用在同一处的元件尽量采用相同的供应商的元件。例如某特定的一个模拟电路中相同型号分离元件,比如同一型号的MOSFET可能有多个厂商提供,而不同的厂商生产的此型号MOSFET在某些极限指标并不相同。
VIII. 深入了解微控制器的低功耗模型
不同的微控制器具有不同的低功耗模型,有的SoC具备多个片内电源域,有的SoC并不是全内存保留(Memory Retention), 唤醒方式,唤醒时间皆不相同,需要根据具体情况和具体需求设计。
最近调试的低功耗芯片就是TI的MSP430F系列的微控制器, 这个MCU提供了多种低功耗模式的选择
手册提供的数据:
实际测试LPM3 (VLO->ACLK):
实际测试LPM4:
在MSP430中,LPM3和LPM4的使用范围又是有区别的,虽然LPM3、LPM4所有的寄存器和内存都是保留模式,但是LPM4会切断所有的时钟,只有外部中断能唤醒系统。LPM3会保留ACLK, ACLK可以来自外部低速时钟,也可以来自与内部的VLO,VLO的频率范围是4KHz-20KHz, 典型值是12KHz, 也就意味着LPM3下,MSP430可以通过内部timer自我唤醒。
IX. IO
正确的配置芯片的工作模式和GPIO,在超低功耗的情况下,IO的正确配置是至关重要的,工作模式下,整体功耗50mA,IO额外消耗的10uA是微不足道的,但是低功耗下,整个系统的功耗<=1uA时,IO导致的额外的10uA则是非常可观的了。而IO的配置并不是简单的把所有的IO配置为输入、输入就可以了,需要根据具体电路调整,有些需要配置为输入,有些需要配置为输出低,而个别IO,需要在低功耗状态下配置为某个状态而避免漏电流、灌电流,但唤醒后则需要切换到另外的状态
X. 慎重使用不熟悉的第三方模块
有时候采用第三方模块会大大简化系统和软件的设计,低功耗系统如何去集成第三方模块是需要综合考虑的,可能会简化设计,也可能会带来限制应用、工作范围。比如有些模块的工作范围是2.8V-5.5V,如果配合一节AA电池或者1节CR2032电池,那么这样的模块的使用是需要额外的升压电路的。典型的CR2032电池的放电曲线, 电池放电在2.8V以后仍然可以持续放电
而额外的升压电路则意味着功耗的增加和电路面积的增加
XI. 奥卡姆剃刀 - 简单才是硬道理
简单来说 - 一上来不要整那么复杂,优先实现最核心的功能并保持系统的低功耗状态,并在不断增加功能-升级优化驱动的时候关注低功耗的变化,避免在某些情况下,修改了外设而这个外设会在低功耗的情况下带来意想不到的变化。
XII. 优先设计软件模型,并在可能的开发环境下验证软件
在不能充分了解软件-硬件系统的情况下,很多时候会出现硬件设计完了,软件的很多地方无法适配需要更改硬件或者更改软件原有架构。一个简单的例子时,一些I2C从设备是支持clock stretching的,而如果I2C主设备不支持,这样则无法有效使用SoC的硬件I2C,此时如果软件更换采用GPIO bit-banging, 则需要考虑是否屏蔽中断,包括优先级更高的中断从而保证时许,这会带来整体软件设计的新的挑战,而在设计的早期能认识到诸如此类的问题,对于系统的整体规划和设计是大有帮助的。
XIII. 追求某些极致的参数时,分两步设计可能可能会更节约时间
在复杂的设计中出现意料之外的事情可以说是很难避免的,而第一版设计可以放宽某些特性,比如电路板的面积,增加更多的硬件-软件调试接口的测试点,第一个版本更加关注功能的实现,当一些就绪后,随后可以进行第二个版本减小面积,降低成本。这样即便第二部出现新的问题,也能通过和第一个版本比较从而更快的定位到问题所在
XIV. 考虑好高低功耗状态的切换
既然是低功耗系统,那么必然会有频繁的高低功耗状态切换,切换中,那些子系统,那些片内外设是需要保留,而另外一部分需要唤醒后恢复,切换过程中寄存器的配置,IO的配置以及软件结构体的维护都是需要考虑的。比如某些情况下,低功耗唤醒后需要进行部分初始化,这些初始化需要避开POR后初始化过的一些软件结构体和指针,在了解这些后,在最初设计驱动初始化API时就可以统一考虑。