4. 电源管理策略:动态电压频率调整(DVFS)、电源门控(Power Gating)、负载开关应用

各位做嵌入式热成像的朋友,咱们接着聊电源管理。说实话,热成像系统里最让我头疼的,不是算法,不是传感器,而是怎么让电池多撑一会儿。你想想看,一个热成像模组,传感器要供电、FPGA要跑、无线模块要发数据,哪个都是电老虎。

这一章,我把自己在几个量产项目里摸爬滚打的经验拿出来,重点聊聊三个最实用的招数:动态电压频率调整(DVFS)电源门控(Power Gating)负载开关的应用。说白了,就是教你怎么让系统该快的时候快,该睡的时候睡,别白白浪费每一毫安时的电量。

电源管理策略核心 DVFS 动态电压频率调整 Power Gating 电源门控 负载开关 Load Switch CPU/FPGA 动态调频 外设/模块断电隔离 传感器/射频独立通断 目标:按需供电,消除一切不必要的功耗浪费

4.1 动态电压频率调整(DVFS)—— 让芯片学会“看人下菜碟”

DVFS 这名字听着挺唬人,其实道理很简单:活多的时候跑快点,活少的时候跑慢点。我最早接触这个,是在一个手持热成像仪的项目上。当时主控用的是某款 Cortex-M7,满频跑 400MHz,功耗直接飙到 200mW 以上。但实际使用中,大部分时间只是在做简单的界面刷新和温度采集,根本不需要那么高的性能。

我个人习惯把 DVFS 分成两个维度来看:

  • 电压调整:降低电压能直接减少动态功耗(P ∝ V²f)。但注意,电压不能无限低,得保证芯片在目标频率下能正常工作。
  • 频率调整:降低频率能线性减少功耗,但会影响任务完成时间。关键是找到“刚刚好”的那个点。

核心公式(心里有数就行):

动态功耗 P = C × V² × f

其中 C 是负载电容,V 是工作电压,f 是时钟频率。你看,电压是平方项,所以降电压的收益最大。

我在项目中常用的做法是:

  1. 先跑一个性能摸底测试:看看不同频率下,完成关键任务(比如一帧图像处理)需要多少时间。
  2. 设定 3~4 个性能档位:比如“高性能档”(400MHz/1.2V)、“均衡档”(200MHz/1.0V)、“低功耗档”(100MHz/0.9V)。
  3. 根据负载动态切换:用 RTOS 的空闲任务或者一个简单的状态机来监测 CPU 利用率,自动切换档位。
// 伪代码示例:DVFS 状态切换逻辑
typedef enum {
    DVFS_HIGH_PERF,   // 400MHz, 1.2V
    DVFS_BALANCED,    // 200MHz, 1.0V
    DVFS_LOW_POWER    // 100MHz, 0.9V
} dvfs_mode_t;

void dvfs_update(uint32_t cpu_load_percent) {
    if (cpu_load_percent > 80) {
        set_voltage(1200);  // mV
        set_frequency(400); // MHz
    } else if (cpu_load_percent > 40) {
        set_voltage(1000);
        set_frequency(200);
    } else {
        set_voltage(900);
        set_frequency(100);
    }
}

⚠️ 避坑指南:

我曾经在一个项目里吃过亏——切换频率时没注意 PLL 的锁定时间。结果频率跳变太快,导致 SPI 通信瞬间出错,图像数据全乱了。后来我加了一个 5ms 的稳定延时,问题才解决。记住:先调电压,再调频率;降频时先降频再降压,升频时先升压再升频

4.2 电源门控(Power Gating)—— 把不用的模块“物理断电”

DVFS 能省电,但省得还不够彻底。你想想看,就算你把 CPU 降到最低频率,它还是在耗电。对于热成像系统里那些不常用的模块——比如 USB 控制器、以太网 MAC、甚至某些图像加速器——最好的办法就是直接切断它们的电源。这就是 Power Gating。

说白了,Power Gating 就是在芯片内部或者板级,用开关管(通常是 PMOS 或 NMOS)把某个功能模块的供电 rail 给断开。我习惯把它比作“拉电闸”——不用的时候,直接把电断了,一滴电流都不让它漏。

实际项目中,我一般这样操作:

  • 识别可关断的模块:热成像系统里,Wi-Fi 模块、蓝牙模块、SD 卡控制器、USB PHY 这些,都是典型的“间歇性工作”模块。
  • 设计电源域:把系统分成几个独立的电源域(Power Domain)。比如“Always-on 域”(RTC、唤醒逻辑)和“Switchable 域”(外设、加速器)。
  • 控制开关管:用 GPIO 控制一个 PMOS 开关,或者直接用 PMIC 的 LDO 使能脚。
