3. 低功耗设计基础
在 SAM 系列 MCU 上做低功耗设计,第一步不是急着写代码,而是把“电到底花在哪里”这件事拆清楚。很多工程师第一次测到待机电流比数据手册高一个数量级,往往不是芯片本身的问题,而是没有区分清楚功耗的构成:一部分来自电路翻转,一部分来自漏电,还有一部分来自外部器件和引脚状态。只有把这三类来源分开,后面的优化才有方向。
功耗的三个来源
CMOS 电路的功耗可以粗略写成三部分之和:
P_total = P_dynamic + P_static + P_IO
= (α · C_L · V_DD² · f) + (V_DD · I_leak) + P_IO
其中 P_dynamic 是动态功耗,来自晶体管翻转时对负载电容的充放电;P_static 是静态功耗,来自亚阈值漏电、栅氧漏电和反偏结漏电;P_IO 是 I/O 及外部电路功耗,包括引脚驱动、上拉/下拉电阻、外部传感器和稳压器静态电流。对 SAM L 系列这类低功耗 MCU,运行态通常动态功耗占主导,而深度睡眠态静态功耗和 I/O 漏电占主导。
动态功耗公式里有两个关键变量:V_DD 是平方关系,f 是线性关系。这意味着把内核电压从 3.3 V 降到 1.8 V,理论上动态功耗可以降到约 30%;把主频从 48 MHz 降到 8 MHz,动态功耗降到约 1/6。这也是为什么低功耗设计总是优先考虑“降频降压”,而不是先改代码。
动态功耗:翻转才是消耗
动态功耗由翻转活动因子 α、负载电容 C_L、电源电压 V_DD 和频率 f 共同决定。α 表示每个时钟周期内节点发生 0→1 翻转的概率。对 SAM D21 这类 Cortex-M0+ 内核,外设时钟使能是控制 α 最直接的手段:不用的 SERCOM、TC、ADC 时钟一律关闭,α 自然下降。
实际测量时,可以用一个简单方法估算:让 CPU 在 Flash 中执行空循环,逐步降低主频,观察电流是否近似线性下降。如果电流下降明显慢于频率下降,说明有固定开销(如稳压器、振荡器、外设)在“兜底”,这部分就是后续要重点关掉的对象。
静态功耗:睡眠时也不能忽略
静态功耗在运行态可能只占几个百分点,但在深度睡眠态会成为主角。SAM L 系列在 Backup 模式下可以做到几百 nA 级别,但前提是:所有外设时钟关闭、RAM 保持策略正确、引脚不悬空、BOD 和看门狗按需配置。一个悬空的输入引脚可能因为输入级处于线性区而额外消耗几十微安,这比芯片本身的睡眠电流还大。
能量效率指标:不要只看电流
低功耗设计最终关心的是“完成一件事花多少能量”,而不是某一时刻的电流。常用指标有三个:
- 能量/任务 (E_task):完成一次采集、一次通信或一次计算所消耗的能量,单位常用 µJ 或 mJ。它等于功率对时间的积分。
- 平均功耗 (P_avg):在占空比工作模式下,P_avg = P_active × D + P_sleep × (1−D),D 为活动占空比。
- 能效比 (Energy per bit / per sample):例如 ADC 每次采样的能量、无线发送每比特的能量,便于横向比较不同方案。
举个例子:某节点每秒唤醒一次,活动 2 ms 消耗 3 mA,其余时间睡眠 1 µA,供电 3.3 V。则平均电流约为 3 mA × 0.002 + 1 µA × 0.998 ≈ 7 µA,平均功耗约 23 µW。如果把活动时间从 2 ms 压到 1 ms,平均电流几乎减半——这说明缩短活动时间和降低睡眠电流同样重要。
低功耗设计的基本方法论
把上面的关系落到工程上,可以形成一条清晰的决策顺序:先降活动能量,再降睡眠电流,最后压缩活动时间。
- 能不用就不用:关闭未使用外设的时钟和电源,禁用未使用的引脚并配置为确定电平。这一步通常收益最大、代价最小。
- 能慢就慢:在满足实时性前提下降低主频和内核电压。SAM L 系列支持多种时钟源,运行时可切换到 32 kHz 或 1 MHz 低功耗时钟。
- 能睡就睡:任务完成后立即进入最深可用睡眠模式。用事件系统(EVSYS)和 DMA 代替 CPU 轮询,让 CPU 尽可能长时间处于睡眠。
- 能短就短:优化算法和中断服务程序,减少活动时间。活动时间每缩短一半,平均功耗中活动部分就减半。
- 测量验证:用电流探头或功耗分析仪分别测量运行、睡眠、唤醒瞬态电流,与数据手册对比,定位异常来源。
一个可复用的参数记录表
下面这张表适合在项目初期填写,用来把“功耗预算”变成可核对的数字。示例数据为合理假设,实际应以测量为准。
| 工作状态 | 典型电流 | 持续时间/占空比 | 主要影响因素 |
|---|---|---|---|
| 运行(48 MHz) | 约 3.0 mA | 2 ms / 1 s | 主频、V_DD、外设时钟 |
| 运行(8 MHz) | 约 0.6 mA | 按需 | 降频后动态功耗下降 |
| Idle 睡眠 | 约 1.2 mA | — | CPU 停、外设仍运行 |
| Standby 睡眠 | 约 2 µA | 998 ms / 1 s | RAM 保持、RTC 运行 |
| Backup 模式 | 约 0.5 µA | 长期待机 | 仅 RTC/备份域供电 |
把这张表填完,平均电流和 E_task 就可以直接算出来,后续任何优化都能用同一把尺子衡量。低功耗设计不是一次性的技巧,而是一套“先分解、再优化、后验证”的循环方法:分解功耗来源,选择对应手段,用能量指标验证是否真正变好。掌握这个循环,再结合 SAM 系列具体的时钟、睡眠和事件系统,才能把数据手册上的低功耗数字变成自己板子上的实际电流。