2. 系统总体架构设计:节点硬件组成与软件分层
好,咱们进入正题。第二章讲的是系统总体架构,说白了就是——这个能耗监测节点到底长什么样?里面有哪些东西?它们怎么协同工作?
我习惯在设计任何嵌入式系统之前,先画一张大图。这张图里要有硬件模块、软件层次,还有数据怎么流。今天咱们就把这张图给画出来。
2.1 节点硬件组成
一个低功耗无线能耗监测节点,硬件上就四个核心部分:传感器、MCU、无线模块、电源。嗯,听起来简单,但每个部分的选择都藏着坑。
2.1.1 传感器选型
能耗监测,测什么?主要是电流和电压。我常用的方案有两种:
- 电流互感器(CT)+ 运放:适合交流电,成本低,但需要外部调理电路。我在一个项目中用过这个方案,结果运放的偏置电压没处理好,导致小电流下误差很大。后来加了软件校准才搞定。
- 专用计量芯片(如HLW8032、ADE7953):内部集成了ADC、功率计算、甚至串口输出。说白了就是一颗芯片搞定所有。我个人偏爱HLW8032,因为它功耗低,而且直接输出有功功率,MCU不用做复杂计算。
我的建议:如果节点数量多、要求精度高,直接上计量芯片。省心,而且功耗可控。
2.1.2 MCU的选择
MCU是整个节点的大脑。低功耗设计下,MCU的选择直接决定了待机电流。
我常用的MCU有:
- STM32L0系列:待机电流低至0.3μA,适合电池供电。我在一个水表项目里用过,一节CR2032撑了两年。
- ESP32-C3:带WiFi和蓝牙,适合需要本地通信的场景。但注意,它的深度睡眠电流在5μA左右,比STM32L0高一个数量级。
- EFM32系列:Silicon Labs的,待机电流可以做到0.1μA以下。不过价格稍贵。
避坑指南:我曾经选了一款MCU,数据手册上写待机电流0.5μA,结果实际测出来是2μA。为什么?因为它的RTC还在跑。所以选型时一定要看「所有外设关闭」下的电流,别被宣传数据骗了。
2.1.3 无线模块
无线模块负责把数据发出去。低功耗场景下,主流选择就两个:
| 模块类型 | 典型功耗(发射) | 通信距离 | 适用场景 |
|---|---|---|---|
| LoRa(如SX1278) | 20mA @ 20dBm | 2-5km(视距) | 广覆盖、低速率 |
| BLE(如nRF52840) | 5mA @ 0dBm | 10-100m | 近距离、手机直连 |
| WiFi(如ESP8266) | 80mA @ 15dBm | 50-100m | 家庭内部、高带宽 |
我个人习惯用LoRa做远距离监测。你想想看,一个工厂里几百个节点,如果用WiFi,路由器得装多少?而且WiFi的功耗太高,电池撑不住。
2.1.4 电源设计
电源是低功耗设计的灵魂。我见过太多项目,硬件选型都对了,结果电源效率低,整体功耗翻倍。
常见的电源方案:
- 电池 + LDO:简单、纹波小,但效率低。适合电流很小的场景(<10mA)。
- 电池 + DC-DC:效率高(90%以上),但纹波大。适合需要大电流发射的场景。
- 超级电容 + 电池:用于峰值电流很大的场景(比如LoRa发射时瞬间电流120mA)。
注意:我曾经在一个项目里直接用LDO给LoRa模块供电,结果发射时电压被拉低,导致模块复位。后来换成了DC-DC,并在输出端加了一个100μF的电容,问题解决。
2.2 软件分层架构
硬件搭好了,软件怎么组织?我习惯用分层架构。说白了,就是把代码分成几层,每层只管自己的事。
我的分层方式是这样的:
- 硬件抽象层(HAL):直接操作寄存器或外设。比如读ADC、写SPI。
- 驱动层:封装具体芯片的驱动。比如HLW8032的读写函数、SX1278的配置函数。
- 中间件层:协议栈、数据缓存、任务调度。比如LoRaWAN协议栈、环形缓冲区。
- 应用层:业务逻辑。比如什么时候采样、什么时候发送、怎么处理异常。
举个例子,一个典型的采样任务代码结构:
// 应用层:采样任务
void app_sampling_task(void)
{
uint32_t energy_data;
// 调用驱动层函数
energy_data = hlw8032_read_energy();
// 调用中间件层函数,存入缓存
buffer_push(energy_data);
// 判断是否需要发送
if (buffer_is_full()) {
lora_send(buffer_get_all());
buffer_clear();
}
}
你可能会问:为什么要分这么细?我在一个项目里吃过亏——所有代码都写在一起,后来想换一个无线模块,结果改了三天才改完。分层之后,换模块只需要改驱动层,应用层完全不动。
2.3 数据流设计
数据怎么从传感器流到云端?我画了一个典型的数据流图:
- 传感器采集:MCU定时唤醒,读取计量芯片的寄存器,得到电压、电流、功率数据。
- 本地处理:MCU做简单的滤波、校准、累加。比如去掉异常值,乘以校准系数。
- 数据缓存:把处理后的数据存入Flash或RAM缓冲区。我习惯用环形缓冲区,防止数据覆盖。
- 无线发送:当缓冲区满了,或者定时时间到,MCU唤醒无线模块,把数据打包发送。
- 云端接收:服务器收到数据后,存入数据库,并返回确认帧。
关键点:数据流中,最耗电的是「无线发送」。所以我的策略是:尽量攒一批数据再发,减少发送次数。比如每15分钟采集一次,每2小时发送一次。这样发送功耗占比可以降到10%以下。
嗯,这就是系统总体架构的核心内容。硬件选型、软件分层、数据流向,三者缺一不可。下一章咱们会深入讲MCU的低功耗模式,到时候你会看到,硬件和软件怎么配合才能把功耗压到极致。
个人经验:设计初期,我建议先画一张「功耗预算表」。把每个模块的工作电流、工作时间列出来,算一下总功耗。这样能提前发现瓶颈,避免后期返工。我曾经因为没做这一步,结果节点电池只能用三个月,后来重新设计了电源方案才解决。