一块电池跑两年?我被STM32的待机电流摆了一道
之前做一款 outdoor sensor node,客户要求两节AA电池撑18个月。我当时心想,这不就是调个sleep mode的事吗?结果折腾了一个月,打样了两版板子,最后发现坑全埋在datasheet的小字里。
先说功耗构成。MCU待机电流只是冰山一角,真正吃电的是外围器件——LDO的静态电流、运放的quiescent current、甚至是上拉电阻的漏电,累积起来不比MCU本身少。
STM32L0系列的SHUTDOWN模式标称0.27μA,听起来很美好对吧?但你得想想:
// 进SHUTDOWN之前要处理的
HAL_PWREx_EnableFlashPowerDown(); // 这个不调用,flash还吃着电
HAL_PWREx_DisableInternalReferenceVoltage();
// 但RTC还得跑吧?那就不叫SHUTDOWN了,叫STOP mode with RTC
// STOP mode with RTC ≈ 1.3μA
我踩的第一个坑就在这里。拍着胸脯跟客户说待机功耗0.3μA以下,实际测出来1.8μA。翻了三遍手册才发现——SHUTDOWN模式下RTC不能保留,要保留RTC就得用STOP Mode 2。datasheet上那个"0.27μA"的标注下面其实有一行星号: "without RTC, without backup registers retention"。
这不是骗人,但确实容易看漏。
另一个让我翻车的点是GPIO电平。有次测出来待机电流莫名其妙多了十几μA,用示波器一量,有几个GPIO在sleep前没配好,处于floating状态,内部上拉/下拉来回跳导致漏电。
// 修正前
HAL_GPIO_DeInit(sensor_en_GPIO_Port, sensor_en_Pin);
// 修正后 - sleep前把所有不用的脚配成模拟模式
for(int i=0; i<16; i++) {
HAL_GPIO_Init(GPIOA, &(GPIO_InitTypeDef){
.Pin = 1<<i,
.Mode = GPIO_MODE_ANALOG,
});
}
顺便说一嘴LDO的事。很多低功耗设计用LDO而不是DC/DC,因为DC/DC的switching loss在轻负载下反而高。但LDO也有讲究——静态电流(Iq)是选型关键。XC6206这种Iq只有1μA左右,而AMS1117的Iq高达5mA——你没看错,5个毫安,待机时的MCU才零点几个μA,一个LDO就把预算吃光了。
// 电池寿命大致估算
// Battery: 2x AA alkaline, 2000mAh each in series = ~2000mAh@3V
// Average load: sleep(99.9% time) 3μA + active(0.1% time) 6mA
// Average current ≈ 3μA * 0.999 + 6mA * 0.001 ≈ 9μA
// 2000mAh / 9μA ≈ 222222h ≈ 25 years
// 但这是理想情况!self-discharge、温度、LDO效率、电池内阻……
// 现实往往是标称寿命的1/3到1/2
// 所以我最后跟客户说"保守估计12-15个月"
我后来总结了一个checklist,每次布局前过一遍:
- 电源路径上所有器件都要算静态电流
- DC/DC要注意light load efficiency曲线
- 没用的外设时钟关掉,不只是关外设本身
- GPIO在sleep前统一处理,别留floating pin
- 测功耗要在实际温度范围内测,不是25℃
- 电池放两年的自放电率比设备功耗还高,别忽略这个
测功耗本身也是个技术活。买个几百块的万用表量μA级电流?根本稳不住。我后来搞了个专用低功耗测试板——串一个10Ω电阻在电源回路里,用示波器看压降波形,能看到MCU唤醒瞬间的电流尖峰。你要是us级别的唤醒,万用表根本反映不出来。
最后说个有意思的事。客户说"电池寿命测一下",我说行,测18个月吗?我在实验室用accelerated test,按1:100的duty cycle缩短时间,跑了大概5天,掉电曲线跟理论计算吻合。结果客户不认accelerated test,非要真实跑。我直接拿一堆碱性电池接上板子,扔抽屉里了。过了9个月,真还活得好好的——但那已经是后话了。
低功耗设计没有捷径,就是一遍遍测、一遍遍改。少信datasheet上的"typical value",多看max值,多留余量。
更多推荐

所有评论(0)