UWB测距设备低功耗设计实战:从STM32到电源拓扑的完整指南 1. 先泼盆冷水为什么你的UWB测距设备电池总是一日游做UWB测距定位的开发者几乎都会在续航这件事上栽跟头。我自己第一次做基于STM32的UWB室内定位标签时满心以为只要MCU进了休眠电流就能降到微安级一块CR2032怎么也能撑几个月。结果实测下来一颗新电池三天就见底了。后来用电流探头抓波形才发现问题根本不在MCU而是我压根没搞清楚整套系统的功耗结构。标题里说一日游真不是夸张——很多团队做出来的UWB标签待机时间确实以天为单位计算。原因很简单UWB测距模块在工作时脉冲电流非常大动辄上百毫安如果你只是简单地把MCU睡眠、把模块断电却没有处理好电源通路、GPIO状态和唤醒策略那么泄漏电流、反复重启的开销、无效的测距循环都会把电池能量白白烧掉。这篇内容就是围绕怎么把UWB测距设备做到真正的低功耗来展开的。不是泛泛而谈低功耗很重要那种正确的废话而是结合STM32自身的工作模式、UWB模块的射频特性、电源拓扑设计这三个维度给出一套可以直接套用到实际产品里的设计思路和验证方法。适合正在做UWB室内定位、跟随小车、电子围栏、资产标签这类项目的朋友参考哪怕你还没开始画板子提前把这套逻辑捋清楚也能少走很多弯路。2. 为什么UWB场景比普通传感器节点更考验低功耗设计2.1 UWB测距是一次性的高脉冲负载普通的环境监测节点传感器加MCU的峰值电流通常也就几十毫安且持续时间很短对电源的冲击非常有限。UWB完全不一样。拿常见的UWB测距模块举例在测距过程中要依次经历MCU从休眠唤醒、配置SPI、打开UWB模块的晶振和射频前端、发送测距帧、接收应答帧、计算飞行时间TOF、把结果上报、然后系统重新进入休眠。其中射频发送和接收的瞬间模块电流可以达到100mA到300mA之间这个脉冲虽然只有几毫秒但它是整个功耗链路上的大象。问题在于很多人计算平均功耗时只算了测距的毫秒数乘以峰值电流却漏掉了从休眠到唤醒、从唤醒到射频稳定这两个过渡阶段的额外开销。UWB模块的晶振启动时间、PLL锁定时间往往比实际收发数据的时间还要长而这部分电流同样不小。所以评估功耗不能只看测距窗口要看整个唤醒周期的梯形电流剖面。2.2 测距间隔决定功耗量级UWB低功耗设计里最重要的一根弦是测距频率。同样是做一个UWB标签如果每100ms测距一次和每1000ms测距一次功耗差了接近一个数量级。这不是简单的频率低十倍功耗低十倍因为空闲时间的底电流会被压到很低而每次测距的固定开销唤醒时长、UWB建链时间、协议帧处理时间却基本不变所以测距频率越低固定开销在平均功耗中的占比就越小电池寿命收益会比你线性预估的还要大。我在实际项目中做过一个简化估算某次测距从唤醒UWB到彻底休眠总耗时大约4ms平均电流约80mA这个均值已经把收发峰值、晶振启动、SPI通信都折算进去了。当测距间隔为200ms时平均功耗大约是 80mA×4ms/200ms 1.6mA一年下来一颗200mAh的电池只能撑大约14天。但如果把间隔拉到2000ms平均功耗下降到约0.16mA加底电流0.01mA同样的电池可以撑114天。差距就是这么来的。所以产品定义阶段就要想清楚你的定位刷新率到底需要多高有没有可能根据场景动态调整这比任何电路技巧都先影响续航结果。2.3 UWB的低功耗陷阱永远不要在半睡半醒状态里测距还有一个很隐蔽的问题UWB模块的状态机。许多模块从休眠到Ready需要时间开发者为了省事让模块一直处于Idle状态、MCU定时去触发测距这样模块底电流本身就吃掉了几毫安甚至十几毫安。表面上看MCU是睡着的实际上整个板子的底噪已经很高了。正确做法是让UWB模块也进入深度休眠甚至完全断开模块的供电只在需要测距前的几毫秒才把它唤醒或重新上电。后面我会专门讲电源通路设计这里先记住一个原则UWB模块不该有待机态要么全速干活要么彻底断电。3. STM32低功耗模式选型UWB场景到底该用哪种睡法3.1 几种模式的横向对比STM32的低功耗模式经常被人记混尤其是Sleep、Stop、Standby三者的区别。很多人一上来就选了最深度的Standby觉得功耗最低就万事大吉结果被唤醒方式和RAM数据保留问题折腾得欲仙欲死。我按UWB测距场景的实际需求把这几个模式重新梳理一遍模式唤醒源RAM保持唤醒时间典型电流适合UWB场景Sleep任意中断全保留微秒级几十μA到几百μA不适合MCU功耗太高StopRTC/外部事件全保留几μs到几十μs1μA~5μA首选StandbyRTC/复位不保留几百μs到ms级0.3μA~1μA慎用重启开销大Shutdown复位不保留最慢纳安级不推荐对于UWB测距标签我强烈建议用Stop模式作为主睡眠态配合RTC周期唤醒。原因有三第一Stop模式下RAM不会丢你可以保留测距协议的状态机变量下次唤醒后不用重新初始化整个协议栈第二唤醒时间只有几十微秒这意味着每次测距的固定开销被压缩得很小——别忘了固定开销是平摊到平均功耗里的唤醒越快功耗越省第三Stop模式下的电流通常能做到1~2μA相比UWB模块动不动上百毫安的脉冲这1~2μA完全可以接受。3.2 Standby模式的坑不是深度睡眠就万事大吉有不少工程师迷信Standby模式觉得它电流最低。但在UWB场景里这个选择常常得不偿失。首先是唤醒后RAM全部丢失。UWB测距不是一次性的动作它可能涉及协议层的有状态信息、上次测距的时间戳、过滤后的位置数据副本等。如果每次测距都要从空RAM状态重新搭建上下文MCU要执行的初始化代码会多出好几倍这段时间里系统是跑在几十毫安的工作电流下的反而把节省的那零点几微安全亏回去了。其次是唤醒源受限。Standby模式下能唤醒MCU的外设非常少基本只能靠RTC闹钟或复位引脚这意味着你没办法用外部事件比如另一个UWB基站发来的同步信号快速唤醒标签灵活性大打折扣。所以我的结论是UWB测距设备的主睡眠态优先选用Stop模式。只有在产品对极致续航有变态要求、而且测距逻辑简单到可以不保留任何状态时才考虑Standby。3.3 时钟源选择低功耗下最容易忽略的电流黑洞进Stop模式之后系统的活动时钟基本都停了但RTC要维持走时它得有独立的时钟源。这个细节是很多设计功耗翻车的元凶。STM32的RTC可以选择LSI内部低速时钟或者LSE外部32.768kHz晶振。LSI的好处是不需要额外接晶振省成本但LSI本身的功耗比LSE高不少而且温漂很大。LSE晶振的功耗低走时精度也高得多但在低功耗模式下LSE振荡电路如果配置不当比如负载电容没匹配好电流会悄悄上涨甚至达到几十微安。我在某块板子上就遇到过这种情况板子静态电流量出来30μA怎么查都查不到哪里漏电。后来把LSE的驱动配置调低了一档电流直接掉到3μA。所以如果你用的MCU支持LSE驱动能力调节一定要选最保守的档位够用就行。省这零点几微安的振荡器驱动电流在电池账本上是很有意义的。另外如果产品有实时时钟需求而不是简单的周期唤醒建议直接用LSERTC闹钟不要开额外的时钟校准功能。虽然某些系列支持自动校准但校准逻辑本身会让MCU定期醒来干活在低功耗设计中这叫隐形唤醒会让平均功耗白白增加。4. 电源通路设计UWB模块绝对不能一直挂着电池4.1 供电拓扑让每一个电流消耗源都能被断开UWB设备的功耗大头绝对是UWB模块的射频收发而不是MCU本身。所以设计电源拓扑时核心思路很简单谁是大电流源谁就必须能被物理断电。我常用的一种拓扑是电池进来先接一个低静态功耗的LDO给MCU的VDD供电MCU的某个GPIO去控制一颗负载开关或者直接用P-MOS管再给UWB模块供电。平时GPIO输出低电平UWB模块完全断电要测距时MCU先用1ms把GPIO拉高等UWB模块上电稳定后再走SPI初始化并开始测距。为什么不用GPIO直接给模块供电因为UWB模块的峰值电流可能超过GPIO的安全驱动能力而且射频发送时电流大GPIO输出电压会跌落造成模块工作不稳定。负载开关或MOS管导通电阻小过流能力强还能顺便做电源域隔离这是最稳妥的方案。负载开关的选型有个参数特别重要静态电流Iq。便宜的负载开关Iq可能高达几十微安这会让整机底电流白白多出一截。选型时尽量挑Iq低于1μA的型号同时注意它的导通压降和开路漏电流。实测时我会把万用表串在电池负极分别量模块断电后和模块上电但不测距两种状态的电流对比负载开关的漏电是否在规格书范围内。4.2 LDO和DC-DC怎么选不只是效率问题很多人看见低功耗就无脑上DC-DC理由是效率高。但在微安级的待机场景里DC-DC自身的静态电流往往就是硬伤。我给UWB标签做过两种拓扑的对比测试一颗超低Iq的LDO静态电流约1μA一颗高效的DC-DC本身带负载时的效率确实能做到90%以上但它的静态电流有10μA左右。整机待机时UWB模块断电、MCU进Stop系统负载只有微安级这时候DC-DC那10μA的自耗电反而成了待机电流的绝对大头。最终我选了LDO方案待机电流直接砍掉一个数量级。所以我的选型经验是如果整机平均负载电流超过几十毫安比如频繁测距、带屏幕、带传感器连续采集用DC-DC划算如果大部分时间都在几十微安上下低Iq的LDO是更合理的选择。当然也有DC-DC把Iq做到几百纳安的但价格和外围成本明显更高在小电池产品里不一定划算。4.3 GPIO状态漏电的黑洞藏在你看不见的地方这部分是我排查低功耗问题时花时间最多的地方也是很多开发者最容易踩的坑。MCU进入Stop模式后所有GPIO的状态必须一个一个捋清楚。不要以为引脚没接东西就不用管浮空输入引脚的漏电流可能达到几十微安。正确的做法是所有未使用的GPIO设置为模拟输入模式这个模式下引脚内部的输入施密特触发器被关闭漏电最小所有连接外部电路的GPIO要么输出确定的高电平要么输出低电平绝不能让它们悬空。有一个特别容易忽略的场景UWB模块通过SPI接到MCU在MCU进Stop前SPI的SCK、MOSI、MISO、CS等引脚如果还停在原来的电平上而UWB模块已经断电了那么MCU的引脚会通过模块芯片内部的ESD保护二极管产生潜电路漏电。正确的断电顺序是先把SPI引脚全部配置为普通GPIO输出低电平再关掉UWB模块的电源开关。恢复供电时顺序反过来先打开UWB模块电源再把GPIO重新配置成SPI功能。顺序反了漏电就会跑出来而且这种漏电用万用表很难直接测出来因为它的路径是通过芯片内部的寄生二极管电流路径不在图纸上。另外如果你用了外部Flash、传感器之类的器件它们的电源管理也要纳入这套上电顺序体系里。我在实际调试时养成了一个习惯每次进入低功耗前用一个专门的函数关闭所有外设电源、将引脚置为确定态然后用电流表实时监测这个函数执行前后的电流变化确保每一步操作都能看到效果。如果不做这个电流导向的调试流程漏电问题会非常难找。5. 从测距完成到彻底休眠一套可复用的软件流程5.1 精确的时间预算把每个阶段的时间算到微秒级低功耗设计不能只看器件选型软件流程同样要有严格的时间观念。我习惯把一次完整的测距周期拆成几个阶段每个阶段的时间都要心里有数然后通过电流探头验证。一次标准的测距周期大致是这样阶段动作预计耗时电流量级唤醒RTC中断唤醒MCU几十μs低准备配置时钟、恢复GPIO快速通路几百μs中上电打开UWB模块供电等待稳定1~3ms中初始化SPI设置UWB模块加载配置1~2ms中高测距发送帧/接收帧/TOF计算1~4ms极高瞬态200mA存储结果写Flash/更新状态1~5ms高下电关闭UWB模块电源几μs低设闹钟设置下次RTC唤醒时间进Stop几μs低注意里面有一个隐蔽的开销如果你把测距结果写入外部Flash或者MCU内部Flash写Flash这段时间电流是很大的尤其是内部Flash写入时电压泵电路工作。有些项目为了省事每次测距都存一次历史数据结果写Flash的功耗直接比UWB测距本身还高。解决办法是要么只在关键节点落盘要么把数据在RAM里累计一批再一次性写入。这是一个很小的优化但对长续航产品的收益非常明显。5.2 动态调整测距间隔用最简单的方式大幅拉长续航我觉得UWB低功耗设计的终极大招不是把某一次测距做得多省电而是让系统按需干活。意思就是测距间隔不该是写死的而应该根据业务场景动态伸缩。比如一个UWB定位标签如果设备静止不动完全没有必要每200ms测一次距。你可以通过加速度传感器或连续几次测距结果的距离差判断设备是否处于静止状态如果连续N次位置变化小于阈值就自动把测距间隔拉长到2秒甚至10秒一旦检测到运动再把间隔缩回去。这个逻辑实现起来并不复杂省电效果却立竿见影因为前面算过间隔从200ms拉长到2000ms平均功耗可以降一个数量级。我自己做某个资产追踪标签时就采用了这个策略静止时测距间隔为2s运动时缩回200ms实际平均功耗比固定200ms的方案降低了约80%而定位体验几乎没有损失。这里面有个小注意点判断静止的时间窗口要设置合理。窗口太短会让静止判断反复切换造成不必要的测距窗口太长则会让设备从静止到运动的响应变慢影响实时定位体验。我一般取1~2秒的窗口内部做连续5~10次的阈值判断具体数值要根据产品实际需要的灵敏度去调试。5.3 代码层面的低功耗惯例从进入Stop到唤醒的完整Demo下面给出一段我常用的UWB测距标签低功耗循环骨架使用的是STM32标准外设库风格的伪代码方便你移植到自己工程里。核心思路是每次测距完成后先关掉所有高功耗外设再配置GPIO为确定态最后进入Stop模式。void UWB_LowPower_Cycle(void) { // 1. 判断是否需要唤醒测距根据上次测距时间和当前运动状态 if (!UWB_ShouldMeasure()) { UWB_EnterStopWithRTC(NEXT_WAKEUP_MS); return; } // 2. 打开UWB模块电源 GPIO_SetUWB_Power(ENABLE); Delay_Microseconds(UWB_POWER_STABLE_US); // 等待电源稳定参考模块手册 // 3. 配置SPI并初始化UWB模块如果模块每次上电都要重新初始化 SPI_Config_ForUWB(); UWB_InitModule(); // 4. 执行测距得到距离值 uint16_t distance UWB_Ranging(); // 5. 处理测距结果更新状态机必要时存Flash App_UpdatePosition(distance); App_MaybeStoreToFlash(); // 6. 断电UWB模块 SPI_DisablePinsForLowPower(); // 先把SPI引脚配置为GPIO低电平防止漏电 GPIO_SetUWB_Power(DISABLE); Delay_Microseconds(UWB_POWER_DOWN_STABLE_US); // 7. 配置RTC唤醒时间进入Stop RTC_SetAlarm(NEXT_WAKEUP_MS); HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); SystemClock_ConfigAfterWakeUp(); // 从Stop唤醒后要重新配置时钟 }有几个细节想特别提醒第一进入Stop前一定要调用HAL_PWR_EnterSTOPMode而不是直接WFI指令。虽然原理上都是等待中断但HAL库会处理低功耗模式下的稳压器切换这对功耗影响很大。第二从Stop唤醒后芯片的主时钟需要重新配置。别以为代码能跑就没问题——很多项目在唤醒后没有重新设置PLL导致系统跑在HSI内部高速时钟上虽然功能正常但MCU执行效率下降每次测距的时间变长功耗悄悄增加。这个坑我见过好多次。第三如果你的UWB模块支持保留配置内容的睡眠模式也可以考虑不断电只让模块休眠的方案。但这种方式对模块的漏电流要求极高很多UWB模块号称睡眠电流是微安级实际测试却因为内部稳压器配置问题跑出几十微安。我的建议是在模块真正深度断电和模块自身Sleep两种方案之间做一个实测对比不要只看数据手册。我的经验是大多数低成本UWB透传模块断电重初始化的开销并不比模块休眠大多少但底电流干净得多。6. 电源监测与实测方法数据会告诉你一切6.1 万用表测不出真相你需要看完整的时间电流曲线很多人在开发板上用万用表测平均电流测出来一个几百微安的数值就觉得低功耗做得差不多了。这其实是不够的甚至是有误导性的。因为UWB测距时的电流波形是低平直线尖峰的组合万用表积分出来的平均值完全掩盖了瞬态尖峰的存在。有些时候你算出来的平均电流看起来不大但电源被尖峰一打实际电池容量利用率低得可怜因为电池内阻在高倍率放电下会损失大量能量。我开发低功耗设备时最常使用的是串联采样电阻示波器的测量方法。在电池和主板之间串一个10Ω或1Ω的采样电阻用示波器测量电阻两端的电压波形再除以电阻值就是电流波形。这种方法可以看到从唤醒到测距完成再到休眠的完整电流轮廓能直观发现意外的高电流平台或异常的长尾电流。对于微小电流的精确测量我用两种手段互相验证一台可以测到1nA分辨率的台式万用表比如带皮安档位的用来测底电流一个低噪声电流探头带宽足够覆盖UWB的瞬态脉冲用来测尖峰和整段波形。这两样东西配合起来能覆盖从纳安级到安培级的完整测量范围是低功耗调试的黄金搭档。如果没有专业电流探头用采样电阻法加示波器也可以达到类似的效果只是要注意采样电阻会引入压降不能让UWB模块工作电压跌到规格下限以下。我自己习惯选10Ω的电阻UWB工作时最大压降约为10Ω×300mA3V这太高了所以实际用的是0.1Ω或0.5Ω的采样电阻在灵敏度够用的前提下保证模块供电不塌陷。6.2 实测波形解读几个典型的问题电流特征这里分享几种我踩过坑的电流波形特征你可以对照自己的测量结果判断问题在哪。第一种是基线上漂理想状态下系统休眠时的底电流应该是一条平稳的直线但如果GPIO漏电或者LSE配置不对底电流会从1μA慢慢漂到十几μA甚至几十μA。这种问题用万用表测平均电流很难发现因为平均值被后面的测距尖峰稀释了只有看示波器波形才能看得到。第二种是测距后的拖尾UWB测距完成了电流应该立刻回落到底电流但如果软件里忘记关掉某个外设时钟、或者SPI引脚没处理完电流会先在1~5mA水平维持一段时间再缓慢掉下去。这个拖尾哪怕只持续10ms都会让平均功耗上升一个台阶而且非常容易被忽略。我排查这种拖尾时会用手逐个关闭外设时钟__HAL_RCC_xxx_CLK_DISABLE()同时盯着示波器看哪个外设关闭后电流明显回落就是它在捣鬼。第三种是频繁的小锯齿RTC报警设置得太密或者有某种中断源在反复唤醒MCU。到位后MCU还没测距就又睡了这种锯齿状的电流波形会让系统几乎跑不出Stop模式电池自然飞快耗干。检查方法是用示波器看唤醒频率是否和RTC配置一致以及把未使用的EXTI中断全部禁用。6.3 电池选型不只算容量还要看脉冲承受能力很多人选电池只盯着mAh却忽略了电池的脉冲放电能力。UWB测距的峰值电流可能有200mA甚至更高而你又希望电池容量尽量小因为标签体积有限这就对电池的化学体系和内阻提出了要求。以CR2032纽扣电池为例标称容量约220mAh但它的瞬时大电流放电能力很弱持续200mA脉冲会导致电池电压明显跌落甚至跌到UWB模块的最低工作电压以下引发模块复位。我在早期方案里吃过这个亏理论计算续航很理想实际一测距UWB模块经常复位导致协议流程混乱功耗居高不下。所以选电池时你至少要确认三件事电池在峰值电流下的最小输出电压是否高于整个系统含UWB模块的最低工作电压加LDO压降。电池的连续脉冲能力是否覆盖你的每次测距峰值电流持续时间。电池在低温环境下如果产品可能用到低温环境的大电流放电能力会明显下降这一点很容易被忽略。如果纽扣电池扛不住可以考虑并联一个超级电容或者小型钽电容阵用来给UWB模块的瞬时脉冲兜底。这样电池只需要提供经过电容平滑后的较低平均电流峰值电流由电容组承担很多小体积产品就是用这个办法解决脉冲供电问题的。电容容值的估算方法是假设测距时电流峰值是250mA、持续3ms电压跌落容忍是0.3V那么需要的储能约为250mA×3ms/0.3V2.5mF。考虑到电容ESR和余量我一般取三到五倍的设计值也就是选8mF到12mF左右的储能电容放在UWB模块电源附近。7. 进阶思路站在系统层面把功耗再压下去7.1 用一颗超低功耗协处理器管理UWB模块如果你的产品是UWB基站和标签同时存在、需要大量测距调度可以考虑用一个更加极端的架构超低功耗MCU比如专门为低功耗传感设计的Cortex-M0系列作为主控让它在大部分时间深度睡眠再通过引脚唤醒或串口唤醒去控制UWB模块。STM32之外的协处理器可以做到几微安甚至亚微安的待机功耗比STM32自身的Stop模式还要省适合对续航要求极高的手环、标签类产品。我自己在某款资产标签里就采用过类似的架构主控是超低功耗MCU负责RTC定时和运动检测STM32负责重负载的UWB测距和定位算法。系统平时只有超低功耗MCU在跑每2秒唤醒一次通过一个引脚触发STM32上电测距完成后立刻断电。这种架构有一个好处STM32的唤醒逻辑被独立分离出来软件上更清晰调试也方便。代价是BOM成本增加PCB面积变大PCB布线时候要注意两个MCU之间的电平转换和去耦电容设计。7.2 UWB模块厂商自带的低功耗模式别急着用先验证有些UWB模块声称支持睡眠模式电流能降到几微安。这个数字很诱人但在实际项目中我会先做一轮实测再决定用不用。模块睡眠模式的问题在于它内部的DC-DC/LDO往往还是带电的只是射频前端关闭了底电流取决于模块内部电源管理电路的设计质量。有些模块标称10μA睡眠电流实测能到30μA甚至更高而且睡眠模式的唤醒时间看似很短但唤醒后射频状态可能需要重新校准反而比冷启动还慢。上了量产后不同批次模块的睡眠电流离散性也可能很大。我的判断标准很简单如果模块睡眠电流实测低于2μA且唤醒后状态恢复稳定就用睡眠模式如果实测超过5μA果断改用物理断电方案别跟数据手册赌人品。7.3 动态电压和RTC补偿在看不见的地方省下毫安时最后一个容易被忽略的方向是MCU工作电压和时钟的精细管理。STM32在不同主频下都有最低工作电压要求。如果你的产品只在测距的时候才需要高主频其他时间可以降低系统时钟同时把内核电压调到更低的档位。这样虽然省下的电流可能只有几百微安但乘以每一次测距的耗时、再乘以日复一日的运行账面上也是一笔不小的收益。具体能不能调、调多少需要逐个型号看手册里的电源管理章节有些型号支持通过PWR寄存器调整稳压器输出电压有些则不支持。RTC的时钟温漂也值得留意。我曾经在低温环境下测试整机续航发现实测值比常温下降了20%以上。除了电池低温性能下跌之外LSE晶振低温漂移导致RTC走时变快、设备提前醒来也是一个因素。如果产品使用环境温差大可以考虑软件层面对RTC做温度补偿或者使用带温度补偿的晶振。这个细节对精度要求严格的应用尤其重要不然你算好的续航余量会被环境偷偷吃掉。8. 最后的个人体会低功耗不是做完而是测出来的聊到这估计你也发现了低功耗设计的难点从来不是某一个器件的选型而是整条链路里若干个细节的叠加。UWB本身是一个高功耗射频技术把它和低功耗这三个字放在一起本质上是在做一场能量预算的精细平衡。每一次测距的时长、每一个GPIO的漏电、每一微安的LSE驱动、每一毫秒的唤醒延迟单看都不起眼叠在一起就是一日游和持久战的差别。我自己最深的感触是千万不要在开发板上验证完原理就直接信心满满地投板。一定要在做完一版原型后用电流探头去抓整段睡眠—唤醒—测距—再睡眠的波形并对着波形一个阶段一个阶段地扣。只有当你亲眼看到那条电流曲线和自己设计的时间预算一一对应你才敢说这颗电池能撑多久心里有数。另外一个很实用的小技巧在代码里加一个低功耗自检模式通过调试串口打印每次测距周期中各个阶段的时间开销和电流估算值这样后面的现场测试和问题复现都能有数据支撑。我后来做的每个低功耗项目都会保留这个功能它帮我在现场排查棘手问题时省下非常多时间。如果你正被UWB设备的续航问题折磨从这三件事入手第一确认UWB模块是否被物理断电了第二把MCU睡眠态调到Stop并检查所有GPIO第三用示波器完整看一次测距周期的电流波形。做完这三步你的电池续航大概率能原地提升一个量级。后面再按照本文的方法去迭代你会慢慢发现持久战并没有那么遥不可及。