☰
低功耗电压检测电路设计:MOS管如何让电池多活一年
2026/9/25 4:53:46 网站建设 项目流程

做过几年电池供电的设备,我对“低功耗”这三个字的理解全是被现实教育出来的。有一次做温湿度记录仪,整板待机电流设计目标3µA,结果打样回来一测,20多µA,怎么都压不下去。最后一段一段摘元件排查,罪魁祸首就是检测电池电压用的两个分压电阻——它们跨在电池两端,只要没拔电池,电流就一直流着。后来把电路改成“电阻分压 + MOS管控制”的分时采样方案,待机电流才真正回到个位数µA。这篇就把这段经验完整拆开讲:低功耗电压检测电路为什么绕不开电阻分压,MOS管在这里究竟起到什么作用,以及取样电阻和采样参数到底该怎么算。

如果你正在做电池供电、需要MCU周期性检测电源电压或者做低压报警,这篇文章应该能帮你少走不少弯路。内容围绕实际调试中的计算、拓扑选择和避坑展开,没有太多理论堆砌,都是可以直接落地的工程细节。

1. 分压网络一直在线,才是功耗失控的根源

1.1 电阻分压的本质是“始终在放电”

电阻分压是最常用的电压采样方式,两个电阻串联,中间抽头接ADC。公式很简单:

Vout = Vbat × R2 / (R1 + R2)

这个公式本身没什么问题,问题在于这句话成立的前提——只要R1和R2跨接在电源两端,无论MCU有没有在进行电压转换,回路电流I = Vbat / (R1 + R2)都客观存在,对应的功率损耗P = Vbat² / (R1 + R2)也在持续发生。

我习惯把这种情况类比成“水龙头没关紧”。滴水量不大,但一年四季不停歇,积累起来就非常可观。传统工控设备不在乎这点电流,但电池供电的嵌入式系统不一样,我们谈的是“待机电流必须压到个位数µA”,这时候分压网络那点“滴答滴答”的电流就成了不可接受的缺口。

1.2 算一笔真实账:一个分压电阻顶几千个MCU的待机功耗

用最常见的12V系统来算账。很多网上的简易教程和开发板原理图给的都是10kΩ配3.3kΩ的组合:

I = 12V / (10k + 3.3k) = 902µA
P = 12V × 902µA ≈ 10.8mW

如果把STM32L151C8T6A放在STOP模式同时RTC继续运行,典型待机电流大约为1.1µA @ 3.3V,对应功率约3.6µW。对比一下:一个10k分压网络吃掉的能量,相当于3000个MCU自己待在深度睡眠模式。这种方案在µA级待机需求面前,根本没有生存空间。

有朋友会说,那把电阻提高到100k和33k不就行了?90µA确实比900µA低一个数量级,但对真正的低功耗产品来说仍然是灾难。试想整板预算只有3µA,一个分压网络就吃掉90µA,这个设计从源头就失败了。所以低功耗电压检测的第一个原则就是:不能让分压网络一直在线。

1.3 无脑加大电阻也不是办法:ADC输入阻抗与精度的硬约束

既然分压电阻不能小,那往大了加呢?我见过有人直接把R1加到1MΩ、R2加到330kΩ,静态电流确实降到了9µA左右,结果ADC读数惨不忍睹——电压偏高偏低都有,跳动还非常厉害。

原因在于ADC的采样保持电路。单片机内部ADC在采样阶段会把外部信号源接到一个采样保持电容上,信号源输出阻抗和这个电容构成RC充电回路。如果信号源阻抗太高,电容来不及充到目标电压,ADC就切断采样进入转换阶段,读出来的值自然是偏低的。

这背后有一个必须意识到的约束:从分压抽头看进去,等效源阻抗是R1和R2的并联值:

Zs = R1 ∥ R2 = 1M ∥ 330k ≈ 246kΩ

绝大多数MCU的ADC数据手册都建议源阻抗不超过10kΩ,甚至有些芯片在短采样时间配置下连这个值都偏勉强。在246kΩ的源阻抗下直接采样,误差不是百分位的问题,而是可能直接偏掉几百毫伏。

有人会想到用运放跟随便能解决阻抗问题,但低功耗运放本身的静态电流经常在几百µA甚至mA级别,这和低功耗设计的方向完全背道而驰。所以结论很清晰:传统“电阻分压直接进ADC”的方案,在低功耗和精度之间几乎无解,必须换一种思路——让分压网络平时断电,采样瞬间再给它通电。这就是MOS管登场的原因。

2. MOS管当“电源闸门”,把分压网络从常通变成分时工作

2.1 为什么低功耗开关首选MOS管,而不是三极管或模拟开关

