第2章:MCU功耗模型——动态功耗与静态功耗的物理原理
做MCU低功耗设计,你首先得搞清楚一个问题:功耗到底从哪来的?
我刚开始做嵌入式那会儿,总觉得功耗是个玄学。代码跑起来电流大,睡下去电流小,仅此而已。直到有一次做电池供电的物联网项目,产品死活撑不过标称的续航时间,我才老老实实把CMOS电路的功耗公式翻出来啃了一遍。
嗯,这一啃就发现,其实功耗的物理原理并不复杂。说白了就两大类:动态功耗和静态功耗。咱们一个一个说。
2.1 动态功耗:芯片干活时烧的电
动态功耗,就是MCU在“动”的时候消耗的能量。比如CPU在跑代码、外设在传数据、GPIO在翻转电平——这些时候都在烧动态功耗。
动态功耗又分两部分:
- 开关功耗(Switching Power)——给负载电容充放电
- 短路功耗(Short-Circuit Power)——PMOS和NMOS同时导通时的漏电流
先看开关功耗。这是动态功耗的大头,公式长这样:
P_sw = α × C_L × V_DD² × f
解释一下每个参数:
| 参数 | 含义 | 典型值/范围 |
|---|---|---|
| α | 翻转活动因子(0~1) | 0.1~0.5(取决于代码) |
| C_L | 负载电容 | 几pF到几十pF |
| V_DD | 供电电压 | 1.8V / 3.3V |
| f | 时钟频率 | 几MHz到几百MHz |
这个公式里有个关键点:V_DD是平方项。电压降一半,开关功耗降到四分之一。我在项目中遇到过,把MCU从3.3V降到1.8V,同样跑48MHz,电流直接砍掉60%以上。所以低功耗设计的第一条铁律就是——能用低压绝不用高压。
再看短路功耗。它发生在信号翻转的瞬间,PMOS和NMOS都处于半导通状态,形成一条从V_DD到GND的直流通路。公式是:
P_sc = t_sc × V_DD × I_peak × f
其中t_sc是短路导通时间,I_peak是峰值短路电流。这部分通常占动态功耗的10%~20%,不算大头,但也不能忽略。
2.2 静态功耗:芯片睡觉时也在漏电
静态功耗,就是MCU进入睡眠模式后依然在消耗的那部分能量。很多人以为芯片睡了就不耗电,其实不然——晶体管关不断,电流一直在漏。
静态功耗主要来自四个漏电流路径:
- 亚阈值漏电流(I_sub)——V_GS低于阈值电压时,沟道依然有微弱电流
- 栅极漏电流(I_gate)——栅氧化层太薄,电子直接隧穿过去
- 栅极感应漏电流(I_GIDL)——漏极高电场在栅极下方感应出的漏电
- 反偏PN结漏电流(I_rev)——源/漏与衬底之间的PN结反向漏电
其中亚阈值漏电流是老大,占静态功耗的80%以上。它的公式是:
I_sub = I_0 × 10^(V_GS - V_TH) / S
这里S是亚阈值摆幅,理想值是60mV/decade,实际工艺下约80~100mV/decade。什么意思呢?就是阈值电压V_TH每降低100mV,亚阈值漏电流就增大10倍。
所以你看,低功耗MCU为什么喜欢用高阈值电压(HVT)的晶体管?就是为了压住这个漏电流。
2.3 CMOS功耗公式:把两笔账合起来算
把动态和静态加起来,就是CMOS电路的总功耗:
P_total = P_dynamic + P_static
= (α × C_L × V_DD² × f) + (V_DD × I_leak)
这个公式看着简单,但实际项目中怎么用?我举个例子。
某次做NB-IoT终端,MCU大部分时间在睡眠,偶尔醒来发数据。睡眠时静态功耗是2μA,醒来时动态功耗是10mA。如果每10分钟发一次数据,每次发100ms,那么平均功耗是:
P_avg = (睡眠时间 × 静态功耗 + 工作时间 × 动态功耗) / 总时间
= (599.9s × 2μA + 0.1s × 10mA) / 600s
≈ 2μA + 1.67μA
≈ 3.67μA
你看,虽然动态功耗峰值很高,但因为占空比极低,平均下来静态功耗反而成了主角。这就是为什么低功耗设计要同时优化动态和静态,不能偏废。
2.4 功耗模型的知识结构
下面这张图把本章的核心逻辑串起来了。你可以把它当作功耗分析的思维导图:
2.5 动态功耗 vs 静态功耗:一张表说清楚
为了方便对比,我把两者的关键差异整理成了一张表。做功耗分析时,先对照这张表判断你的系统属于哪种类型:
| 对比维度 | 动态功耗 | 静态功耗 |
|---|---|---|
| 产生原因 | 信号翻转、电容充放电 | 晶体管关不断、漏电流 |
| 主要公式 | α·C_L·V_DD²·f | V_DD·I_leak |
| 与电压关系 | 平方关系(V_DD²) | 线性关系(V_DD) |
| 与频率关系 | 线性正比 | 无关 |
| 与温度关系 | 弱相关 | 指数正相关(温度每升10°C,漏电翻倍) |
| 与工艺关系 | 随工艺微缩略有下降 | 随工艺微缩急剧上升 |
| 典型占比(高速运行) | 90%~99% | 1%~10% |
| 典型占比(深度睡眠) | 0%~5% | 95%~100% |
这张表我建议你截图存着。每次做功耗仿真前,先对照它判断你的系统处于哪个区间,然后针对性优化。
2.6 为什么功耗模型对仿真工具这么重要?
你可能会问:知道这些物理原理,跟我用功耗仿真工具有什么关系?
关系大了。功耗仿真工具本质上就是在模拟这个CMOS功耗公式。工具会读取你的代码执行轨迹、外设状态、时钟配置、电压设定,然后根据内置的功耗模型,估算出每个时间点的动态功耗和静态功耗。
如果你不理解功耗模型,你就看不懂工具给出的结果——为什么这里电流突然跳了10mA?为什么睡眠模式下的漏电流比手册标称值大了一倍?这些问题的答案,都在功耗模型里。
举个例子。我在用某款功耗仿真工具时,发现工具估算的静态功耗总是比实测值低。后来查了芯片的datasheet才发现,工具默认用的是25°C的漏电流参数,而我的产品工作在45°C的环境下。根据静态功耗的温度指数关系,温度每升10°C漏电翻倍,45°C比25°C高了20°C,漏电应该是4倍。我把工具的温度参数从25°C改成45°C后,仿真结果就和实测对上了。
你看,不懂功耗模型,你连工具的参数都设不对。