3. 低功耗设计基础:功耗来源、设计层次与常用技术概览
做嵌入式设计,尤其是电池供电的产品,功耗永远是绕不开的坎。我记得刚入行那会儿,觉得只要功能跑通了就行,功耗嘛,大不了换个大电池。结果被一个手持设备项目狠狠教育了一回——产品做出来,客户说待机撑不过一天,直接退货。从那以后,我养成了一个习惯:画原理图之前,先算功耗账。
这一章,我们就来把低功耗设计的底子打牢。搞清楚电都耗在哪了,从哪个层面去优化,以及市面上常用的招数有哪些。
3.1 功耗从哪来?动态 vs 静态
芯片的功耗,说白了就两大块:动态功耗和静态功耗。你想想看,芯片在工作时,就像一辆车在跑;停下来怠速时,又是另一回事。
| 功耗类型 | 物理本质 | 主导因素 | 典型场景 |
|---|---|---|---|
| 动态功耗 | 电容充放电 + 短路电流 | 时钟频率 (f)、电压 (V²)、翻转率 (α) | CPU 全速运行、外设频繁读写 |
| 静态功耗 | 漏电流 (PN结/栅极漏电) | 工艺制程、温度、电压 | 待机、休眠、深度睡眠 |
核心公式(记牢它):
Ptotal = Pdynamic + Pstatic
Pdynamic = α · CL · VDD² · f
Pstatic = Ileak · VDD
动态功耗很好理解。门电路翻转时,要给负载电容充电,这个过程必然消耗能量。频率越高、电压越高,功耗就呈平方级往上窜。我在项目中遇到过最典型的例子:一个 STM32F4 项目,主频从 168MHz 降到 80MHz,电流直接从 80mA 掉到 40mA,效果立竿见影。
静态功耗就有点隐蔽了。以前做 0.18μm 工艺的老片子,漏电流几乎可以忽略。但现在 28nm、40nm 甚至更先进的工艺,漏电流成了大问题。尤其是高温环境下,漏电流会指数级增长。我曾经在做一个户外传感器时,夏天暴晒下设备温度飙到 70℃,待机电流比常温下大了 3 倍多,排查了半天才发现是静态功耗在作祟。
避坑指南: 很多工程师只关注动态功耗,忽略了静态功耗。在低功耗待机场景下,静态功耗往往是决定电池寿命的关键。选型时一定要看芯片手册里的 Stop 模式电流 和 Standby 模式电流,这两个参数直接决定了你的产品能待机多久。
3.2 低功耗设计的五个层次
低功耗不是改一行代码就能搞定的。它是一个系统工程,从顶层到底层,每个环节都有文章可做。我个人习惯把低功耗设计分成五个层次,从高到低依次是:
- 系统架构层:任务调度、电源域划分、工作模式切换策略。
- 电路设计层:电源管理电路、DC-DC 选型、LDO 搭配、分时供电。
- 软件算法层:事件驱动、轮询改中断、数据压缩、算法复杂度优化。
- 器件选型层:低功耗 MCU、低功耗外设、低功耗传感器。
- 工艺与封装层:工艺制程、多阈值电压库、电源门控。
你想想看,如果系统架构设计不合理,MCU 每隔 10ms 就醒来一次处理一个无关紧要的任务,那后面再怎么优化电路、选多好的芯片,都是杯水车薪。反过来,如果架构设计得好,让系统 99% 的时间都处于深度睡眠,那功耗自然就降下来了。
我的经验: 做低功耗设计,一定要先抓大头。用电流钳或者精密电阻测一下系统各个模式下的电流分布,找到占比最大的那个模块,优先优化它。很多时候,一个无线模块的发射电流就占了总功耗的 80%,你花大量精力去优化 MCU 的几微安待机电流,意义不大。
3.3 常用低功耗技术概览
下面这张图,是我自己总结的低功耗技术全景图。你可以把它当成一个检查清单,做设计时对照着看,看看哪些技术还没用上。
下面我把这些技术展开说说,挑几个重点的讲。
3.3.1 电源管理技术
电源管理是低功耗的基石。我常用的套路是:大电流用 DC-DC,小电流用 LDO。DC-DC 效率高(80%~95%),但纹波大;LDO 纹波小,但效率低(压差越大效率越低)。
举个例子:一个传感器节点,MCU 核心电压 1.8V,电池是 3.7V 锂电池。如果用 LDO 从 3.7V 降到 1.8V,效率只有 1.8/3.7 ≈ 48.6%,一半的能量都变成热量浪费了。换成 DC-DC,效率能做到 85% 以上,续航直接翻倍。
我的习惯: 在原理图设计阶段,我会给每个电源轨加一个 0Ω 电阻或者磁珠,方便后期调试时断开测量电流。这个习惯救过我很多次——有一次产品功耗异常,我直接断开各个电源轨的 0Ω 电阻,逐个排查,很快就定位到一个传感器在休眠时没有关断电源。
3.3.2 时钟与频率管理
从功耗公式 P = α·C·V²·f 可以看出,频率 f 和电压 V 是影响动态功耗的两个关键变量。降低频率,功耗线性下降;降低电压,功耗平方级下降。
动态频率调节 (DFS) 和 动态电压调节 (DVS) 就是基于这个原理。任务重的时候,跑高频高电压;任务轻的时候,跑低频低电压。很多现代 MCU 都支持在运行时切换时钟源和调整内核电压。
我记得在一个数据采集项目中,MCU 大部分时间都在等待传感器数据,实际运算量很小。我把主频从 72MHz 降到 8MHz,同时把内核电压从 1.8V 降到 1.2V,电流从 25mA 降到了 3mA 左右。代价就是运算慢了点,但完全够用。
3.3.3 工作模式切换
这是最常用、也最容易被忽视的技术。现在的 MCU 基本都有多种低功耗模式:
| 模式 | 典型电流 | 唤醒源 | 适用场景 |
|---|---|---|---|
| Run (全速) | 几十 ~ 几百 mA | — | 数据处理、通信 |
| Sleep (睡眠) | 几 ~ 几十 mA | 任何中断 | 等待事件、短时空闲 |
| Stop (停止) | 几十 ~ 几百 μA | RTC / 外部中断 | 周期性采集、待机 |
| Standby (待机) | 几 μA 以下 | RTC / 唤醒引脚 | 深度休眠、超低功耗 |
避坑指南: 进入低功耗模式前,一定要检查所有外设的状态。我曾经犯过一个低级错误:进入 Stop 模式前没有关闭 ADC,结果 ADC 一直在后台采样,导致 Stop 模式电流比手册上大了 10 倍。排查了整整两天才找到原因。所以,进入低功耗前,逐个关闭外设时钟,把未用的 IO 口配置成模拟输入或上拉/下拉,这是标准流程。
3.3.4 外设与 IO 管理
很多工程师只关注 MCU 核心的功耗,忽略了外设。实际上,一个外设的功耗可能比 MCU 核心还高。比如一个 2.4G 无线模块,发射时电流可能高达 30mA,而 MCU 核心可能才 10mA。
我的做法是:用多少开多少,用完立刻关。具体来说:
- 不用的外设,在初始化时就把它的时钟关了。
- 需要用的外设,用之前打开时钟,用完之后立刻关闭。
- IO 口配置要小心:悬空的输入引脚会消耗额外的漏电流,最好配置成模拟输入或者内部上拉/下拉。
- 能走 DMA 的,就别让 CPU 去搬数据。CPU 搬数据时一直在跑,功耗高;DMA 搬数据时 CPU 可以睡觉。
一个典型的低功耗代码片段(伪代码):
void enter_stop_mode(void) {
// 1. 关闭所有外设时钟
RCC->AHBENR = 0;
RCC->APB1ENR = 0;
RCC->APB2ENR = 0;
// 2. 配置未用 IO 为模拟输入
for (int i = 0; i < 16; i++) {
GPIOA->MODER |= (0x03 << (i * 2)); // 模拟模式
}
// 3. 配置唤醒源(RTC 或外部中断)
RTC->CR |= RTC_CR_WUTE; // 使能 RTC 唤醒
// 4. 进入 Stop 模式
PWR->CR |= PWR_CR_LPDS; // 低功耗深度睡眠
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
__WFI(); // 等待中断唤醒
}
嗯,这一章的内容就到这里。低功耗设计不是一蹴而就的事,它需要你在系统架构、电路设计、软件实现等多个层面持续打磨。后面的章节,我们会结合具体的 EMC 测试案例,看看低功耗和电磁兼容性之间如何平衡——这两者有时候是矛盾的,但处理好了,就是高手和普通工程师的分水岭。