4、电源管理单元:电压调节技术、DVFS(动态电压频率调整)、电源域划分

好,咱们接着聊电源管理。这章内容,说白了就是怎么给单片机“省电”。你想想看,一个电池供电的设备,如果电源管理做得不好,那用户体验就是灾难。我见过不少产品,功能做得花里胡哨,结果用户用半天就得充电,这就是典型的“电老虎”。

电源管理单元,PMU,是低功耗设计的核心。它不只是一个硬件模块,更是一套策略。我个人习惯把PMU比作一个“智能管家”,它得知道什么时候该给哪个房间供电,什么时候该关灯,什么时候该调暗灯光。

4.1 电压调节技术

电压调节,听起来高大上,其实原理很简单:给芯片喂多少电,它就能干多少活。喂多了,它跑得快,但发热大、费电;喂少了,它跑得慢,甚至可能死机。所以,关键就在于“喂得刚刚好”。

常见的电压调节方式有两种:

  • LDO(低压差线性稳压器):这东西像个“水龙头”,能把输入电压稳稳地降到目标值。优点是纹波小、噪声低,适合给模拟电路供电。缺点是效率不高,尤其是输入输出压差大的时候,多余的能量全变成热量散掉了。我在项目中用过一次LDO给传感器供电,结果传感器烫得能煎鸡蛋,后来果断换了DCDC。
  • DCDC(直流-直流转换器):这玩意儿像个“水泵”,通过开关的方式把电压升上去或降下来。效率高,通常能到90%以上。缺点是纹波大,对布局布线要求高。我建议,给数字核心供电,优先考虑DCDC。

核心观点: 电压调节不是越低越好。每个芯片都有一个“最佳工作电压点”,低于这个点,漏电流反而会增大。你得看芯片的datasheet,找到那个“甜蜜点”。

嗯,这里要注意,电压调节不是一锤子买卖。系统在不同状态下,对电压的需求是不一样的。这就引出了我们下一个话题——DVFS。

4.2 DVFS(动态电压频率调整)

DVFS,全称Dynamic Voltage and Frequency Scaling。说白了就是:活多的时候,加电提频;活少的时候,降压降频。 这就像你开车,高速上跑120,市区里跑40,没必要全程地板油。

为什么要把电压和频率绑在一起?因为频率越高,需要的电压就越高。你想想看,如果频率提上去了,电压没跟上,那信号传输就会出错,这叫“时序违规”。我刚开始做DVFS时,就犯过这个错,频率调高了,电压没动,结果系统跑着跑着就死机了。查了半天,原来是电压不够。

DVFS的实现,通常分三步:

  1. 负载预测:判断当前任务重不重。比如,CPU占用率超过80%,就认为需要高性能模式。
  2. 频率调整:先调频率。注意,频率只能阶梯式变化,不能跳变,否则系统会不稳定。
  3. 电压调整:频率调好后,再调电压。电压调整需要时间,通常几微秒到几十微秒。

这里有个坑:升频升压时,要先升压再升频;降频降压时,要先降频再降压。 顺序搞反了,芯片就可能出问题。我曾经在项目里因为顺序写反了,导致芯片在切换模式时频繁复位,那叫一个头疼。

我的经验: DVFS的调整粒度很重要。太粗了,省电效果不明显;太细了,频繁切换反而增加功耗。我一般建议,调整周期设在10-100毫秒之间,具体看你的应用场景。

来看一个简单的DVFS代码示例,假设我们用的是STM32L4系列:

// 伪代码:DVFS状态切换
void DVFS_SetMode(DVFS_Mode_t mode) {
    switch(mode) {
        case DVFS_HIGH_PERF:
            // 1. 先设置目标电压
            HAL_PWR_VoltageScalingConfig(PWR_REGULATOR_VOLTAGE_SCALE1);
            // 2. 等待电压稳定
            while(__HAL_PWR_GET_FLAG(PWR_FLAG_VOS) == RESET);
            // 3. 再提高系统时钟频率
            HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);
            break;
            
        case DVFS_LOW_POWER:
            // 1. 先降低系统时钟频率
            HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
            // 2. 再降低电压
            HAL_PWR_VoltageScalingConfig(PWR_REGULATOR_VOLTAGE_SCALE3);
            while(__HAL_PWR_GET_FLAG(PWR_FLAG_VOS) == RESET);
            break;
    }
}

你看,代码逻辑很清晰。但实际项目中,你还要考虑外设的时钟依赖。比如,ADC需要高速时钟,你降频了,ADC采样率就下来了。这些都得提前规划好。

4.3 电源域划分

电源域划分,是低功耗设计的“大杀器”。它的思想很简单:把芯片内部不同的功能模块,接到不同的电源线上。 不用的模块,直接断电。

举个例子,一个智能手表,有蓝牙、屏幕、传感器、CPU。你睡觉的时候,屏幕和蓝牙可以断电,只留传感器和CPU的低功耗模式。这就是电源域划分的威力。

常见的电源域划分方式:

  • Always-on域:永远不断电,比如RTC、唤醒控制器、一部分SRAM。这部分功耗要极低,通常只有几微安。
  • Core域:CPU核心、高速缓存、中断控制器。这是功耗大户,需要精细管理。
  • Peripheral域:各种外设,比如UART、SPI、I2C、USB。每个外设都可以独立开关。
  • Memory域:SRAM、Flash。可以分区供电,不用的Bank直接断电。

我建议,在设计初期,就要把电源域规划好。不要等到画PCB了才想起来,那就晚了。我曾经在一个项目里,因为电源域划分不合理,导致某个外设的供电和CPU的供电混在一起,结果CPU休眠时,外设还在偷偷耗电,整机功耗下不来。

避坑指南: 电源域之间切换时,要注意“电平转换”。不同电压域的IO口直接相连,可能会烧芯片。必须加电平转换电路,或者使用支持多电压域的IO Pad。

来看一个典型的电源域划分表格:

电源域 包含模块 典型电压 控制方式
Always-on RTC、唤醒逻辑、备份寄存器 1.2V 常开
Core CPU、Cache、NVIC 0.9V - 1.2V DVFS + 门控
Peripheral UART、SPI、I2C、Timer 1.8V - 3.3V 独立开关
Memory SRAM、Flash 1.2V - 1.8V 分区供电

最后,我想说,电源管理不是一蹴而就的。它需要你在硬件设计、软件策略、系统架构三个层面同时发力。电压调节是基础,DVFS是手段,电源域划分是格局。三者结合,才能做出真正省电的产品。

嗯,这一章就到这里。下一章,我们会聊聊“时钟管理”,这也是低功耗设计里绕不开的一环。到时候见。