
本文为日志采集器的电源优化思路、测试数据和结果,供大家参考。
往期精选
- 跨生态设备互联互通初体验
- 逆天了!把OpenClaw装入ESP32-S3上是一种什么体验
- vivo宣布原生支持Home Assistant生态设备接入(含使用教程)
- 还在 printf 打天下?我给 MCU 做了一套「像 Android 一样的日志系统」
- 十年嵌入式最深的痛,不是 Bug,而是抓不到日志!
一、问题背景
我们基于 ESP32-C3 开发了一款串口日志采集器,主要功能是监听两路串口数据,打时间戳后写入 SD 卡,同时通过 WiFi 实时转发到服务器。 设备的详细介绍可以见我之前的文章《一种让你的MCU日志可无线查看和实时记录跟踪的方法》
有用户反馈,他们使用电脑的USB口给设备供电,设备在连接WiFi或者收发数据时发生了重启,反复复位,永远起不来;
我们也进行了复现,发现是电源不稳定,导致芯片复位。
power
全部版本上电电流对比
二、根因分析:三个叠加的功耗罪魁祸首
2.1 Brownout 检测电压过高(直接原因)
ESP32-C3 内置的 Brownout Detector 负责监控 VDD 电压,低于阈值就强制复位。我们在sdkconfig中配置的是Level 3(约 3.1V)。
问题在于 USB 5V 经过 LDO 降压到 3.3V 给芯片供电。当 WiFi 射频 PA 突然拉大电流(350mA+),LDO 瞬间响应不过来,VDD 会短时跌落到 2.7xV。如果 Brownout 阈值设 3.1V,芯片直接复位。
为什么有的 USB 口能启动,有的不能?不同 USB 口的 5V 输出质量不同——台式机主板上的 USB 通常有大电容滤波,笔记本侧面口走的是排线、电源路径长、内阻大。
2.2 WiFi 发射功率过高(最大单一功耗源)
当前配置为 20dBm(100mW),这是 ESP32-C3 接近最大的发射功率。对于一个 10 米室内通信的场景完全用不到。
根据 ESP32-C3 数据手册(v2.4,第 56 页Table 5-7),WiFi 射频功耗如下:
| 工作模式 | 描述 | 峰值电流 |
|---|---|---|
| TX | 802.11b, 1 Mbps, @21 dBm | 335 mA |
| TX | 802.11g, 54 Mbps, @19 dBm | 285 mA |
| TX | 802.11n, HT20, MCS7, @18.5 dBm | 276 mA |
| RX | 802.11b/g/n, HT20 | 84 mA |
测试条件:3.3V 供电,25°C 环境温度,100% 占空比。来源:ESP32-C3 Series Datasheet v2.4, Table 5-7 "Wi-Fi Current Consumption Depending on RF Modes"
335mA 是芯片级射频 PA 在满功率发射时的峰值电流。USB 5V 供电经过 LDO 降压后,这部分电流映射到 5V 侧约 220~250mA,再加上 CPU、Flash、SD 卡等外设,上电阶段 5V 输入端瞬时电流可超 300mA,这正是部分 USB 口扛不住的原因。
将 TX 功率降到 8~10dBm,PA 输出功率降至原来的 1/10 以下,TX 电流随之大幅下降,是降低上电电流尖峰最有效的手段。
2.3 无效功耗叠加
- CPU 跑在 160MHz,这个应用 80MHz 绰绰有余
- mbedTLS 调试日志开着 VERBOSE 级别,每次 TLS 握手往串口输出几万字节
- SD 卡每次写都fsync,频繁唤醒 SPI Flash
三、10+ 项优化措施
我们按"先解决启动问题,再降运行功耗"的顺序做了以下改动:
第一组:解决上电复位(P0)
| # | 项目 | 改动前 | 改动后 | 说明 |
|---|---|---|---|---|
| 1 | Brownout 检测电压 | Level 3 (~3.1V) | Level 7 (~2.51V) | 给 LDO 留足瞬态余量 |
| 2 | WiFi TX 功率 | 20dBm | 10dBm | 10米室内够用 |
| 3 | WiFi 允许降功率 | 关闭 | 开启 | 运行时按需调整 |
| 4 | CPU 频率 | 160MHz | 80MHz | 串口采集不敏感 |
| 5 | Flash 频率 | 80MHz | 40MHz | 固件体积小,无影响 |
第二组:降低运行功耗(P1)
| # | 项目 | 改动前 | 改动后 | 说明 |
|---|---|---|---|---|
| 1 | mbedTLS 调试日志 | VERBOSE | 关闭 | TLS 握手不再刷屏 |
| 2 | SSL 输入缓冲区 | 16KB | 8KB | 够用即可 |
| 3 | WiFi 动态缓冲区 | RX=32 TX=32 | RX=16 TX=16 | 少量连接 |
第三组:SD 卡写入优化(P2)
| # | 项目 | 改动前 | 改动后 | 说明 |
|---|---|---|---|---|
| 1 | SD 卡写入策略 | 每次 fwrite → fflush → fsync | 只 fwrite,每秒统一 fsync | 减少 SD 卡唤醒 |
| 2 | 日志任务栈 | 8KB | 6KB | 够用,省内存 |
四、测试方法
为了量化效果,我们用 RTC版本(实时时钟芯片)和普通版本(无实时时钟)配合电流采样仪,以1 秒间隔记录上电后 60~90 秒内的电流变化。每组配置重复测试 3 次,共采集 12 组数据:
- RTC-1/2/3:未做任何优化的原始固件
- 优化-1/2/3:做了全部 sdkconfig 优化,但 SD 卡保留每次fsync
- 优化2-1/2/3:做了全部 sdkconfig 优化 + SD 卡改为批量写入
- 普通-1/2/3:另一组未优化对照
对比 - 未优化 vs 优化(fsync) vs 优化(批量写)
五、测试结果
5.1 整体数据
测试数据统计汇总表
| 组别 | 平均电流(含休眠) | 活跃态平均 | 平均峰值 | 最优峰值 | 非零占比 |
|---|---|---|---|---|---|
未优化 (RTC) | 13.01 mA | 14.07 mA | 21.3 mA | 19.0 mA | 92.4% |
优化 (fsync) | 12.14 mA | 12.83 mA | 20.0 mA | 18.0 mA | 94.6% |
优化2 (批量写) | 10.15 mA | 11.98 mA | 19.0 mA | 16.0 mA | 84.7% |
| 普通对照 | 12.30 mA | 13.80 mA | 24.7 mA | 24.0 mA | 89.1% |
活跃态平均 = 剔除 0mA 采样后的均值。非零占比 = 电流 >0 的采样比例。
5.2 核心结论
1. 峰值电流降低 36%—— 从 25.0mA(RTC 最差值)降到 16.0mA(优化2 最优值),直接解决 USB 口启动问题。
2. 平均电流降低 22%—— 从 13.01mA 降到 10.15mA,功耗降低超过五分之一。
3. 批量写入 (优化2) 效果最好—— 不仅平均电流最低,非零占比也从 92.4% 降到 84.7%,说明设备有更多时间处于低功耗状态。
峰值电流对比
—— 可以明显看到优化2(紫色)的三根柱子普遍低于 RTC(蓝色)
峰值电流对比
—— 普通系列(红色)的峰值 25mA 对比优化2-1 的 16mA,降幅直观
5.3 为什么优化 (fsync) 组效果不如优化2 (批量写)?
从数据看,优化 (fsync) 组虽然改了 sdkconfig,但**每次 SD 卡写入仍然立即fsync**。
每次fsync会触发:用户态 fflush → VFS 层 → FATFS → SD SPI 驱动 → 唤醒 SD 卡 → 等待写入完成。这相当于每写一条日志(可能就几百字节),就把 SD 卡从休眠中叫醒一次。
优化2 改为每秒统一fsync一次,中间的数据只写到用户态缓冲区。SD 卡大部分时间处于空闲状态,功耗自然更低。
数据可靠性权衡:批量写入下,如果突然断电最多丢失最近 1 秒的日志。对日志采集场景这完全可以接受。
5.4 峰值电流分布
观察各组的峰值发生时间:
| 版本 | 峰值 | 发生时间 | 对应阶段 |
|---|---|---|---|
| RTC-1 | 25mA | 启动后 3s | WiFi RF 校准 + TX |
| RTC-2 | 20mA | 启动后 2s | 同上 |
| 优化2-1 | 16mA | 启动后 8s | WiFi 稳定后 |
未优化组的峰值集中在前 3 秒出现,这正是 WiFi PHY 校准和首次关联的阶段。优化后 CPU 降频 + TX 降功率,不仅峰值数值降低,峰值也推迟到外设初始化更晚的阶段,避开了上电瞬间的集中电流脉冲。
六、关键经验总结
6.1 Brownout 阈值是第一优先级
如果你用 ESP32 系列芯片做产品,且遇到过"某些供电环境无法启动",第一个检查的就是 Brownout 配置。Level 3 (~3.1V) 对 USB 供电太苛刻,降到 Level 7 (~2.5V) 不影响稳定性。
6.2 WiFi TX 功率不要无脑拉满
20dBm 是数据手册最大值,不是推荐值。室内设备 10dBm 足够,每降 3dBm 发射功率减半,电流也大幅下降。
6.3 CPU 频率对标实际需求
很多人觉得"160MHz 当然比 80MHz 好"。但 FreeRTOS 任务的瓶颈通常是 I/O 等待而非 CPU。串口 115200bps 的数据处理,80MHz 的单核 RISC-V 完全有余量。
6.4 fsync 是隐形的功耗杀手
嵌入式文件系统中,fsync的代价远比 Linux 上大——它意味着唤醒物理闪存、启动 SPI 传输、等待擦除完成。除非数据可靠性要求极高(如金融交易日志),否则批量同步是更合理的策略。
6.5 做优化要有数据支撑
没有采样数据,功耗优化就是玄学。我们每次改动后跑三次、取均值,确保结果可复现。1 秒间隔的电流采样虽然精度有限,但足以看清趋势和峰值。
如果你也在折腾Home Assistant / Matter / AI / 智能家居 / ESP32
那我们大概是在同一条路上。 这里更多是我自己的实践记录和过程复盘,
不一定最优,但都是跑过一遍的结果。
期待你的点赞,关注,转发,让路上彼此有个伴。
-
mcu
+关注
关注
147文章
19240浏览量
405198 -
usb
+关注
关注
60文章
8489浏览量
286671 -
ESP32
+关注
关注
27文章
1237浏览量
22693
发布评论请先 登录
乐鑫科技发布全新ESP32-H21超低功耗无线SoC
当ESP32模块连接到路由器之后比没有连接到路由器时的功耗小0.4W,如何降低WIFI断开后的功耗?
当ESP32模块连接到路由器之后比没有连接到路由器时的功耗小0.4W,如何降低WIFI断开后的功耗?
请问ESP32S2播放MP3时电流大概多大,能优化到多少电流?
ESP32有没有办法降低启动功率或延迟启动?
当ESP32模块连接到路由器之后比没有连接到路由器时的功耗小0.4W,如何降低WIFI断开后的功耗?
ESP32开发套件 ESP32-DevKitC
浅析Zephyr在ESP32上的启动流程
乐鑫ESP32-PICO-MINI-02U参考设计
乐鑫esp32系列在睡眠模式下保持蓝牙连接的功耗测试
【AI技术支持】ESP32-WROVER-IE-N16R8模组上电启动失败问题处理
ESP32功耗优化实战:从 USB 启动失败到电流降低 36%
评论