// 电源门控控制示例
#define WIFI_POWER_EN_PIN   GPIO_PIN_5
#define USB_POWER_EN_PIN    GPIO_PIN_6

void power_gating_init(void) {
    // 默认关闭所有可关断模块
    HAL_GPIO_WritePin(WIFI_POWER_EN_PIN, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(USB_POWER_EN_PIN, GPIO_PIN_RESET);
}

void wifi_power_on(void) {
    HAL_GPIO_WritePin(WIFI_POWER_EN_PIN, GPIO_PIN_SET);
    HAL_Delay(10);  // 等待电源稳定
    // 初始化 Wi-Fi 模块...
}

void wifi_power_off(void) {
    // 先发送断电指令,再关电源
    wifi_send_shutdown_cmd();
    HAL_Delay(5);
    HAL_GPIO_WritePin(WIFI_POWER_EN_PIN, GPIO_PIN_RESET);
}

💡 我的小技巧:

关断电源之前,一定要先让模块进入“安全状态”。比如 Wi-Fi 模块,直接断电可能会导致 flash 损坏或者下次上电无法识别。我习惯先发一个关机指令,等模块应答后再断电。这叫“优雅断电”,能省去很多售后麻烦。

4.3 负载开关(Load Switch)—— 板级电源管理的“小钢炮”

如果说 Power Gating 是芯片内部的“拉电闸”,那负载开关就是板级的“电源插座”。它通常是一个集成了 MOSFET 和驱动电路的小芯片,用 GPIO 就能控制一路电源的通断。

我在热成像系统里,最喜欢用负载开关来控制传感器供电加热器供电。你想想看,热成像传感器(比如 MLX90640 或 Lepton)在工作时需要几十 mA 的电流,但待机时完全可以断电。用负载开关,一个 GPIO 就能搞定。

选型时我一般关注这几个参数:

参数 说明 我的推荐值
导通电阻 (Rds_on) 越小越好,减少压降和发热 < 50 mΩ
最大持续电流 根据负载峰值电流选,留 1.5 倍余量 负载电流 × 1.5
上升时间 (Tr) 控制上电斜率,防止浪涌 1~5 ms
静态电流 (Iq) 开关本身消耗的电流,越低越好 < 1 μA

我曾经在一个项目里,用了一颗 TPS22918 负载开关来控制热成像传感器的电源。这颗芯片的导通电阻只有 20 mΩ,静态电流 0.5 μA,非常适合电池供电的设备。上电时,我通过调整 Css 电容把上升时间控制在 2ms 左右,完美避开了传感器上电瞬间的浪涌电流。

// 负载开关控制示例(使用 TPS22918)
#define SENSOR_LOAD_EN_PIN  GPIO_PIN_7

void sensor_power_on(void) {
    // 使能负载开关
    HAL_GPIO_WritePin(SENSOR_LOAD_EN_PIN, GPIO_PIN_SET);
    // 等待电源稳定(上升时间由硬件 Css 决定)
    HAL_Delay(5);
    // 初始化传感器 I2C...
}

void sensor_power_off(void) {
    // 先让传感器进入休眠
    sensor_enter_sleep();
    HAL_Delay(2);
    // 关断负载开关
    HAL_GPIO_WritePin(SENSOR_LOAD_EN_PIN, GPIO_PIN_RESET);
}

实战经验总结:

在一个手持热成像仪项目中,我同时用了 DVFS、Power Gating 和负载开关三种技术。结果怎么样?系统待机功耗从原来的 150mW 降到了 8mW,电池续航从 2 小时延长到了 12 小时。说白了,这三招组合起来,效果是 1+1+1 > 3 的。

嗯,这里要注意一点:不要为了省电而牺牲系统的实时性。比如热成像的帧率要求是 8Hz,你把传感器断电后重新上电,初始化时间可能就要 200ms,那帧率就保证不了了。所以,电源管理的策略一定要和系统的实时性要求结合起来考虑。

我个人习惯在项目初期,就画一张“电源状态迁移图”,把系统所有的工作状态(运行、待机、休眠、深度休眠)以及每个状态下哪些模块供电、哪些模块断电,都标清楚。这张图,就是整个电源管理策略的“宪法”。


公众号:蓝海资料掘金营,微信deep3321