分时采样的思路不复杂:平时让分压网络下端悬空,没有电流回路;采样瞬间把回路闭合,读完电压再断开。关键在于用什么器件做这个“开关”。

三极管可以做低边开关,但它是电流驱动器件,基极需要持续的电流才能维持导通;而且在小电流场景下,饱和压降Vce会对采样精度产生可见影响。更重要的是,三极管的漏电流在高温下往往不如MOS管干净。

模拟开关芯片(比如SGM3157、TS5A23157)导通电阻很低,控制也方便,但多一颗芯片意味着多一份物料成本和一层控制逻辑。如果只是给分压网络做通断,用模拟开关属于“杀鸡用牛刀”。

MOS管则不同,它是电压控制器件,栅极输入阻抗极高。以NMOS为例,只要Vgs超过阈值电压,沟道就导通,DS之间等效为一个很小的电阻Rds(on)。在导通维持期间,栅极几乎不取电流;在关断状态下,漏电流通常只有nA级。这意味着“开关本身基本不耗电”,和低功耗设计的方向天然契合。

2.2 低边NMOS开关的接法:一个管子解决12V系统分压

实际项目中,我推荐优先使用低边NMOS方案,电路结构非常简单:

  • R1接VBAT(比如12V电池正端)
  • R2上端接ADC引脚,下端不直接接地
  • NMOS的漏极接R2下端,源极接地
  • 栅极通过一个100kΩ下拉电阻接地,同时接MCU的GPIO控制脚

工作过程:

GPIO输出高电平时,NMOS导通,R2下端被拉到接近0V,分压网络正常工作,ADC可以读取电压。

GPIO输出低电平时,NMOS关断,R2下端悬空,整个分压网络没有电流回路,待机电流直接降到0。

由于分压网络的电流本身只有几µA到十几µA,NMOS的Rds(on)哪怕有几十欧姆,产生的压降也不过是微伏到毫伏级别,对分压结果的影响可以忽略。

选型上,2N7002或BSS138这类小信号NMOS足够应对绝大多数12V/24V系统。2N7002的Vds耐压60V、Vgs(th)典型值1V左右,3.3V逻辑可以直接驱动;BSS138的阈值更低,适合MCU是1.8V逻辑电压的场景。

这个拓扑会有一个容易忽略的坑:MCU进入低功耗模式后,GPIO输出状态不一定能保持。如果栅极悬空,在电场干扰下可能误导通,导致分压网络在睡眠期间偷偷工作。所以栅极必须保留那100kΩ下拉电阻,确保没有任何控制信号时NMOS默认处于关断状态。

2.3 高边PMOS开关:隔离更彻底,但栅极控制藏着一个大坑

低边NMOS方案在绝大多数系统里都够用,但如果检测对象与MCU系统之间存在较明显的干扰,或者你想让分压网络在电源侧就完全断开,就需要用高边PMOS开关。

PMOS的正确接法:

  • 源极接VBAT,漏极接R1上端
  • 栅极通过一个100kΩ电阻上拉到VBAT,保证默认关断
  • 控制信号不能直接接PMOS栅极,必须通过一个小NMOS做反相驱动

为什么不能直接控制?这是很多新手最容易踩的坑。假设VBAT是12V,MCU GPIO输出高电平是3.3V,PMOS的Vgs = 3.3 - 12 = -8.7V。绝大多数PMOS在Vgs低于-2V时就已经完全导通,所以GPIO输出“高电平”不但不能关断PMOS,反而会让它误开通。这是逻辑电平和高压检测对象之间的经典兼容问题。

正确的工作状态:

  • GPIO低电平时,NMOS关断,PMOS栅极被上拉到VBAT,Vgs = 0,PMOS关断,分压网络完全断电
  • GPIO高电平时,NMOS导通,PMOS栅极被拉到接近0V,Vgs ≈ -VBAT,PMOS导通,分压网络开始工作

选择PMOS时要注意Vgs耐压。12V系统下,Vgs最高约-12V,普通PMOS耐压多在±20V,没问题;如果检测24V系统,Vgs会到-24V,很多PMOS直接击穿,需要额外加电阻分压来限制栅源电压,或者干脆回到低边NMOS方案。低边NMOS因为源极始终接地,反而天然避开了这个高压兼容问题,这也是我优先推荐它的原因之一。

3. 分压电阻与采样参数的完整计算:性能与功耗的平衡点

3.1 分压比、最大电压和电阻阻值的推导

以12V铅酸电池为例,满电约12.6V,亏电约10.5V,需要送入3.3V ADC。

