设计低功耗嵌入式系统需要考量的因素(一):一般设计考量
在我们的生活中充斥着各种微型供电设备及系统。着写嵌入式系统需要长期使用电源供电,但是频繁更换的电源使得功耗更大。本文介绍了设计低功耗嵌入式系统需要考量的设计因素和利弊权衡。
及早规划可以在优化系统实现低功耗的同时,减少对返工和/或代码重新编写的需求。这些考量包括:
1. 应用层面的低功耗设计;
2. 了解功耗与性能之间的利弊权衡;
3. 使用可优化功耗的软硬件技巧。
嵌入式应用中的功耗因素
任何给定系统中的功耗都可分为两大类:
i. 静态功耗:静态功耗指器件在未运行代码、等待特定事件触发系统唤醒至工作模式时所消耗的电源。静态功耗的主要来源包括系统中流过的漏电流、模拟偏差、不能关闭的模块以及运行RTC、看门狗定时器和中断控制器等独立代码的模块。该电流与器件的工作电压成正比。工作电压越高,漏电流就越大;
ii. 动态功耗:系统处于工作状态,CPU执行程序代码时所消耗的电源称为动态功耗。系统的动态电流取决于工作频率、电压以及有关总线与电路设计的寄生电容。计算方法为:
P = V2 * f * C
V为电压、f为工作频率、C为输出端的寄生电容
静态与动态功耗的图形表达:
图1
对于任何给定的晶体管,其静态功耗在给定电源电压下基本上是恒定的。静态功耗源于漏电流(CMOS电路)或偏置电流(工作模拟电路),主要取决于系统类型。
晶体管中的动态功耗发生在电压转换过程中。在这些转换过程中,CMOS对会进入某个状态,在该状态下CMOS对的器件均部分开启,充当电阻器,从而可形成一种分压器电路。这种虚拟分压器电路消耗的电源要比所定义逻辑电平下的漏电流高很多。这就是为什么动态功耗与电路中的开关频率成正比的原因所在。因此在定义低功耗嵌入式系统时,它是最根本的注意事项之一,即要尽量减少系统的开关事件。
低功耗电池供电嵌入式应用的设计考量
1. 硬件考量:
a. 电池类型:
在嵌入式应用中主要有以下类型的电池:
i. )标准碱性电池
iii. )可充电电池: 可充电碱性电池,锂离子电池
iii. )钮扣电池
对于各种广泛低功耗嵌入式应用而言,为系统充电不是合理的使用案例模型。这里无需为这些应用使用可充电电池。我们来比较一下另外两种在低功耗应用中有用的电池以及在为设计选择电池时需考虑的因素。
标准碱性电池:标准AA电池的典型容量大约为1500mAh,不仅可轻松提供数百mA的峰值电流,而且还能够以50mA的恒定速率放尽电流。
碱性电池能为应用提供高峰值电流,因此系统能够在并列使用其全部专用外设(定时器与通信模块等)的同时,在其最高时钟频率下运行,从而可在尽快完成各项任务后,快速进入低功耗工作模式。
钮扣电池:钮扣电池具有极高的内部电阻,因此不能承受高峰值电流。在应用超过20mA的峰值电流时,即便持续时间很短,其有效电压也会大幅下降。因此对于使用钮扣电池供电的设计而言,强烈建议设计使用能在2V或以下电压下工作的组件。微控制器的掉电电压应低至能避免在钮扣电池提供高峰值电流时系统出现意外复位的水平。
此外,我们还需要采取预防措施来降低系统所需的峰值电流。降低峰值电流的途径包括:
● 降低CPU时钟频率
● 通过随时分配负载,避免一次性启用所有内部模块
● 在外部组件及内部模块未使用时,减少对它们的供电
b. 设置正确的微控制器:
要让低功耗应用中的静态功耗和动态功耗保持最低,最重要的是选择具有所需外设集的微控制器,其可在所需电源模式下工作。根据需要,系统设计人员可选择合适的微控制器,该微控制器支持低功耗模式下其应用所需的外设集。
以需要LCD较长时间工作的应用为例。通过选择可在低功耗模式下运行该LCD的微控制器,开发人员可最大限度降低功耗。这类微控制器的典型实例就是赛普拉斯的PSoC 4,其可让LCD显示器以仅3uA的流耗进入深度睡眠模式。复杂应用的情况类似,我们需要进行利弊权衡,确定能以最低平均功耗完成每项任务的适当微控制器。
c. 选择合适的无源组件:
上拉电阻器和下拉电阻器是支持接口开关及I2C器件等的常用组件。有时在低功耗设计中,这些上拉及下拉电阻器消耗的电源比系统其它部分还大。要降低其功耗,需要使用更大的电阻值。这样可降低流经它们的电流量。但它同时会增大RC时间常数,因此会降低系统对高频率信号的响应能力。
例如,为I2C线路使用高阻值上拉电阻器会降低I2C通信的速度,因为增大了I2C线路的压摆率。因此这些电阻器值可决定影响最终设计的各种因素之间的权衡取舍。
同样,在为设计选择电容器时,应避免电解电容器,因为它们具有极高的漏电流。薄膜电容器和陶瓷电容器能以合理的成本提供超低的漏电流,可考虑用于低功耗系统设计。
d. 审慎使用I/O:
避免在系统中随机分配控制器I/O引脚。如果引脚随机分布在不同端口,则需要对每个端口单独处理,这样会增加控制它们所需的寄存器写入数。为解决这一问题,可以按最小端口数对输入引脚和输出引脚进行分组,从而实现以最小的寄存器写入数完成读取与写入。
在引脚用于驱动LED和其它类似负载的地方,应使用引脚的开漏驱动模式,这些负载的一端固定在VDD或接地上。这种驱动模式可降低通过I/O引脚的漏电流,因此可降低功耗。
图2
e. 选择正确的外设:
在系统设计中应使用支持低功耗模式、在工作模式下支持低功耗的外设组件,以降低设计的总体功耗。
f. 审慎使用系统时钟:
定义系统时钟的行为有助于降低系统功耗。遵循通用系统时钟相关设计实践可帮助在几乎每个系统中实现低功耗。
● 在系统中使用低频率时钟降低动态功耗。
● 在执行计算密集型任务时提升系统时钟,可通过缩短完成任务的时间,降低平均功耗。
● 优先使用系统时钟,而非外部时钟。
● 在CPU等待通信传输完成时,应关闭CPU,只开启通信模块的时钟。在完成该任务后,它可获得一个中断信号,恢复代码执行。
g. 电流门控:
一般情况下,热敏电阻等无源传感器工作在分压器模式下,因此一直都在消耗系统电流。为降低这种情况下的功耗,我们可以在通过采样传感器网络获得相关数据之前为其提供电源,并在数据采样完成后切断电源。这在传感器需要定期读取的情况下才有用。
但当传感器必须保持工作状态才能检测环境中的异常现象时,CPU可在整个传感过程中保持低功耗模式。CPU一旦收到传感器的中断/数据信息,就会恢复工作模式。类似逻辑可用于读取开关状态,以判断它是处于开启还是关闭状态。
图3
2. 固件考量:
a. 减少函数调用:
每次函数调用都将涉及多重冗余运算,比如堆栈上的添加与取出运算(用于重新加载程序的计数器和寄存器)。这些运算的每一次工作都会耗用多个时钟周期,应尽量避免。对于简短函数而言,函数调用可采用能够布置内联代码的宏命令替换。这有助于减少CPU加载,进而降低相同运算所需的功耗。然而,每种方法都有其自身的优缺点。宏命令需要更大的存储器,这对写入高密度固件来说是一个问题,因为它可能会增大系统成本。
b. 为频繁重复的输入值使用查找表:
通常会有一部分输入值的使用频率大于其它输入值。通过创建与这些输入值对应的查找表,在遇到这些输入其中之一时,可缩短计算时间,进而可降低功耗。
这种方法在当完成计算后需要查找值的应用中比较容易看到,比如电机应用中角度正弦与余弦的计算。在这类应用中,会有一系列频繁遇到的值(相比之下,其它值遇到的频率较低)。正弦值或余弦值的计算需要较长的时间,因此对于该频繁重复的角度而言,其正弦及余弦的预计算值可存储在查找表中。每次遇到这些角度中的一种时,处理器便可查找该表,用在此找到的值进行替代,不必计算。
c. 使用中断,无需轮询:
在复杂的嵌入式系统中,CPU会花大部分时间来等待某项工作的完成,然后再进入下一个步骤。当前提供的大多数SoC都提供能在无需CPU干预的情况下完成大多数任务的硬件模块。在需要CPU干预时,它们会以中断的方式发出信号,唤醒CPU。例如一般在采样数据完成后,ADC会发出中断信号。这样就无需轮询来自ADC的数据。因此CPU可以进入低功耗模式,只在数据准备处理时唤醒。
d. 自适应时钟门控和电源门控
一个典型的系统会使用微控制器的多个模块,但在任何给定时间点上,不会同时使用所有的模块。因此可以对这些模块的时钟进行门控,降低这些模块的动态功耗,从而节省电源。此外,这也有助于降低峰值电流需求,这是钮扣电池供电设计的重要考虑因素。PSoC系列器件允许单独禁用未使用的模块。
这个部分我们讨论了创建低功耗嵌入式系统的常见设计考量。在第2部分中,我们不仅将讨论低功耗应用的实例、低功耗与系统性能的权衡取舍,而且还将提供使用上述技巧的低功耗系统设计实例。