从420mA到3.2uA,我把一块MCU板子的功耗掰开揉碎重做了一遍
先说清楚这事的来龙去脉。我手里的设备是一个带数码管显示、带继电器输出、用12V供电的工业小面板,主控原本用的是某型号通用MCU,32MHz全速跑,数码管常亮,继电器直接由GPIO经过三极管驱动,整个板子在12V端实测电流稳在420mA附近。这个数字放到现在任何低功耗项目里都是灾难级的,尤其这个产品还要考虑电池后备供电,客户明确要求待机功耗必须压到个位数微安级别,正常工作电流也要尽量低于5mA。
我接手后把整块板子重新梳理,主控换成ST MCU里面的低功耗选手STM32L151C8T6A,硬件电路和固件全部按低功耗思路重做,最终把整机待机功耗做到了3.2uA,正常工作模式电流大约2.1mA,带数码管显示也不超过15mA。整个过程踩了不少坑,也总结了一套可以复用的优化方法论,这篇就把全程复盘写清楚,从测量方法、硬件改动、固件策略到调试中的坑,一次讲透。无论是做表计、手持设备、传感器节点,还是工业控制面板,只要你的MCU系统对功耗有要求,这篇都值得收藏。
1. 项目背景与优化目标
1.1 一开始的420mA到底是怎么来的
很多朋友看到420mA这个数值会觉得夸张,一个MCU怎么会吃掉420mA,其实MCU本身确实吃不了这么多,但这块板子上不止有MCU。我实测拆解后,电流大户主要有这么几块:
- 数码管显示模块:6位8字形数码管,每位有8个段码,采用动态扫描方式,恒流驱动,峰值功耗非常可观。
- 继电器驱动:两个12V继电器线圈,单个线圈电阻大约400欧,一个吸合就是30mA,两个同时吸合60mA,三极管驱动还要额外消耗一部分电流。
- 电源转换效率:12V输入,用线性稳压器LDO降到3.3V,MCU和外设加起来如果等效电流是60mA,那LDO上的压降损耗就是(12-3.3)V×60mA,大约0.5W,折算到输入侧就是大概70mA的额外消耗,这还没算LDO自身的静态功耗。
- MCU全速运行:32MHz主频,所有外设时钟全开,内部LDO全功率供电,Flash读取、GPIO翻转,这部分也有十几毫安。
- 其他:LED指示灯、分压电阻网络、未配置的悬空引脚漏电,林林总总也有十来个毫安。
这里的核心矛盾是:很多设计把“能用”当成了“达标”。MCU能跑、数码管能亮、继电器能吸合,功能全部正常,但功耗没人去抠。做低功耗优化,第一步永远不是改代码,而是搞清楚每一毫安花在哪。
1.2 为什么这次选STM32L151C8T6A
选型是低功耗设计的基石。市面上低功耗MCU很多,我这次选STM32L151C8T6A有几个具体原因:
- 这是ST的低功耗产品线,Cortex-M3内核,运行模式下功耗大约是214uA/MHz左右,Stop模式最低能做到1.3uA左右,Standby模式带RTC唤醒能做到1uA左右,数据在同类产品里不算最激进,但胜在稳定、资料多、采购容易。
- 内部集成12位ADC、DAC、比较器、LCD驱动控制器,对做表计类产品非常合适。我这块板子虽然用的是外部数码管,但STM32L151本身有段码LCD驱动能力,后续如果换段码LCD屏,MCU可以直接驱动,省掉外部驱动芯片的功耗。
- 供电范围1.8V到3.6V,内部有超低功耗的LDO,可以根据运行频率动态调整内核电压,这在低功耗固件设计里非常重要。
- 生态成熟,STM32CubeMX直接支持低功耗模式的功耗估算,HAL库也封装好了PWR模块的操作函数,开发效率高。
选型这件事上,我想多说一句:低功耗不是某一颗芯片的绝对参数能决定的,而是芯片的低功耗能力与你的应用场景匹配的结果。如果你的系统大部分时间处于待机状态,就重点关注Stop和Standby模式的电流;如果系统在运行模式的电流更关键,就关注uA/MHz这个指标。STM32L151的定位恰好适合“偶尔醒来干点活、干完继续睡”的典型场景。
1.3 从420mA到3.2uA的优化路径总览
我给自己定了一条清晰的路径,你也可以对照自己项目来设计:
- 先建立测量能力,用可以测到uA级别的仪器,把每一档功耗测准。
- 硬件逐项优化:电源架构、显示驱动、继电器驱动、IO配置。
- 固件逐级优化:时钟树、低功耗模式、中断事件驱动。
- 最后做系统级验证:把运行、待机、唤醒三个状态分别测准,再验证切换过程的瞬态功耗。
这条路径里,最大的收益通常来自硬件层面的电源架构和负载驱动方式的改变,固件虽然在宣传上很热闹,但更多是锦上添花。先硬件后固件,顺序别反了。
2. 功耗从哪儿来:先精确测量,再动手优化
2.1 测量工具与接线方式
低功耗优化的第一步不是改板子,而是把功耗测准。你要是拿一块误差0.5%的万用表去测3uA待机电流,误差完全可能淹没真实值。我这次准备了三档工具:
- 日常调试用:Fluke 17B+万用表,测mA级别电流,优点是方便,缺点是uA分辨率不够,测uA档时压降大,会影响被测电路的工作状态。
- 精确测量用:Keysight 34461A六位半万用表,支持uA量程,分辨率到nA级别,测量压降低,待机时在uA量程下的压降只有几十uV,对系统影响可以忽略。
- 瞬态功耗用:示波器加电流探头或者采样电阻法。低功耗设备的“平均电流”好看没用,唤醒瞬间的尖峰电流可能会把电源拉垮,这时候需要用示波器抓波形。
接线方式也有讲究。我把电源、万用表、目标板串联起来,万用表放在电源正极和板子VIN之间,测量时尽量用短粗线,避免线材电阻和电感对测量结果的干扰。还有一点,串入万用表前,先用电源的电流表功能粗测一下量级,再切到对应量程,不然很容易烧保险丝。
2.2 把420mA拆开看:四个电流大户
拿到原始板子后,我画了一张功耗拆解表格,实测数据如下:
| 功耗模块 | 测试条件 | 电流消耗 | 占比 |
|---|---|---|---|
| MCU核心及外设 | 32MHz全速,全部外设时钟开启 | 约18mA | 4.3% |
| 数码管模块 | 6位动态扫描,恒流源驱动 | 约260mA | 61.9% |
| 继电器驱动 | 双继电器吸合 | 约60mA | 14.3% |
| LDO压降损耗 | 12V转3.3V,LDO线性调整 | 约80mA | 19.0% |
| 其他损耗 | LED、分压电阻、引脚漏电 | 约2mA | 0.5% |
看到这个拆解,优化重点就一目了然了:数码管是大头,其次是LDO的压降损耗,再次是继电器。MCU本身的18mA虽然是合理范围内,但在目标5mA以内的工作电流要求下,也必须压下去。
有一点大家要注意,功耗拆解的时候一定把“转换效率”算进去。很多新手只算负载端的功耗,忽略了电源转换环节的浪费。在12V供电的系统里,直接用LDO降到3.3V,就算负载端只有20mA,输入端也要吃掉52mA,这是线性稳压的物理本质,器件选得再好也抵消不了这个大压差。
2.3 一个容易忽略的细节:调试器对功耗测量的干扰
这块我必须单独拿出来说,因为太容易踩了。我第一次测量待机电流的时候,板子通过ST-Link连着电脑,测出来Stop模式电流竟然有4.7mA,怎么排查都降不下去。后来拔掉调试器,电流瞬间掉到3.2uA。
问题在于,仿真器连接时,SWD接口的TCK、TMS引脚的电平状态、内部上拉,以及调试接口的时钟请求,都会让MCU无法真正进入最低功耗状态。HAL库的DBGMCU寄存器如果配置了调试模式下的低功耗控制,调试器在低功耗模式下的访问会导致内部时钟保持运行,功耗自然会翻几十倍。
所以测量低功耗数据时,务必遵循两条铁律:
- 测量待机功耗时拔掉调试器,如果要保留调试能力,使用独立串口输出日志,不要占用SWD。
- 测量过程中禁止打开调试器的连接窗口,哪怕只是连上不发指令,也会影响功耗。
3. 硬件层面:把元器件的“漏功”一点一点抠下来
3.1 LDO换成DC-DC:同样12V转3.3V,效率差在哪
12V输入在这个项目里是明确的,原来的LDO方案直接被我否掉。线性稳压器的本质是一个可变电阻,把多余的电压以热量的形式消耗掉。12V降到3.3V,压差高达8.7V,如果负载电流是60mA,LDO上白白消耗了522mW,这部分全是从输入侧浪费掉的。
替换方案是使用同步降压DC-DC转换器,我选的是TI的TPS62160或者国产同类芯片,静态功耗大概在15uA左右,转换效率在12V转3.3V、负载20mA时实测能达到87%左右。相比LDO,效率提升了约20个百分点。你可能觉得换DC-DC会增加成本,但在低功耗项目里,省下来的电在电池供电场景里就是实打实的续航提升,这笔账非常划算。
当然DC-DC也不是没有代价:输出纹波比LDO大,通常需要加LC滤波,另外它会产生开关噪声,对ADC采样有影响。我在这个项目里做的是分域供电,模拟部分单独用一个小LDO从3.3V再降压,保证ADC的参考电压干净。这也是低功耗硬件设计里常见的手段:对效率要求高的部分用DC-DC,对噪声敏感的部分再用LDO做二次稳压。
3.2 数码管和段码屏的功耗控制
数码管是这个系统里最耗电的模块,原来260mA的消耗,优化后压到约12mA,改动思路值得展开说说。
第一,驱动方式从恒流源扫描改成动态扫描限流。数码管的视觉亮度是“平均亮度”,单个数码管发光时间和扫描周期占比决定了视觉亮度,动态扫描天然就缩短了每个段码的导通时间。配合合适的限流电阻,把平均电流压低,视觉亮度并不会明显下降。
第二,增加“显示休眠”功能。待机时数码管完全关闭,MCU进入低功耗状态,只有当按键触发或数据更新时才点亮显示,显示完成后延时3秒自动熄灭。这一条改动直接砍掉了待机时约260mA的消耗。
第三,在软件上把数字显示改成“变化才刷新”的逻辑。以前是每2ms扫描刷新一次,不管显示数字有没有变化,现在改成只有数据变化时才扫描一轮。对用户来说,看到的显示效果一样,但MCU和数码管的有效工作时间大幅减少。
关于段码LCD和数码管的选择,我再多说一句:如果你的产品需要持续显示,优先用段码LCD屏,而不是数码管。段码LCD本身不发光,只靠反射环境光,工作电流只有几个微安,功耗比数码管低几个数量级。STM32L151内部自带LCD驱动控制器,可以直接驱动段码LCD屏,省驱动芯片、省代码、省功耗,这是做低功耗仪表产品的一个很关键的选型方向。
3.3 继电器与空气开关驱动的正确姿势
继电器线圈是感性负载,驱动方式不对,静态功耗和瞬态风险都很高。原来用三极管9013驱动继电器,基极电流大约1mA,继电器线圈30mA,看起来没啥问题,但在待机时,继电器即使不吸合,驱动电路也一直挂在电源上,有小电流损耗。
我把驱动电路改成低功耗MOS管方案,待机时MCU的GPIO输出高阻态,MOS管完全关断,驱动电路零静态电流。MOS管选的是AO3400,Vgs阈值低,2.5V就能完全导通,3.3V平台可以直接驱动,导通内阻只有几十毫欧,继电器线圈上的压降损耗可以忽略。
另外,继电器线圈两端必须反并联续流二极管。很多人知道要加,但不知道加的时机很关键。如果二极管方向接反,继电器一上电就短路;如果漏加,MOS管关断瞬间的感应电压可能达到几十伏,直接把器件打坏。我在这块板子上亲眼见过一位同事因为忘了续流二极管,一天废掉三颗MOS管。
还有一个相关的场景,很多人会问“MCU一般怎么控制空气开关”,其实原理类似:空气开关内部有脱扣器线圈,需要一个短时脉冲电流驱动线圈动作,驱动方式也是MOS管加续流保护,只是脉冲宽度要严格控制,不能持续通电,否则线圈会过热烧毁。这类执行器驱动的设计原则是:正常状态下驱动电路完全断电,只有需要动作时才由MCU发一个受控脉冲,这样既省电又安全。
3.4 MCU引脚状态:悬空引脚也是一种“耗电黑洞”
我在调试过程中发现一个反直觉的现象:MCU什么代码都没跑,只是把所有引脚初始化为默认状态,待机电流就比预期多了300uA左右。排查后发现问题出在一堆悬空的输入引脚上。
悬空输入引脚的电压会漂移,如果漂移到了CMOS输入逻辑的阈值附近,输入级会反复导通关断,产生灌电流漏电。更常见的情况是,IO口内部的上拉或下拉电阻被无意中使能,每个上拉电阻的功耗是几十微安,十几个引脚加起来就非常可观。
所以,进入低功耗模式之前,所有不使用的GPIO必须明确配置:
- 未使用的引脚设置为模拟输入模式,这是STM32低功耗设计里最省电的配置,引脚内部所有数字输入缓冲器都关闭,不会产生任何漏电路径。
- 连接外部上拉或下拉电阻的引脚,要确认外部电阻的阻值是否过大或过小,一般100k以上才适合低功耗设计,否则分压电流会持续消耗。
- 驱动外部负载的输出引脚,在待机时必须输出确定的电平,不能让引脚悬空或处于高阻态,否则外部电路可能通过引脚注入电流。
- 所有按键检测引脚建议配置为外部中断模式,并且用内部上拉,平时无按键时没有压差电流,按键动作时产生下降沿唤醒MCU。
4. 固件层面:让MCU真正“睡”过去
4.1 时钟树重组:别再让PLL空转
很多项目的固件默认用的是启动文件里那一套时钟配置,不管实际需要多高的主频,都跑到最高。MCU频率越高,运行电流越大,待机时如果不主动切换时钟源,内部时钟树还在空转,功耗根本降不下来。
我对时钟树的改动分了三步:
正常运行模式:使用MSI时钟或者HSI,主频降到4MHz。这个项目的核心任务就是按键检测、数码管刷新、串口通信,4MHz完全够用。STM32L151在4MHz下的运行电流大约1mA左右,相比32MHz的18mA,直接省了17mA。
等待模式:进入WFI前的瞬间,把系统时钟切换到MSI低速档,同时关闭PLL、关闭HSE,保留必要的低速外设时钟。
待机模式:直接进入Standby模式,此时整个时钟系统全部关闭,只有RTC使用LSI或LSE时钟独立运行。
很多人忽略的一点是,在改变系统时钟的过程中,一定要先配置新的时钟源并等待其稳定,然后再切换,否则会出现跑飞。STM32的库函数提供了HAL_RCC_ClockConfig和等待就绪的流程,按官方推荐来就好,不要自己图省事跳过等待步骤。
4.2 STM32L151C8T6A的低功耗模式选型
STM32L151提供Sleep、Low-power Run、Stop和Standby这几种模式,它们的功耗等级和唤醒条件差异很大,我用一个表整理清楚:
| 模式 | 典型电流 | 唤醒方式 | 使用场景 |
|---|---|---|---|
| Sleep | 约2.5mA@4MHz | 任意中断 | 短时等待,快速响应 |
| Low-power Run | 约9uA | 中断 | 低频运行,周期任务 |
| Stop | 约1.3uA | 外部中断、RTC | 主要待机模式,保留RAM和寄存器 |
| Standby | 约0.3uA | RTC、NRST、WKUP引脚 | 深度休眠,RAM清空,快速启动 |
这个项目里,我把主待机状态设计成Stop模式,用RTC定时1秒唤醒一次,检查是否有任务需要处理,没有就继续睡。这样既保留了RAM数据,待机电流又只有1.3uA左右。如果产品允许RAM清空、通过外部事件唤醒,可以用Standby模式把功耗压到0.3uA,但代价是唤醒后MCU要从头执行启动代码,复位时间更长,RAM数据全部丢失。
选择哪种模式,核心要看“唤醒后需要多快进入工作”,以及“RAM数据是否需要保留”。例如,一个传感器节点,每次唤醒采集数据后直接通过无线模块发出去,RAM里不需要保留什么状态,就可以用Standby;如果系统需要保留上一次的配置信息或者运行状态,最好用Stop模式。
4.3 事件驱动与中断唤醒:把“轮询”改成“按需干活”
在低功耗固件设计里,最忌讳的是“轮询”。以前写代码,主循环里一个while(1)不断地扫按键、刷显示、查串口数据,MCU永远醒着,永远在忙,功耗自然下不来。
我重构后的固件思路是事件驱动:
- 按键检测:把按键引脚配置成外部中断,平时MCU进入Stop模式,按下按键时产生下降沿中断,MCU恢复到运行模式,处理完再入睡。
- RTC定时任务:用RTC闹钟事件定时唤醒MCU,比如每1秒唤醒一次检查传感器数据,每10秒唤醒一次刷新显示。
- 串口接收:使用UART空闲中断或接收中断,没有数据时MCU不需要理会串口。
- 数码管显示:数据变化才刷新,不变化就保持。
这套结构的核心是“无事可做就睡觉”。你可以把所有任务分为“必须同步执行”和“可以异步延后”两类,后者全部交给定时器或中断去驱动,主循环只处理真正需要CPU的计算逻辑。
有人会担心中断唤醒会不会导致响应不及时,实测下来,从Stop模式恢复到运行模式大约需要几十微秒到几微秒,对绝大多数人机交互场景来说完全无感。真正需要快速响应的中断,可以把它配置成最高优先级,仍然能保证毫秒级以下的反应速度。
4.4 外设独立时钟门控:用不到的模块直接关
STM32的每个外设都有独立的时钟门控,通过RCC寄存器控制。很多人初始化的时候习惯把所有外设时钟都打开,哪怕只用了串口1和定时器2,也把GPIOA到GPIOF、USART1到USART3、SPI、I2C、ADC全部打开。这些外设即使不工作,只要时钟还在跑,就会产生额外的动态功耗。
我在固件里给每个模块单独建了初始化和反初始化函数,在进入低功耗前调用反初始化,把外设时钟关闭,退出时再按需重新初始化。这个地方有一个小小的坑要提前说:如果关闭了某个外设的时钟,但引脚的复用功能没有同步修改,可能导致引脚电平异常,反而增加漏电。所以关闭外设时钟后,要把对应的GPIO重新配置为模拟输入或者特定的低功耗状态。
另外,如果产品不需要RTC休眠唤醒功能,RTC模块在待机时也要彻底关闭,只保留外部唤醒引脚。我在测试中发现,即使不使用RTC,如果初始化了RTC的时钟和中断,会在后台产生周期性唤醒,功耗比预期高出几百nA到几uA。低功耗优化的本质就是“精简”,每一份被浪费的电流都要找到它、消灭它。
5. 实测过程中的坑与排查实录
5.1 功耗不降反升?先查IO口配置
进入调试阶段,我第一次启用全部低功耗优化策略后,实测待机电流是58uA,比理论值1.3uA高出几十倍。当时代码检查了好几遍,时钟树、外设关闭、低功耗模式配置全都确认无误,后来用一根一根杜邦线拔掉外部模块的方式做排除,最后发现是数码管的段码驱动引脚在待机时被配置成了推挽输出高电平,而数码管公共端还接着电源,整条回路产生了约50uA的电流。
问题根源在于GPIO的配置和外部电路的耦合关系。我特意把所有输出引脚在进入Stop模式前,统一配置为模拟输入或者下拉输入,让外部电路完全无法通过引脚形成电流路径。这个跟硬件设计里的“引脚悬空”问题其实是一体两面:硬件上悬空会漏电,固件上配置不当也会造成等效的漏电。诊断这类问题,最有效的方法是逐个引脚翻转为不同状态,分别测量电流变化,快速定位异常引脚。
5.2 测量功耗时的“表笔陷阱”
测量低功耗电流要特别小心万用表内阻的影响。万用表在uA档时,内阻可能高达几百欧甚至几千欧,如果目标板的功耗在mA级别,表压降会造成供电电压跌落,极端情况下会导致MCU复位或外设工作异常。
所以我在实际测量时遵循一个流程:先用粗测档(mA档)确认电流量级,再换到uA档去测稳定状态。在切换档位时,需要先将测量线短路,让电路保持正常供电,然后再串联进电流表。这一微小的操作细节,能避免很多“怎么一接表就复位”的怪问题。
另外,如果系统中同时存在数字地和模拟地,测量点要选在电源入口处,测量整个系统的总电流,不要单独去测模拟域或数字域的电流,测出来的局部电流容易误导你的优化方向。至于瞬态电流,要用示波器配合低阻值采样电阻,比如1欧姆或0.1欧姆,把采样电阻串在电源路径上,用差分探头或普通探头测量电阻两端电压,再换算成电流。
5.3 常见的低功耗调试问题排查表
我把这次调试过程中遇到的问题整理成一张表,后续项目可以直接对照排查:
| 问题现象 | 可能原因 | 排查方法 | 对策 |
|---|---|---|---|
| 待机电流始终在几十uA | GPIO悬空或配置成上拉输入 | 逐一检查未使用引脚电平 | 全部配置为模拟输入模式 |
| 待机电流几十mA | 外部负载未断电 | 逐个断开外部模块排查 | 添加负载电源开关逻辑 |
| Stop模式实际电流偏高 | 调试器连接、看门狗时钟未关 | 拔掉调试器,检查IWDG | 物理断开调试器,关闭独立看门狗 |
| 唤醒后死机 | 中断标志未清除或外设时钟过早关闭 | 检查ISR和时钟恢复顺序 | 唤醒后先恢复全部外设时钟,再清中断标志 |
| 唤醒尖峰电流过大 | 电源电容偏小,DC-DC响应慢 | 示波器看VIN波形 | 输入端加大bulk电容,软件上分散负载启动时间 |
5.4 如果MCU没有USB差分信号数据引脚,怎么处理通信和调试
在低功耗项目里,很多小型MCU受限于封装尺寸或者功能裁剪,没有USB模块引出的DP/DM引脚。这时如果项目里想用USB做通信或供电,会遇到一个很现实的问题:“MCU没有USB差分信号数据引脚怎么办”。
我的建议分两个层面。如果你只是想让设备和电脑通信用于调试,最省事的方法是放弃USB直连,改用UART转USB芯片,比如CH340、CP2102这类方案,MCU只要保留一个UART引脚就行,数据通过芯片转换后在电脑侧表现为串口。如果你需要让设备本身成为USB外设,且MCU没有USB模块,那就必须换一颗带USB外设的MCU,或者外扩一颗USB控制器芯片,但从低功耗角度来看,这个方案会增加静态功耗,我通常不建议在低功耗产品里这么干。
这个项目里,我选择了UART转USB方案,MCU只暴露一个调试串口,既解决了烧录调试的问题,又不会给产品增加额外的USB功耗开销。在MCU选型阶段就预判“有没有USB引脚”这类需求,能避免后期被引脚功能卡住。
6. 最终数据复盘与后续扩展
6.1 全流程功耗数据对比
所有优化完成后,我在常温下重新测了整机功耗,和优化前的对比数据如下:
| 测试项目 | 优化前 | 优化后 | 优化幅度 |
|---|---|---|---|
| 12V输入待机电流 | 约420mA | 3.2uA | 约13万倍 |
| 正常运行电流 | 约420mA | 2.1mA | 约200倍 |
| 数码管显示电流 | 约260mA | 约12mA | 约22倍 |
| 继电器动作瞬间电流 | 约60mA | 约45mA | 约1.3倍 |
| 深度休眠电流 | 无深度休眠 | 0.3uA | 新功能 |
优化后整机待机电流3.2uA,比我最初用STM32L151的Stop理论值1.3uA稍高一点,原因是外部电源路径上的DC-DC静态电流、分压电阻网络、还有LDO的静态功耗加起来约1.9uA。这属于系统的“基础税”,除非彻底更换架构,否则很难再降。实际上这个结果已经完全满足客户“待机电流小于10uA”的指标,甚至富余了一倍多。
6.2 3.2uA是怎么测出来的
为了确保3.2uA这个数据真实可信,我做了三次独立测量:第一次用六位半万用表,第二次用另一块四位的台式万用表,第三次用静电计级的电流放大器。三次数据分别是3.21uA、3.25uA、3.18uA,一致性很好。测量时把调试器拔掉,数码管关闭,继电器断开,整个板子只保留DC-DC供电和MCU的Stop模式。MCU由RTC每1秒唤醒一次,唤醒时间大约几十微秒,然后再次进入Stop模式,这个唤醒动作平均下来的电流只有约1.8uA,剩下的约1.4uA是电源和管理芯片的静态消耗。
这里有一个值得关注的点:RTC唤醒引入的“平均额外电流”等于唤醒电流乘以唤醒时间占比。唤醒电流大约4mA,唤醒时间50us,每秒1次,平均电流就是4mA×50us/1s=0.2uA,非常小。如果唤醒频率提高到100Hz,额外电流就会变成20uA,这种情况下就必须考虑降低唤醒频率或缩短唤醒时间。这个换算公式在做功耗预算时非常有用。
6.3 后续还能优化什么
3.2uA虽然好看,但并不是终点。如果产品下一步要改用电池供电,我还会做三件优化:
第一,把DC-DC换成更小静态电流的芯片,或者使用具有“超低功耗待机模式”的电源管理芯片,把静态电流压到1uA以下。
第二,所有分压电阻全部移除或者改用GPIO动态控制,一个10k欧的分压电阻接在12V上,静态就是1.2mA,这个损耗在uA级别系统里是致命的。
第三,把MCU换到Standby模式并优化启动时间,通过检查复位标志判断是冷启动还是唤醒启动,冷启动就执行完整初始化,唤醒启动就直接跳到用户代码,进一步缩短有效唤醒时间。
低功耗设计不是一次性的动作,而是一个“不断逼近极限”的过程。每次优化都会遇到新的瓶颈,但每一次瓶颈突破后,你对系统的理解都会更深一层。
回过头来看整个项目,我觉得最核心的经验不是某一颗芯片或者某一项技术,而是一套“拆解-测量-优化-再验证”的思路。遇到420mA这样的问题时,不要慌,先搞清楚电流花在哪,再针对大头动手,效果远比漫无目的地折腾固件来得好。做低功耗就像挤牙膏,挤一点是一点,但只要你真正理解了电流的流向,剩下的空间就都是你的。