首先要确定分压比上限。为了给ADC满量程留余量,我习惯让最高电压对应的采样值不超过3.0V。代入计算:

R2 / (R1 + R2) ≤ 3.0 / 12.6 ≈ 0.238

取R1 = 1MΩ、R2 = 300kΩ,实际分压比 = 300 / (1000 + 300) ≈ 0.231,满电时Vout = 12.6 × 0.231 ≈ 2.91V,留有约0.4V余量。

静态电流:I = 12.6 / 1.3M ≈ 9.7µA
静态功耗:P = 12.6 × 9.7µA ≈ 122µW

这个数值从绝对待机角度看仍然不算低,但由于分压网络平时被MOS管切断,只有在采样瞬间才工作,所以它不会成为待机功耗的主要来源。电阻阻值选1M而不是10k,是为了把采样瞬间的电流和噪声影响降到最低。

电阻精度方面,至少选1%精度的薄膜电阻。两个1%电阻串联后,最坏情况下分压比误差约2%,对应12V系统的检测误差约0.24V。这对大多数电池低压报警场景来说可以接受。如果希望更准,可以用0.5%或0.1%精度电阻,成本会高一些但性能提升非常直接。

3.2 源阻抗、ADC采样保持电容与采样时间的量化关系

回到1.3节提到的源阻抗问题。R1 = 1MΩ、R2 = 300kΩ时:

Zs = 1M ∥ 300k ≈ 231kΩ

STM32L1系列ADC内部的采样保持电容Csh大约4pF,采样开关电阻约1kΩ。12位分辨率下,采样时间需要满足:

t_samp > (Zs + Rsw) × Csh × ln(2^N)
t_samp > (231k + 1k) × 4pF × ln(4096)
t_samp > 232k × 4pF × 8.32 ≈ 7.7µs

这说明一个很关键的问题:即使源阻抗高达231kΩ,只要把ADC采样时间配置到10µs以上,也足以保证12位精度下不出现明显的采样不足误差。

工程上我会留3倍以上余量。STM32L1系列ADC的采样时间可以选择384个ADC时钟周期,如果把ADC时钟配置为8MHz,384 / 8M = 48µs,完全足够。

具体到代码,采样时间配置选最大档位,ADC时钟不要超过芯片手册规定的最大值(STM32L1一般是14MHz)。这种长采样时间的代价是ADC在这几十微秒内多消耗一些电流,但折算到整个低功耗周期里,几乎可以忽略不计。

除了ADC内部采样时间,还要考虑外部分压网络从MOS管导通到电压稳定需要的时间。在没有外部滤波电容的情况下,主要是ADC采样电容充放电带来的微秒级建立过程,软件在MOS管开启后延时1ms再启动采样,可以确保电压已经完全稳定。

3.3 软件滤波与硬件滤波的配合

高阻节点对噪声特别敏感,工频干扰、开关电源纹波都容易耦合进来。最佳实践是软硬结合:

硬件方面,在ADC引脚对地并联一颗10nF到100nF的陶瓷电容,位置尽量靠近MCU引脚。这颗电容能把高频噪声旁路掉,代价是增加了分压网络的RC时间常数。以10nF为例:

τ = 231kΩ × 10nF ≈ 2.3ms

要等电压稳定到12位精度级别,大约需要5τ到8τ,也就是11.5ms到18.4ms。软件里延时20ms再采样即可。如果担心等太久,可以减小电容到1nF,建立时间降到2ms左右,但滤波效果会稍弱。

软件方面,连续采样8次,去掉最大值和最小值,剩余6次取平均。这种中值均值混合滤波对随机噪声和偶发毛刺有很好的抑制效果,代码也足够简单。

这里有个取舍原则需要记住:硬件滤波电容越大,抗噪越好,但建立时间越长;软件滤波次数越多,结果越稳定,但采样窗口越长。低功耗系统里采样窗口变长意味着每次唤醒工作时间变长,需要在项目里找到一个可接受的平衡点。

4. 完整工程实现:唤醒采样时序、实测数据与多平台移植

4.1 一次完整的电压采样要做什么

整套系统的核心思路是“定时唤醒、瞬间采样、立即休眠”。下面是完整的软件流程,可以直接照着搭:

  1. 初始化GPIO控制脚为推挽输出,初始输出低电平,确保NMOS默认关断。
  2. 配置RTC定时唤醒,周期可以是1秒、10秒甚至更长。
  3. MCU进入低功耗模式(STOP/Standby/PowerDown等)。
  4. RTC唤醒后,MCU先从低功耗模式恢复运行。
  5. GPIO拉高,NMOS导通,分压网络开始工作。
  6. 软件延时1到20ms(根据滤波电容和电阻值确定),等待电压稳定。
  7. 配置ADC为最长的采样时间,软件触发连续采样8次。
  8. GPIO拉低,NMOS关断,分压网络功耗归零。
  9. 对8次采样值做中值均值滤波,换算成实际电压。
  10. 进行阈值判断和迟滞处理,决定是否触发低压报警。
  11. 重新进入低功耗模式,等待下一次RTC唤醒。

