无电池BLE节点设计复盘:能量收集与低功耗优化
2026/8/27 8:31:01 网站建设 项目流程

看标题就知道,这是一篇围绕“能量收集 + 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.3mA,RX电流大约5.3mA,运行模式16MHz主频加Flash执行大约2.8mA,睡眠模式(System ON,RTC运行,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μA
MPPT内置,需外部电阻分压设置开路电压比例内置,需配置
输出管理集成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,ΔV=0.5V
  • 可用电荷量:Q=C×ΔV=1F×0.5V=0.5库仑
  • 如果系统平均电流4μA,理论上可以维持的时间:t=Q/I=0.5÷4μA=125000秒,约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,仅保留唤醒引脚约300nA
System ON睡眠RTC运行,24KB RAM保持,DCDC开启2.6μA至2.8μA
运行模式16MHz,执行Flash代码,外设空闲约2.8mA
TX发射0dBm输出,DCDC开启5.3mA
TX发射-20dBm输出,DCDC开启约1.6mA
RX接收灵敏度范围内,DCDC开启5.3mA

这里可以看到一个关键事实:运行模式和无线收发都是毫安级别的电流,只有睡眠是微安级别。能量收集系统的本质,就是把瞬态毫安级别的负载,通过时间平均压低到微安级别。而这完全取决于你的唤醒频率、任务时长和睡眠占空比。

3.2 一个完整的1秒周期功耗建模

假设设计需求是:30秒间隔采集一次温湿度,5秒间隔广播一次beacon,其余时间全部睡眠。我们来算平均电流。

  • 广播部分:BLE广播事件持续约1.2ms,包含TX阶段。如果使用-4dBm发射功率,电流大约1.6mA。每次广播的能量消耗大约是1.6mA×1.2ms=1.92μA·s。如果广播间隔5秒,平均电流是1.92÷5≈0.38μA。
  • 传感器采集部分:BME280单次测量加读取需要约20ms,工作电流约0.4mA,能量消耗0.4mA×20ms=8μ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×4ms=21.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、从电容到协议栈参数、从复位管理到传感器供电策略的体系化设计。每一个环节的“差不多”,最终都会变成微安级的超支,累积起来就是夜里那一次电压触底复位。如果你手头也有类似的能量收集项目,建议从功耗预算表开始建模型,再动手画板写代码——先算清楚,再去实现,能少走很多弯路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询