ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

无电池BLE节点设计复盘:能量收集与低功耗优化

无电池BLE节点设计复盘:能量收集与低功耗优化 看标题就知道这是一篇围绕“能量收集 BLE”展开的硬件设计复盘。Battery-Free、Energy-Harvesting、nRF51822这三个词放在一起懂行的人已经能猜到核心矛盾在哪里不是无线通信有多难也不是传感器数据怎么采而是“没有电池之后整个系统的能量预算怎么算、怎么省、怎么扛过没有能量的时刻”。下面我把整个项目从需求分析、器件选型、功耗模型、固件联调到实测踩坑完整拆开来讲希望能给正在做类似无电池IoT节点的人一些可复用的思路。1. 为什么“无电池”是BLE门类里最难的一档设计做BLE模块的人都知道BLE本身已经够省电了一颗CR2032纽扣电池能让一个beacon跑一两年。这也是大多数人对BLE功耗的认知——但“省电”和“无电池”是两回事。省电的前提是电池在能量池子再小也是稳定的而无电池意味着所有能量都得从环境里现抓现用系统随时可能因为光照变弱、温差变小、射频源消失而直接断电。这种“随时会死”的设计约束让BLE的每一个参数选择都变成了能量层面的博弈。先说清楚传统BLE节点在功耗上被宠坏的地方。一个典型的温度传感器节点用CR2032、定时30秒上报一次平均电流可以做到20μA以下电池理论寿命能算到两年以上。设计者几乎不需要关心单次广播消耗了多少能量因为电池容量是按“毫安时”计的存量的概念非常清晰。但换成能量收集之后供电模型完全变了能量是实时到达的光照在白天可能给你几十微瓦到了晚上就是零系统能做的只有两件事——把多余的能量存进电容以及在没有能量输入时把消耗压到最低。所以为什么偏偏是nRF51822这颗老SoC经常出现在能量收集BLE项目里我在选型时对比过好几颗芯片最终还回到它原因有三。第一nRF51822的供电范围是1.8V到3.6V这颗SoC可以在储能电容跌到接近2V时还能正常工作给能量管理留出了很大缓冲空间。很多更新的芯片虽然标称低功耗更漂亮但电源轨对电压跌落更敏感在能量收集这种电压波动剧烈的场景反而更容易触发复位。第二nRF51822内部集成了DCDC降压转换器。开启DCDC之后TX 0dBm发射电流大约5.3mARX电流大约5.3mA运行模式16MHz主频加Flash执行大约2.8mA睡眠模式System ONRTC运行24KB RAM保持可以压到2.6μA。这个数字用今天的眼光看不算极限低但在能量收集场景下已经非常够用因为系统的平均电流要靠“睡眠占空比”拉下来而不是靠瞬时电流本身有多低。第三生态成熟度。nRF51822搭配Nordic的SoftDevice协议栈从S110到S130都有大量现成参考代码能量收集类项目要做的不是从零写BLE协议而是把精力放在能量管理和功耗测量上。这个项目最终定义的目标场景很简单一个安装在天花板或窗边的室内环境监测节点通过太阳能板收集室内灯光能量用超级电容储能定期测量温湿度并通过BLE广播方式上报给网关。用户不需要换电池安装之后期望寿命是“至少三年不需要人工维护”。这类需求在智能楼宇、冷链仓储、农业大棚里非常典型单看功能平无奇但“不换电池”这个要求在工程实现上会带出一连串问题。2. 能量收集与储能选型太阳能板、MPPT、超级电容的配套逻辑2.1 室内光能为什么比其它能量源更适合做起点能量收集的环境源大体分四类光能、热能、射频能、振动能。我在项目早期都评估过结论是室内光能是最容易做稳的起点。室内光能典型室内照度100到500勒克斯一块2cm×2cm的非晶硅太阳能板能输出5到20μW的功率。功率虽然小但胜在普遍存在——办公室、仓库、商场都有灯白天空调房里的照度基本稳定。热能需要温差TEG热电片要20℃以上的温差才有可观的输出工业设备表面也许能满足但室内环境温差不稳定。射频能需要专门的射频能量收集天线和整流电路输出功率往往在1μW以下BLE广播一次消耗的能量都不够效率太低。振动能适合机器设备震动环境对安装位置要求苛刻通用性差。所以这个项目最终锁定的是室内太阳能板。这里有一个选型要点室内光能必须选非晶硅或弱光性能好的太阳能电池而不是户外常用的单晶硅。单晶硅在标准太阳光下效率高但到了200勒克斯的室内灯光下输出电流会掉到几乎不可用非晶硅在弱光下的表现要好得多开路电压也更高对升压电路的启动更友好。2.2 能量管理IC选型bq25570和ADP5091怎么选太阳能板输出的电压和电流都会随光照剧烈变化直接接到电容上充电不仅效率低还很容易把太阳能板拉到非最大功率点。所以中间必须有一级能量收集PMIC完成升压、最大功率点跟踪MPPT、过压保护和输出电源管理。这个环节我对比过两款主流芯片。项目TI BQ25570ADI ADP5091冷启动输入电压约330mV最低约100mV可启约380mV静态电流典型488nA典型约1.4μAMPPT内置需外部电阻分压设置开路电压比例内置需配置输出管理集成LDO可编程输出1.8V-3.3V集成LDO可编程输出外围复杂度较低略高但效率上限更高最终我选了TI BQ25570。理由不是ADP5091不好而是BQ25570的静态电流更低在系统平均电流只有几微安的设计里PMIC自己吃掉488nA还是1.4μA直接影响能量预算平衡。另一个原因是它内置LDO输出可以直接给nRF51822供电省掉一级外部LDO。这里有个非常关键的参数需要单独拎出来说BQ25570的MPPT配置。它的原理是定期断开输入采样开路电压然后通过外部电阻分压设置一个“最大功率点占开路电压的比例”。太阳能电池的MPPT电压大概在开路电压的70%到80%之间但不同光照下开路电压本身会变化所以这个比例电阻网络需要反复实测标定。我在项目初期偷懒直接按数据手册推荐值设了80%结果室内200勒克斯下充电电流只有理论值的六成左右后来用可调电阻逐步扫才发现这台太阳能板在室内场景的最优比例大约是74%。这个差异在户外强光下不明显但在弱光下会直接决定系统能不能从能量赤字里恢复过来。2.3 超级电容容量不能只看电容值要看“能量信封”储能部分我没有用可充电锂电池主要原因是锂电池的循环寿命有限几百次充放电之后容量衰减明显而且小体积锂电池的充电电流限制、保护电路、和低温性能都不适合能量收集场景。最终选择的是超级电容。超级电容的循环寿命动辄五十万次以上可以承受大电流充电工作温度范围宽这是它的核心优势。但超低功耗系统里有一个经常被忽略的问题超级电容的自放电电流不小1F级别的电容静态自放电可能在1到5μA之间。当你的整个系统平均电流控制在4μA左右电容自己漏掉的电流占比非常高选型时必须把漏电流参数一起考虑不能只顾容量。电容容量怎么定我的思路不是拍脑袋选个“大一点更保险”而是先算能量信封。系统最低工作电压由nRF51822的1.8V下限决定BQ25570的LDO输出我设定在2.5V为了保证纹波余量。超级电容后端通常直接接电池管理芯片输出所以电容电压会跟随输入能量在2.5V到电容耐压上限之间波动。假设用一只1F、耐压2.7V的超级电容可用电压范围从2.5V下降到2.0VΔV0.5V可用电荷量QC×ΔV1F×0.5V0.5库仑如果系统平均电流4μA理论上可以维持的时间tQ/I0.5÷4μA125000秒约34.7小时这个34.7小时就是“能量信封”意思是即使连续一天多没有光照系统仍然能维持基本工作。用来抵御室内环境偶尔的阴天、关灯场景完全够用。如果想增加夜间续航不是简单把电容翻倍——因为电容体积、漏电流、成本都会上来更好的办法是降低睡眠电流比如把System ON模式换成RTC唤醒带掉电检测或者降低广播频率。3. 功耗预算把nRF51822的每一微安都算到刀刃上3.1 先给出货真价实的功耗地板很多人对BLE设备功耗的认知是“反正BLE很省电”然后直接把Nordic官方给的睡眠电流当成系统平均电流。这是能量收集项目里最容易踩的第一个坑。官方给的2.6μA仅仅是System ON、RTC运行、RAM保持时的静态电流一旦你有任何外设、任何周期唤醒、任何传感器平均电流都会往上走。先把nRF51822在不同状态下的实测功耗列出来,这是我用电流分析仪实测到的数据比数据手册更接近真实情况状态条件实测电流System OFF无RTC仅保留唤醒引脚约300nASystem ON睡眠RTC运行24KB RAM保持DCDC开启2.6μA至2.8μA运行模式16MHz执行Flash代码外设空闲约2.8mATX发射0dBm输出DCDC开启5.3mATX发射-20dBm输出DCDC开启约1.6mARX接收灵敏度范围内DCDC开启5.3mA这里可以看到一个关键事实运行模式和无线收发都是毫安级别的电流只有睡眠是微安级别。能量收集系统的本质就是把瞬态毫安级别的负载通过时间平均压低到微安级别。而这完全取决于你的唤醒频率、任务时长和睡眠占空比。3.2 一个完整的1秒周期功耗建模假设设计需求是30秒间隔采集一次温湿度5秒间隔广播一次beacon其余时间全部睡眠。我们来算平均电流。广播部分BLE广播事件持续约1.2ms包含TX阶段。如果使用-4dBm发射功率电流大约1.6mA。每次广播的能量消耗大约是1.6mA×1.2ms1.92μA·s。如果广播间隔5秒平均电流是1.92÷5≈0.38μA。传感器采集部分BME280单次测量加读取需要约20ms工作电流约0.4mA能量消耗0.4mA×20ms8μA·s。每30秒一次平均电流8÷30≈0.27μA。唤醒开销从睡眠到运行需要CPU启动、时钟稳定、协议栈处理这一小段大约2ms电流2.8mA能量5.6μA·s。每5秒一次广播唤醒和每30秒一次传感器唤醒折算下来约0.25μA。睡眠电流2.6μA持续存在。总计2.6睡眠 0.38广播 0.27采集 0.25唤醒开销 ≈ 3.5μA。这个3.5μA就是要在脑海里反复比较的关键数字。回到室内太阳能板的输出能力一块20×20mm的非晶硅太阳能板200勒克斯照度下经过BQ25570升压后实际能给系统供应的电流大概在5到8μA。也就是说白天有约2到4μA的净盈余流入超级电容夜间没有光照系统靠电容撑住大约34小时的内电容量足够覆盖一个晚上加一个阴天。整个系统在能量维度上是平衡的。3.3 连接模式为什么在设计中被直接放弃如果把这个节点改成连接模式——比如网关主动连接、手机App实时读取数据——功耗会变成什么样以连接间隔100ms为例每个连接事件包含一次TX和一次RX时间取一个典型值4ms电流5.3mA单次连接事件能量消耗5.3mA×4ms21.2μA·s。100ms一次意味着每秒10次平均电流212μA。这已经是广播方案的几十倍能量收集系统根本供不起除非太阳能板做得很大或者光照极强。所以无电池BLE节点在应用模式上必须接受一个现实只能做低占空比单向广播或极低频连接。这个结论不是固件优化能解决的是能量物理决定的。如果业务确实需要双向通信只能退一步把连接间隔放到1秒以上并且接受更高的平均功耗和更苛刻的充放电平衡。这是产品定义阶段就要明确的边界。4. 固件与硬件联调五个差点翻车的细节4.1 掉电检测与复位原因识别别让系统“饿死”和“假活”混在一起能量收集系统最典型的异常场景是超级电容电压缓慢下降进入nRF51822的最低工作电压区间边缘芯片开始复位、重启、再复位。如果固件没有识别复位原因的能力看到的现象就是“模块随机重启”完全没法排查。正确的做法是开芯片的BOD也就是掉电检测。nRF51822内部有Power模块可以配置POFCON寄存器来设置掉电检测阈值。我会把阈值设置在2.0V左右比芯片最低工作电压1.8V留出约0.2V的余量。一旦电压低于这个阈值系统会触发掉电复位而不是卡死在未知状态。同时每次启动时要读POWER-RESETREAS寄存器判断这次复位是怎么来的。nRF51822会在该寄存器里标出上电复位、掉电复位、外部复位、看门狗复位等来源。我写了一个很小的启动函数void check_reset_reason(void) { uint32_t reason NRF_POWER-RESETREAS; if (reason POWER_RESETREAS_BOD_MASK) { log_reset_event(FLASH_LOG_TYPE_BOD); } if (reason POWER_RESETREAS_OFF_MASK) { log_reset_event(FLASH_LOG_TYPE_SYSTEM_OFF); } NRF_POWER-RESETREAS reason; }把复位原因记录到Flash之后我才能在长期部署中判断“模块是不是因为夜里没光饿死的”而不是毫无头绪地怀疑射频干扰或者程序bug。这个日志在野外调试时价值极大但我发现很多项目根本不做导致现场问题都没法复现。4.2 能量感知调度不要在低电压时执行完整任务就算有了BOD保护固件也不应该每次都尝试执行完整的“采集广播”任务。低压状态下一次完整的传感器测量可能直接把电压拉垮进入反复复位循环。更好的做法是做一个能量感知的调度器RTC定时唤醒后先用ADC读取超级电容电压判断当前储能水平再决定这一轮要做什么。我的实现方式是定义三个状态电压高于2.4V正常模式执行采集、广播、日志记录全部任务。电压在2.1V到2.4V之间省电模式跳过传感器采集只广播一次极简状态包把剩余能量留给通信模块。电压低于2.1V直接回到睡眠连广播都不发等BOD阈值保护。这个策略的意义在于系统在能量不足时不是消极等死而是把最后的能量用在最关键的“告知网关我还活着”这个动作上。网关侧看到的状态是信号从“数据完整”逐渐退化为“心跳上报”再到彻底离线整个退变过程非常可预测。4.3 广播参数不要迷信默认配置BLE广播参数在Nordic的示例代码里默认是间隔100ms、开启扫描响应、使用0dBm发射功率。这个配置放在电池供电的设备上没问题但放到能量收集系统里功耗直接爆表。100ms的广播间隔意味着每秒10次广播光广播平均电流就接近10μA量级已经超出室内光能供给能力。实际调试后我把广播参数调成了这样广播间隔500ms到1秒之间兼顾被发现速度和功耗平衡。考虑到这是一个长期部署的固定节点发现延迟1秒完全可接受。发射功率-4dBm实测在室内30米内信号强度依然在-70dBm左右足够网关接收。扫描响应关闭只在广播数据里放入温湿度、电压、设备ID这几个字段每个包控制在28字节以内。这个调整把广播平均电流从默认配置下的约9μA降到了不到0.4μA是整个项目功耗优化中收益最大的一步。很多人在能量收集项目里只顾着选低功耗芯片却忽略了协议栈参数才是占空比的大头。4.4 传感器供电与上电时序浪涌电流会吃掉预算传感器不能一直挂电。我最初图省事把BME280直接接在3.3V上然后用I2C让它进入睡眠模式。实测发现即使传感器在睡眠模式也会消耗1.5μA左右的电流。对能量收集系统来说这1.5μA占整个预算的30%以上完全不能接受。改进方式是用一只P-MOS管做负载开关让单片机的GPIO直接控制传感器电源。测量前先把电源打开等5ms电容充电稳定再执行I2C测量。测量完成后立刻关断传感器电源做到零待机漏电。这个5ms的等待时间需要在初始化流程里加进去否则第一次I2C通信大概率失败因为传感器上电后还没稳定。传感器上电浪涌也是个隐性问题。BME280在上电瞬间会有一个约1mA到2mA的尖峰持续很短。如果电源电容不够大这个尖峰可能把电压拉低到复位阈值以下。我在传感器电源旁边加了一颗10μF的陶瓷电容配合100Ω的RC滤波有效抑制了上电浪涌对主电源轨的冲击。4.5 功耗测量工具万用表在这个项目里几乎不可用能量收集系统的功耗特性是“长时间微安级睡眠叠加毫秒级毫安脉冲”用普通万用表的电流档根本测不出有效值因为万用表积分时间太长会把脉冲电流压平。我后来用了一台带有高带宽电流采样功能的功耗分析仪可以实时画出整个工作周期的电流波形。拿到真实波形之后我在帧里看到了一个意外每次广播事件的末尾都有一个约0.5ms、2mA的平台电流持续了大约10ms。查代码发现是SoftDevice在每次广播结束后会做一些内部维护如果我们关掉某些调试日志功能这部分电流可以降很多。这就是“看波形”和“看数据手册”的区别——文档不会告诉你这些细节但实测波形会。5. 实测数据与踩坑记录室内光照下的真实运行行为5.1 三个在测试里才暴露出来的坑第一个坑是超级电容的漏电流。我一开始用的是一颗杂牌1F/2.7V电容规格书没有标漏电实测自放电电流高达8μA比整个系统平均电流还大。后来换成低漏电型号自放电降到约2μA系统立刻从“每天晚上电压触底”变成“全天电压平稳”。这个数字直接决定了阴天系统能不能撑住绝对不能在选型时忽略。第二个坑是BQ25570的MPPT电压比例。前面提过标称70%到80%但室内弱光下最优比例和户外差异很大。我通过反复拉电流曲线最终在一个330kΩ的可调电阻网络上找到了最佳点。测试方法很简单把太阳能板放在标准200勒克斯灯箱下接上电流表扫描不同MPPT比例记录充电电流挑最大的那组。整个过程不需要昂贵仪器但必须做。第三个坑是首次上电假死。模块出厂时超级电容是零电荷状态直接接到BQ25570上它会因为负载太深而无法启动升压电路。解决办法有三种一是出厂前给超级电容预充一部分电让用户拿到手插上太阳能板就能在几小时内启动二是在电容两端并联一个漏电路径让能量管理IC能逐步把电压抬起来三是在硬件上加一个“预充电”按钮由用户主动触发。最终我在量产版本里选择了出厂预充一个基础电压并在说明书里写明“首次启用需要阳光下放置一两天”。5.2 我在室内不同光照场景下记录到的真实运行数据以下数据来自一段长约10天的连续测试节点安装在办公室窗边和室内靠墙两个位置记录系统电压变化场景照度范围太阳能板充电电流系统平均电流电压趋势窗边白天300-800 lux12-25μA3.5μA稳定上升室内靠墙白天100-200 lux4-7μA3.5μA基本持平夜间/关灯0-10 lux0μA3.5μA缓慢下降连续阴天50-100 lux1-3μA3.5μA持续下降测量结果和预算模型比较吻合室内靠墙场景白天电流刚好覆盖系统消耗夜间靠1F超级电容坚持连续阴天两到三天后系统电压可能跌破2.0V进入BOD保护需要等到光照恢复后再充电启动。这个行为在项目设计时已经提前定义好所以即使在最恶劣条件下设备也不会损坏只会“暂停工作”光照恢复后自动重启。5.3 从原型到产品化还要解决哪些现实问题原型能跑起来和能批量部署是两回事。测试结束之后我额外关注了三个产品化问题第一出厂预充电。用户拿到设备时如果超级电容是空的需要放一天才能看到数据体验非常差。我在制造流程里增加了“出厂预充电”工序让设备出厂时就带上约2.3V的初始能量。这样用户开箱接上太阳能板几小时内就能完成首次上报。第二低能量状态的可观测性。网关侧必须能区分“设备正常工作但数据没变”和“设备已经停机”两种状态。我在广播数据里增加了电压值字段这样只要网关还能收到beacon就能判断设备能量状况提前安排维护。第三nRF51822之后是否要升级到nRF52系列。从技术上看nRF52832的睡眠电流更低、Flash更大、协议栈更先进但供电范围、DCDC外围设计、以及引脚兼容性都需要重新验证。我的建议是除非产品有更复杂的交互需求否则在能量收集这个特定场景里nRF51822的成熟供应链和大量参考设计反而更省心。盲目换芯带来的风险远超那零点几微安的睡眠电流收益。这个项目做下来我最深的一点体会是能量收集BLE系统靠的不是某一颗芯片有多神奇而是一整套从光伏板到PMIC、从电容到协议栈参数、从复位管理到传感器供电策略的体系化设计。每一个环节的“差不多”最终都会变成微安级的超支累积起来就是夜里那一次电压触底复位。如果你手头也有类似的能量收集项目建议从功耗预算表开始建模型再动手画板写代码——先算清楚再去实现能少走很多弯路。
返回列表