2. MCU功耗模型:动态功耗与静态功耗
做低功耗设计,首先得搞清楚功耗到底从哪来。很多人一上来就翻数据手册,看那几个电流参数,其实容易看晕。我个人的习惯是,先把功耗拆成两大部分:动态功耗和静态功耗。这两者的物理机理完全不同,优化手段也天差地别。
核心公式(记牢这个):
Ptotal = Pdynamic + Pstatic
Pdynamic = α · CL · VDD² · f
Pstatic = Ileak · VDD
2.1 动态功耗:干活就要耗电
动态功耗,说白了就是MCU在“干活”时消耗的能量。每次CMOS管翻转,都要给负载电容充放电。你想想看,频率越高、电压越高、翻转越频繁,功耗自然就上去了。
公式里那个α(翻转活动因子)很有意思。它代表每个时钟周期内,门电路实际翻转的概率。我在项目中遇到过,有人把系统时钟从48MHz降到24MHz,电流只降了不到30%。为什么?因为外设还在满负荷跑,α没降下来。降频不降活,效果有限。
| 参数 | 物理含义 | 典型范围 | 优化方向 |
|---|---|---|---|
| α(活动因子) | 门电路翻转概率 | 0.1 ~ 0.5 | 减少冗余翻转、门控时钟 |
| CL(负载电容) | 门输出端总电容 | 10 ~ 100 fF | 减小走线长度、选小封装 |
| VDD(供电电压) | 核心电压 | 1.2V ~ 3.6V | DVFS动态调压 |
| f(时钟频率) | 工作频率 | 32kHz ~ 数百MHz | 按需降频、异步设计 |
实战技巧:动态功耗与VDD的平方成正比。这意味着,从3.3V降到1.8V,功耗直接砍到原来的30%不到。我做过一个BLE传感器项目,就是靠动态调压,把峰值电流从12mA压到了4.5mA。代价是跑不了最高频率,但传感器采集根本不需要那么快。
2.2 静态功耗:躺着也在漏电
静态功耗,就是MCU“睡觉”时还在消耗的能量。很多人以为进入睡眠模式就零功耗了,其实不然。CMOS管即使在关断状态,也有漏电流流过。工艺越先进,漏电越严重。
我记得第一次做低功耗项目,用了一颗40nm工艺的MCU。睡眠模式标称1μA,实际焊到板子上测出来3.5μA。查了半天,发现是GPIO上拉电阻没关,漏电流从IO口灌进去了。嗯,这里要注意:静态功耗不只是芯片内部的事,外围电路漏电往往更致命。
静态功耗的主要来源有四个:
- PN结反向漏电:温度每升高10°C,漏电流翻倍。夏天和冬天测功耗,结果能差好几倍。
- 亚阈值漏电:Vth越低,漏电越大。高速工艺的代价就是静态功耗高。
- 栅极漏电:氧化层越薄,隧穿电流越大。先进工艺的重灾区。
- 竞争漏电:输入电平处于中间态时,PMOS和NMOS同时导通。我踩过这个坑——IO口浮空,电流直接多了200μA。
避坑指南:我曾经在一个温控器项目里,把MCU进入Stop模式后的电流从2μA优化到了0.7μA,结果整机功耗还是超标。最后发现是板上的LDO静态电流吃了8μA。记住:MCU低功耗 ≠ 系统低功耗,电源芯片、电平转换器、甚至去耦电容的漏电都要算进去。
2.3 影响功耗的关键因素
搞清楚了动态和静态,我们来看看实际项目中哪些因素最影响功耗。我列了一个清单,按影响程度排序:
- 工作模式:Run vs Sleep vs Deep Sleep,功耗差三个数量级。选对模式比什么都重要。
- 时钟配置:PLL倍频、外设时钟使能、时钟树裁剪。很多人的MCU跑着48MHz,其实外设只需要1MHz。
- GPIO状态:浮空输入、上拉/下拉、输出电平。一个浮空IO就能吃掉几十μA。
- 外设使用:ADC、DMA、定时器,不用就要关。别偷懒只关时钟,要彻底关掉外设电源。
- 供电电压:能跑1.8V就别用3.3V。电压每降0.1V,动态功耗降6%左右。
- 温度:高温下漏电暴增。如果产品要在85°C环境工作,静态功耗预算要留足余量。
2.4 典型MCU的功耗分布
我们拿一颗常见的Cortex-M4 MCU(比如STM32L4系列)来拆解一下功耗分布。这张图是我在实际项目中测出来的典型数据:
从这张图可以看得很清楚:动态功耗占了绝对大头,其中CPU核心和外设是主要消耗者。但别忽视那18.4%的静态功耗——在睡眠模式下,动态功耗几乎归零,静态功耗就成了主角。
关键结论:
- Run模式下,动态功耗占80%以上,优化重点是降电压、降频率、减少冗余翻转。
- Sleep/Stop模式下,静态功耗占主导,优化重点是关外设、拉高IO、选低漏电工艺。
- 温度每升10°C,静态功耗翻倍。高温环境的产品,静态功耗预算要留2~3倍余量。
2.5 功耗模型的实际应用
理解了功耗模型,我们就能做一件很实用的事:估算电池寿命。我常用的方法是把MCU的工作状态拆成几个阶段,每个阶段算平均电流:
// 电池寿命估算示例
// 假设:2000mAh锂电池,MCU每10秒唤醒一次
// 阶段1:Deep Sleep (9.9秒)
I_sleep = 2.5 µA
T_sleep = 9.9 s
// 阶段2:Wakeup + 采集 (50ms)
I_wake = 8.5 mA
T_wake = 0.05 s
// 阶段3:处理 + 发送 (50ms)
I_tx = 15.2 mA
T_tx = 0.05 s
// 平均电流计算
I_avg = (I_sleep * T_sleep + I_wake * T_wake + I_tx * T_tx) / (T_sleep + T_wake + T_tx)
= (2.5µA * 9.9s + 8500µA * 0.05s + 15200µA * 0.05s) / 10s
= (24.75 + 425 + 760) / 10
= 120.975 µA
// 电池寿命
Life = 2000mAh / 0.120975mA ≈ 16528小时 ≈ 688天 ≈ 1.88年
实战经验:这个估算模型我用了好多年,准确度在±15%以内。关键是把每个阶段的电流和时间测准。我习惯用示波器+电流探头抓实际波形,比看数据手册准得多。有一次发现实际I_sleep比手册标称大了3倍,查出来是板上的上拉电阻没去掉。
最后说一句:功耗模型不是纸上谈兵。每次画板子之前,我都会拿这个模型跑一遍,看看理论寿命能不能达标。如果差太多,要么换电池,要么改方案。别等到板子打样回来再优化,那时候改动的成本就高了。