3、电源域划分:核心域与休眠域、常电域与受控域、电源门控技术
电源域划分,说白了就是把板子上的电路按「什么时候需要用电」来分组。我刚开始做网关设计时,总觉得把所有芯片都挂在同一路电源上最省事。结果呢?待机功耗死活降不下来,客户说你这网关比冰箱还费电……嗯,从那以后我才真正重视起电源域划分这件事。
3.1 为什么需要划分电源域?
你想想看,一个典型的物联网网关里,有CPU、有Wi-Fi模块、有传感器接口、有以太网PHY、还有各种指示灯。这些器件不可能同时都在工作。比如半夜三更,网关可能只需要保持网络连接,其他功能都可以睡大觉。
如果所有器件都挂在同一路电源上,哪怕你软件上让它们进入低功耗模式,硬件上仍然会有漏电流。我见过一个项目,所有外设都挂在3.3V上,待机时CPU已经进入深度睡眠了,但Wi-Fi模块的漏电流硬生生把整机功耗拉到了200mW以上。
所以,电源域划分的核心目的就两个:
- 降低待机功耗:不用的电路直接断电,而不是让它「假装休眠」
- 提高可靠性:某个域出故障时,不影响其他域的正常工作
核心原则:能断电的,就别让它待机。能待机的,就别让它运行。
3.2 核心域与休眠域
这是最常见的划分方式。我习惯把网关的电路分成两个大域:
| 电源域 | 包含器件 | 工作状态 |
|---|---|---|
| 核心域(Core Domain) | CPU、DDR、RTC、唤醒逻辑 | 始终供电,即使休眠也保持 |
| 休眠域(Sleep Domain) | Wi-Fi/BLE模块、传感器、指示灯、音频编解码 | 休眠时断电,唤醒后重新上电 |
核心域是网关的「大脑」和「闹钟」。它必须一直在线,哪怕其他所有电路都断电了,它也要能监听唤醒事件。我个人习惯在核心域里至少保留:
- MCU或应用处理器的最低功耗模式(比如STM32的Standby模式)
- RTC模块,用于定时唤醒
- GPIO唤醒引脚,用于外部触发唤醒
- DDR的自刷新模式(如果使用外部DRAM)
休眠域则是可以「一刀切」断电的部分。我在项目中遇到过一个问题:Wi-Fi模块在休眠模式下仍然有1.2mA的电流,虽然手册上写的是「深度睡眠」,但实际上它还在监听Beacon帧。后来我干脆在它的电源路径上加了一个P-MOSFET,休眠时直接断开VDD,电流直接降到0。
我的经验:不要完全相信芯片手册上的「休眠电流」。很多芯片的休眠电流是在理想条件下测的,实际项目中往往会有漏电路径。最好的办法是:能断电的,就用MOSFET或负载开关彻底断开。
3.3 常电域与受控域
这个划分角度是从「电源控制方式」来考虑的。说白了就是:哪些电是一直有的,哪些电是可以通过软件或硬件开关控制的。
| 电源域 | 特点 | 典型器件 |
|---|---|---|
| 常电域(Always-on Domain) | 直接连接电源,不可切断 | RTC、唤醒逻辑、电源管理IC自身 |
| 受控域(Controlled Domain) | 通过开关管控制,可通断 | 外设模块、大功率器件、次要功能电路 |
常电域的功耗必须极低。我记得有一次设计,RTC模块的供电回路里串了一个100Ω的电阻,结果RTC的电流只有几微安,但电阻上的压降导致RTC电压偏低,时间跑不准。后来我把常电域的走线加粗到15mil以上,压降问题才解决。
受控域的设计要点在于开关管的选型。我常用的方案有两种:
- P-MOSFET方案:适合电流小于2A的场景,压降小,控制简单
- 负载开关芯片:适合需要过流保护、软启动的场景,比如给Wi-Fi模块供电
注意:受控域断电后,要确保该域内的所有IO口都处于高阻态或下拉状态。否则,断电的芯片可能会通过IO口从其他域「偷电」。我曾经因为这个原因,待机功耗多了3mA,查了两天才找到问题。
3.4 电源门控技术
电源门控(Power Gating),说白了就是用开关管把某个区域的电源彻底切断。这比单纯的时钟门控(Clock Gating)要狠得多——时钟门控只是不让电路翻转,但漏电流还在;电源门控是直接把电源掐断,漏电流为零。
实际项目中,我常用的电源门控电路长这样:
// 电源门控控制示例(伪代码)
// 使用GPIO控制P-MOSFET的栅极
void power_domain_on(void) {
GPIO_SetPin(POWER_CTRL_PIN, HIGH); // 关闭MOSFET(高电平关断P-MOS)
delay_ms(10); // 等待电源稳定
// 此时可以初始化该域内的外设
}
void power_domain_off(void) {
// 先让外设进入安全状态
peripheral_deinit();
delay_ms(5);
GPIO_SetPin(POWER_CTRL_PIN, LOW); // 开启MOSFET(低电平导通P-MOS)
// 此时该域完全断电
}
这里有个坑:上电顺序。我遇到过Wi-Fi模块在电源刚建立时,如果IO口先于VDD上电,会导致模块锁死甚至损坏。所以,受控域上电时,一定要确保IO口处于高阻态,或者等VDD稳定后再配置IO。
3.5 实战中的电源域划分步骤
我一般按以下流程来划分电源域:
- 列出所有器件:把板子上所有需要供电的芯片、模块、外设都列出来
- 标注功耗和电压:每个器件的工作电流、待机电流、工作电压
- 分析工作场景:网关在正常运行、待机、深度休眠时,哪些器件必须工作
- 分组归类:把「必须一直工作」的归入核心域/常电域,把「可以断电」的归入休眠域/受控域
- 设计电源开关:为每个受控域选择合适的开关管或负载开关芯片
- 验证漏电路径:检查所有IO口、地回路,确保断电后没有漏电通道
避坑指南:我曾经在一个项目里,把USB接口的5V也归入了受控域。结果休眠时切断了5V,但USB的D+和D-引脚仍然连接着主控芯片,导致主控芯片通过USB数据线从电脑端「偷电」。后来我在USB数据线上也加了模拟开关,休眠时断开数据线,问题才解决。
3.6 小结
电源域划分这件事,说难不难,说简单也不简单。核心就是一句话:搞清楚每个器件什么时候需要电,什么时候不需要,然后用开关管把它们隔离开。
我个人习惯在原理图设计阶段,就用不同颜色的框把电源域标出来。这样Layout工程师布线时也能一目了然,避免不同域的电源走线交叉。嗯,这些小习惯,往往能省下后面调试时的大把时间。