用STM32标准外设库写的核心片段大致是这样:

void vbat_detect(void) { GPIO_WriteBit(GPIOA, GPIO_Pin_0, 1); // 打开NMOS,分压网络开始工作 delay_us(1000); // 等待分压网络稳定 for (int i = 0; i < 8; i++) { ADC_SoftwareStartConvCmd(ADC1, ENABLE); while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); buf[i] = ADC_GetConversionValue(ADC1); } GPIO_WriteBit(GPIOA, GPIO_Pin_0, 0); // 关闭NMOS,功耗归零 // 排序取中值均值,换算实际电压,判断阈值 }

如果芯片支持DMA,也可以用DMA把8次采样结果自动搬运到内存,进一步缩短唤醒时间。这个优化在唤醒功耗占主要开销的场景里很有价值。

4.2 STM32L151C8T6A实测数据:从1秒一次到10秒一次

我在STM32L151C8T6A上做过实际测量。测试条件是3.3V供电,RTC定时唤醒,NMOS控制分压网络,R1 = 1MΩ、R2 = 300kΩ,ADC引脚并10nF电容,软件延时20ms后采样。

工作状态平均电流说明
深度睡眠,分压关闭约1.2µASTOP模式 + RTC运行,3.3V供电
深度睡眠,分压常开约10.8µA分压网络贡献约9.5µA,这就是“漏电”来源
采样峰值瞬间约6到8mAMCU唤醒运行 + ADC工作,持续约2ms
平均电流,1秒采样一次约15µA基线1.2µA + 唤醒功耗折算约14µA
平均电流,10秒采样一次约2.8µA基线1.2µA + 唤醒功耗折算约1.6µA

这份数据里最值得关注的是:分压网络本身在采样时只贡献约9µA,平摊到整个周期后完全可以忽略;真正影响平均功耗的是MCU每次从低功耗模式唤醒后运行那段时间的电流。所以采样频率越高,唤醒带来的平均功耗越大。

如果你做一个“每秒检测一次”的电压监测,平均功耗可能高达15µA,这对追求超长待机的产品来说仍然偏高。把采样周期改成10秒,平均功耗立刻降到2.8µA左右,而电池电压的变化本来就非常缓慢,10秒采样一次完全不会影响报警实时性。这是我做低功耗设计时特别强调的一个思路:不是所有采集任务都需要高频率,频率每降低一个数量级,功耗可能降低一个数量级。

4.3 同一套方案移植到HC32L196与GD32E503需要注意的事

低功耗电压检测的核心思想是通用的,但不同MCU平台的细节差异会直接影响最终功耗和可靠性。

HC32L196是华大半导体基于Cortex-M0+内核的低功耗型号,低功耗模式有Sleep、Stop、PowerDown等。移植时重点注意两点:一是PowerDown模式下的GPIO输出状态是否保持,如果MCU在进入深度睡眠后IO状态不受控制,栅极下拉电阻就是最后的安全底线;二是ADC采样时间的配置方式与STM32不同,需要查手册找到“最长采样周期”对应的寄存器位。HC32系列在低功耗模式下能做到很低的待机电流,搭配这套分时采样方案,整机待机电流可以压得很好。

GD32E503CC是兆易创新Cortex-M33内核产品,性能和资源比STM32L1更充裕,但低功耗模式下的待机电流通常比STM32L1高一些,Standby模式测得典型值可能在数µA级别。移植时需要注意唤醒时间相对较长,从Standby唤醒到CPU开始运行可能需要几百微秒,这会让每次采样的持续时间变长,平均功耗相应增加。性能够用但追求极致功耗的话,建议把采样周期拉长到30秒甚至1分钟。

我整理了一个简单的对比表:

平台低功耗模式参考典型待机电流水平移植要点
STM32L151C8T6ASTOP + RTC约1µA级ADC采样时间可灵活配置,资料丰富
HC32L196PowerDown + RTC低至亚µA级注意IO状态保持,ADC寄存器配置需查手册
GD32E503CCStandby数µA级唤醒时间偏长,建议降低采样频率

这些平台我都实际跑过同一套分压电路,结论是:硬件拓扑不需要改,软件适配层移植即可。真正决定待机功耗差异的,是MCU自身的低功耗模式能力和唤醒后恢复的速度。

5. 几个特别容易翻车的场景:TL431、低压报警迟滞与混合电压域

5.1 TL431反馈分压为什么和低功耗MCU检测是两种思路

搜索“低功耗电压检测”相关话题时,经常有人在问TL431的上下分压电阻阻值怎么取。比如ATX电源辅助绕组反馈电路里,TL431配合光耦做输出电压反馈,上下分压电阻的取值通常都在十几kΩ到几十kΩ之间,目的是让TL431阴极工作电流保持在1mA以上,确保它处在正常的线性工作区。

这是经典的“连续工作”型模拟控制方案:TL431只要在线,就必须保证最低工作电流,否则反馈特性会漂移。所以它更适合电源适配器、充电器这类不担心待机功耗的场景。

但在电池供电的低功耗系统里,这个思路完全行不通。TL431的1mA最小工作电流,已经比你整机3µA的预算高出三个数量级。我那台温湿度记录仪如果照这个思路做,待机电流直接就是十几毫安。

两种方案的底层区别在于:TL431是连续工作的模拟器件,必须持续消耗电流来维持反馈状态;而MCU电压检测是间歇性事件,只要能在采样瞬间正确读到电压,平时完全可以把采样链路断电。如果你的低功耗项目里有同事或资料建议直接用TL431做电压检测,请先算清楚它的最小工作电流能否被接受。

5.2 电池低压报警必须加迟滞,否则临界点反复触发

直接设置一个阈值比较电压,比如“低于3.0V报警”,看起来很简单,实际运行起来问题很大。电池电压在临界值附近会随着负载波动上下抖动,比如电机启动瞬间电压跌落触发报警,电机停止后电压回升又解除报警,然后下一次负载波动又触发……整个系统像抽风一样,看门狗都可能被频繁的报警处理拖累。

正确做法是软件迟滞。用两个阈值构成一个施密特触发器式的状态机:

  • 当前不在报警态:只有当电压低于3.0V时,才进入报警状态
  • 当前在报警态:必须等电压恢复到3.2V以上,才退出报警状态
  • 3.0V到3.2V之间的区域叫“死区”,任何情况下都不改变当前状态

这样处理之后,即使电池电压在临界点反复抖落,报警状态也不会来回跳变。迟滞宽度要根据系统实际情况调整,太窄起不到抗抖作用,太宽又会让报警解除延迟太多。对铅酸电池系统,0.2V左右的迟滞宽度比较合适;对锂电池,0.1V左右就够。

5.3 3.3V控制端与高压检测端之间的电平匹配与耐压细节

低边NMOS方案在混合电压域场景下天然有优势。NMOS的源极接地,栅极由3.3V或1.8V逻辑驱动,只要Vgs(th)低于逻辑高电平即可可靠导通,MCU和高压检测端之间不需要额外的电平转换。检测12V系统,2N7002非常稳;如果MCU是1.8V逻辑,换BSS138这种低阈值管子更保险。

高边PMOS方案就麻烦一些。前面提到3.3V的GPIO高电平无法关断12V PMOS,必须加NMOS反相驱动,并把PMOS栅极上拉到检测对象的高压端。在12V系统里,PMOS的Vgs会达到-12V,多数PMOS的Vgs耐压在±20V以内,没问题;但检测24V系统时Vgs会到-24V,必须通过额外电阻分压限制栅源电压,否则PMOS栅氧化层可能被击穿。

分压电阻本身的耐压也常被忽略。普通0603贴片电阻最大工作电压是50V,但要注意的是长期可靠性。检测72V这类更高电压的系统时,单颗电阻承担的压降很大,功耗也显著增加,要计算电阻自身的额定功率,并且用多颗电阻串联分担电压,配合PCB爬电距离设计才能保证安全。

这也是我为什么在大多数项目里坚持用低边NMOS而不是高边PMOS:它把“控制逻辑电平”和“被检测高压系统”之间的兼容问题用最简方式解决了,少一个器件就少一个坑,可靠性更高,物料成本也更低。

电路做下来,我最深的体会是:低功耗设计的难点往往不在MCU选型和软件算法,而在于谁能狠下心给每一个非必需的功耗源“断电”。分压网络只是其中一个典型例子,还有电平转换电路、传感器供电、接口上拉电阻,它们都会在不经意间消耗你辛辛苦苦省下来的电流。用MOS管做分压网络的电源闸门,把电压检测从“常开监视”变成“瞬态采样”,看起来只是一点小改动,但对整机功耗来说往往是决定性的差异。

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

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

立即咨询