1. 从两个真实痛点说起:为什么我要用PMOS做电源开关
墨水屏设备最让人头疼的地方,不是刷新慢,而是待机功耗压不下去。我手上有个基于STM32L4的温湿度记录仪项目,带一块2.13寸墨水屏,最初方案是用一颗LDO常供电给墨水屏驱动电路和分压采样网络,结果整机休眠电流卡在80微安下不来。电池是1200mAh的锂亚硫酰氯,理论待机一年多,实测三个月就趴窝。问题出在两个地方:墨水屏的升压驱动芯片即使不刷新也在偷电,ADC前端的分压电阻网络更是个无底洞——两个100k电阻串联分压,3.3V下持续消耗33微安,比MCU休眠电流还大。
解决思路很直接:不用的时候把这两块电路的电彻底掐掉。但掐电这件事,用NMOS做高边开关会遇到一个经典尴尬——NMOS做高边需要栅极电压高于源极,而源极接的是电源正极,栅极就得抬到比电源还高,需要额外的电荷泵或自举电路,成本和复杂度都上去了。PMOS做高边开关则天然合适:源极接电源正极,栅极拉低就导通,栅极拉到源极电位就截止,逻辑简单,静态驱动功耗几乎为零。
这个项目最终把休眠电流压到了2.3微安,墨水屏和ADC分压网络在休眠期间完全断电,唤醒后PMOS导通,电路恢复工作。下面我把整个设计思路、参数计算、实操步骤和踩过的坑完整拆一遍,适合做低功耗传感器节点、便携仪表、电池供电数据记录仪的硬件和嵌入式工程师参考。
2. 方案整体设计与关键器件选型
2.1 为什么选PMOS而不是NMOS或负载开关芯片
高边开关的选型本质上是在三个维度上做权衡:驱动复杂度、导通损耗、静态功耗。NMOS做高边需要栅压高于源极,要么用隔离电源加光耦驱动,要么用专用高边驱动芯片,前者体积大,后者静态电流往往在几十微安级别,对于目标休眠电流个位数的场景不可接受。负载开关芯片比如TPS229系列,集成度高,但静态电流通常在1微安左右,而且导通电阻和封装选择受限,某些型号还要求输入输出压差满足一定条件。
PMOS方案的优势在于:栅极驱动逻辑与MCU的GPIO电平天然匹配,STM32L4的GPIO在休眠时可以配置为开漏输出并保持低电平,或者配置为推挽输出高电平使PMOS截止。截止状态下,PMOS的栅极漏电流在纳安级别,对休眠电流的贡献可以忽略。导通时,PMOS的导通电阻Rds(on)决定了压降和损耗,选一颗Rds(on)在几十毫欧级别的PMOS,通过100mA电流时压降只有几毫伏,完全可以接受。
我最终选的是AO3401A,SOT-23封装,Vds耐压-30V,Rds(on)在Vgs=-4.5V时约50毫欧,栅极阈值电压Vgs(th)在-0.9V到-1.3V之间。这个阈值很关键,STM32L4的GPIO高电平是3.3V,源极接3.3V时Vgs=-3.3V,远低于阈值,PMOS可靠截止。如果源极接的是5V,Vgs=-3.3V仍然低于阈值,但余量小一些,需要查数据手册确认。AO3401A的栅极漏电流在Vgs=0时典型值1nA,25摄氏度下最大100nA,对休眠电流的影响可以忽略。
2.2 墨水屏供电切换的拓扑设计
墨水屏的供电需求比较特殊。以2.13寸黑白屏为例,驱动芯片通常需要三路电压:逻辑供电3.3V、升压后的15V左右用于刷新、以及负压-15V左右用于清屏。很多驱动芯片内部集成了升压电路,只需要外部提供3.3V和几个电容电感。但即使不刷新,驱动芯片的使能引脚如果一直拉高,内部升压电路会间歇工作维持电压,静态电流在几十微安级别。
我的做法是在3.3V电源和墨水屏驱动芯片的VDD之间串入PMOS开关,由MCU的一个GPIO控制。刷新流程是:GPIO拉低使PMOS导通,等待10ms让驱动芯片上电稳定,然后发送刷新命令,刷新完成后发送休眠命令让驱动芯片进入深睡,再拉高GPIO使PMOS截止,彻底切断驱动芯片供电。这里有个细节:驱动芯片的SPI接口引脚在断电后如果MCU侧仍然输出高电平,会通过ESD二极管倒灌电流。解决办法是在PMOS截止前,先把SPI引脚配置为模拟输入或开漏输出低电平,确保没有倒灌路径。
2.3 ADC分压采样网络的断电策略
ADC采样电路的低功耗设计有个容易被忽视的点:分压电阻网络本身。假设用两个100k电阻分压电池电压到ADC量程内,3.3V下电流是16.5微安,如果电池电压是4.2V,电流是21微安。这个电流是持续存在的,因为分压网络直接挂在电源上。有些设计会在分压电阻下端串一个NMOS到地,采样时导通,不采样时截止。但NMOS做低边开关需要栅极高于源极,源极接地时栅极3.3V即可导通,这个方案是可行的。
不过我更倾向于用PMOS做高边开关,把整个分压网络的上端掐断。原因有两个:一是低边开关截止时,分压网络的上端仍然挂在电源上,如果ADC引脚有漏电流或者PCB有污染,可能形成微小电流路径;二是高边开关可以同时切断分压网络和ADC输入引脚的连接,避免ADC引脚在断电时被外部电压拉扯。具体做法是PMOS源极接电池正极,漏极接分压电阻上端,栅极由MCU控制。采样时GPIO拉低导通,等待1ms让RC网络稳定,启动ADC采样,采样完成后GPIO拉高截止。
这里有个参数需要计算:PMOS导通后,分压网络的RC时间常数。假设分压电阻是100k+100k,ADC采样电容是10pF,PMOS导通电阻50毫欧,那么充电时间常数主要由分压电阻和ADC采样电容决定,约(100k||100k)*10pF=0.5微秒,远小于1ms的等待时间,所以1ms等待绰绰有余。但如果分压电阻更大,比如1M+1M,时间常数变成5微秒,仍然在1ms内稳定。真正需要担心的是PMOS导通瞬间的浪涌电流对电池的影响,不过分压网络电流只有微安级别,浪涌可以忽略。
3. PMOS开关电路的核心细节与实操要点
3.1 栅极驱动电路的设计与参数计算
PMOS做高边开关,栅极驱动的核心是确保导通时Vgs足够负,截止时Vgs接近0。STM32L4的GPIO在推挽输出模式下,高电平接近VDD(3.3V),低电平接近0V。当PMOS源极接3.3V时,GPIO输出低电平,Vgs=-3.3V,PMOS导通;GPIO输出高电平,Vgs=0V,PMOS截止。这个逻辑很干净,但有几个细节需要注意。
第一,GPIO在MCU休眠时的状态。STM32L4在STOP模式下,GPIO状态可以保持,但为了确保PMOS截止,最好在进入休眠前把GPIO配置为推挽输出高电平,或者配置为开漏输出并外部上拉到源极电位。我实测下来,推挽输出高电平在STOP模式下会保持,但如果有外部干扰导致GPIO被拉低,PMOS会误导通。更稳妥的做法是加一个100k的上拉电阻从栅极到源极,这样即使GPIO高阻,栅极也被拉到源极电位,PMOS可靠截止。
第二,栅极串联电阻的选择。直接在GPIO和栅极之间连导线,PMOS的栅极电容在导通瞬间会产生充电电流尖峰。AO3401A的输入电容约400pF,3.3V驱动下充电电荷约1.3nC,如果GPIO驱动能力是20mA,充电时间约65纳秒,这个尖峰电流对MCU的GPIO来说在安全范围内。但如果同时驱动多个PMOS,或者GPIO驱动能力较弱,建议串一个100欧到1k的电阻限制峰值电流。我一般串470欧,实测导通时间在微秒级别,对毫秒级的采样和刷新流程没有影响。
第三,截止时的快速关断。PMOS的关断速度取决于栅极电荷的泄放路径。如果只有上拉电阻,关断时间常数是R_pullupC_iss,100k400pF=40微秒,这个速度对于大多数应用足够了。但如果需要快速关断,比如在过流保护场景下,可以在栅极和源极之间并联一个加速电容,或者用推挽驱动。我的项目里关断速度要求不高,40微秒完全可以接受。
3.2 防倒灌与软启动的工程处理
PMOS做高边开关有一个天然优势:体二极管的方向是从漏极到源极。当PMOS截止时,如果漏极侧有电压高于源极,体二极管会导通,形成倒灌路径。这在墨水屏供电场景下需要特别注意:墨水屏驱动芯片内部有大电容,断电后电容上的电荷可能通过体二极管倒灌回3.3V电源轨,影响其他电路。
解决办法是在PMOS的漏极和负载之间串一个肖特基二极管,或者选择体二极管反向耐压足够的PMOS。但串二极管会增加压降,对于3.3V供电来说,0.3V的压降可能影响驱动芯片工作。更好的做法是在软件上确保断电前负载已经放电完毕,比如墨水屏刷新完成后先发送深睡命令,等待100ms让内部电容放电,再切断PMOS。实测下来,2.13寸墨水屏驱动芯片在深睡后100ms内,VDD引脚电压降到0.5V以下,体二极管不会导通。
软启动方面,如果负载有大电容,PMOS导通瞬间的浪涌电流可能触发电池保护或导致电源轨跌落。我的做法是在PMOS的栅极和源极之间并联一个100nF电容,利用电容的米勒效应延缓Vgs的建立速度。具体来说,GPIO拉低时,栅极电压通过串联电阻和并联电容充电,Vgs缓慢变负,PMOS的导通电阻逐渐减小,负载电容被缓慢充电。实测浪涌电流从1A降到200mA,效果明显。但要注意,这个电容会增加关断时间,需要根据实际负载调整容值。
3.3 静态功耗的实测与优化
PMOS开关电路的静态功耗主要来自三个方面:栅极漏电流、体二极管漏电流、以及PCB漏电流。AO3401A的栅极漏电流在25摄氏度下最大100nA,体二极管漏电流在Vds=-3.3V时典型值1nA,这两项加起来约100nA,对休眠电流的贡献是0.1微安。PCB漏电流取决于布局和清洗质量,如果助焊剂残留或者PCB表面有污染,可能产生微安级别的漏电流。
我实测过一块未清洗的PCB,PMOS截止时漏极侧仍然有0.8微安的电流,清洗后降到0.05微安。所以低功耗设计里,PCB清洗不是可选项,是必选项。另外,PMOS的栅极走线要尽量短,避免形成天线接收干扰。如果栅极走线较长,建议在栅极和源极之间加一个100pF的电容滤高频干扰。
还有一个容易被忽视的点:MCU的GPIO在输出高电平时,如果外部有干扰导致GPIO电压被拉低到阈值以下,PMOS会进入线性区,产生较大电流。为了避免这种情况,可以在GPIO和栅极之间加一个施密特触发器,或者选择带滞回特性的驱动电路。不过对于大多数应用,100k上拉电阻加上合理的PCB布局已经足够。
4. ADC采样电路的PMOS供电切换实操
4.1 分压网络参数计算与PMOS选型匹配
ADC采样电池电压的典型电路是两个电阻分压,把电池电压降到ADC参考电压以内。假设电池是单节锂亚硫酰氯,电压范围2.0V到3.6V,ADC参考电压是3.3V,那么分压比可以设为1:1,两个电阻相等。但为了留余量,我通常设分压比为2:1,上电阻100k,下电阻100k,电池3.6V时分压后1.8V,在ADC量程内。
分压网络的电流是电池电压除以总电阻,3.6V/200k=18微安。这个电流在采样时存在,不采样时被PMOS切断。PMOS的导通电阻会影响分压精度吗?分压网络的等效源阻抗是100k||100k=50k,PMOS导通电阻50毫欧,相比50k可以忽略,所以分压比不受影响。但PMOS的漏电流在截止时会影响ADC引脚电压,如果漏电流是100nA,流过下电阻100k产生10mV电压,这个电压可能被ADC误读。解决办法是在ADC引脚和分压点之间串一个1k电阻,同时在下电阻并联一个100nF电容,形成低通滤波,把漏电流产生的电压滤掉。
PMOS的选型要和分压电阻匹配。如果分压电阻是1M+1M,总电流3.6V/2M=1.8微安,PMOS的漏电流100nA占比5.5%,会影响精度。这时候需要选漏电流更小的PMOS,比如BSS84的漏电流典型值1nA,或者用两个PMOS串联降低漏电流。我的项目里分压电阻是100k+100k,漏电流影响可以接受。
4.2 采样时序与PMOS开关的配合
ADC采样时序和PMOS开关的配合是低功耗设计的关键。我的流程是这样的:MCU从STOP模式唤醒,首先拉低GPIO使PMOS导通,同时启动一个1ms的定时器。1ms后,分压网络稳定,启动ADC校准和采样。ADC采样完成后,拉高GPIO使PMOS截止,然后MCU进入STOP模式。整个唤醒到休眠的时间约3ms,其中PMOS导通时间2ms,ADC采样时间1ms。
这里有个细节:ADC的采样保持电容在PMOS导通前可能残留电荷,导致第一次采样不准。解决办法是在PMOS导通后,先进行一次丢弃采样,然后再进行正式采样。STM32L4的ADC支持连续采样模式,我配置为采样两次,取第二次的值。实测下来,丢弃第一次采样后,ADC读数稳定性从±5LSB提升到±1LSB。
另一个细节是ADC的参考电压选择。STM32L4内部参考电压是1.2V,但精度受温度影响较大。如果对精度要求高,可以用外部参考芯片,但外部参考芯片本身也有功耗。我的做法是用内部参考电压,但在软件里做温度补偿。具体来说,STM32L4内部有一个温度传感器,可以读取芯片温度,然后根据参考电压的温度系数修正ADC读数。实测在0到50摄氏度范围内,修正后精度可以做到±1%。
4.3 实测数据与功耗对比
我做了三组对比测试:第一组是PMOS开关完全断开,墨水屏和ADC分压网络都不供电;第二组是PMOS开关导通,墨水屏和ADC分压网络都供电;第三组是PMOS开关断开,但ADC分压网络直接挂在电源上。测试条件是STM32L4在STOP模式下,电池电压3.6V,室温25摄氏度。
| 测试组 | 休眠电流 | 唤醒时间 | ADC精度 |
|---|---|---|---|
| PMOS全断 | 2.3微安 | 3ms | ±1LSB |
| PMOS全通 | 85微安 | 1ms | ±1LSB |
| 分压常供 | 22微安 | 1ms | ±1LSB |
从数据可以看出,PMOS全断方案比全通方案休眠电流降低了97%,代价是唤醒时间增加了2ms。对于每分钟采样一次的传感器节点,2ms的额外唤醒时间对平均功耗的影响是2ms/60s=0.0033%,可以忽略。分压常供方案虽然唤醒快,但休眠电流是PMOS全断方案的近10倍,对于长期待机的设备来说不可接受。
还有一个数据值得关注:PMOS全断方案下,墨水屏刷新一次消耗的电荷约0.5mC,如果每天刷新4次,平均电流是0.5mC*4/86400s=0.023微安,加上休眠电流2.3微安,总平均电流2.323微安。1200mAh电池理论待机时间是1200mAh/2.323微安=516天,约1.4年。实际考虑到电池自放电和温度影响,做到1年以上没有问题。
5. 常见问题与排查技巧实录
5.1 PMOS导通后负载不工作或电压偏低
这个问题我遇到过两次。第一次是PMOS的源极和漏极接反了。PMOS的体二极管方向是从漏极到源极,如果接反,体二极管会导通,但导通压降是0.7V,负载电压只有2.6V,驱动芯片可能工作不正常。检查方法是测量PMOS导通时源极和漏极的电压差,正常应该在毫伏级别,如果超过0.5V,很可能是接反了。
第二次是栅极驱动电压不足。STM32L4的GPIO在STOP模式下如果配置为开漏输出,高电平需要外部上拉。如果上拉电阻太大,比如1M,栅极电压建立时间很长,PMOS可能长时间处于线性区,导通电阻大,负载电压偏低。解决办法是减小上拉电阻到100k,或者配置为推挽输出。实测推挽输出下,栅极电压在1微秒内建立,PMOS完全导通。
还有一种情况是PMOS的阈值电压偏高。AO3401A的阈值电压是-0.9V到-1.3V,如果买到的是阈值电压-2V的批次,3.3V驱动下Vgs=-3.3V,仍然可以导通,但导通电阻会大一些。如果源极接5V,Vgs=-3.3V,阈值电压-2V的PMOS可能导通不充分。解决办法是选阈值电压更低的PMOS,或者用更高的驱动电压。
5.2 ADC采样值跳动大或不准
ADC采样值跳动大,最常见的原因是分压网络的RC时间常数和ADC采样时间不匹配。STM32L4的ADC采样时间可以配置,从2.5个ADC时钟周期到247.5个周期。如果采样时间太短,采样保持电容没有充分充电,读数会偏低且跳动。我的做法是先用最大采样时间测试,确认读数稳定后,再逐步减小采样时间,找到满足精度要求的最短时间。
另一个原因是PMOS导通瞬间的浪涌电流干扰了ADC。PMOS导通时,分压网络的上端电压从0V跳变到电池电压,这个跳变通过分压电阻耦合到ADC引脚,可能触发ADC的输入保护二极管。解决办法是在ADC引脚和分压点之间串一个1k电阻,同时在ADC引脚对地加一个100nF电容,形成低通滤波。实测这个RC网络可以把跳变干扰衰减到1LSB以内。
还有一种情况是PMOS截止时,ADC引脚的残留电压没有放干净。如果ADC引脚对地没有放电电阻,截止后引脚电压可能停留在上次采样的值,下次采样时影响读数。解决办法是在ADC引脚对地加一个1M的放电电阻,或者在下电阻上并联一个100nF电容,利用电容的放电特性把电压拉到0V。实测加放电电阻后,截止后ADC引脚电压在10ms内降到10mV以下。
5.3 休眠电流比预期大
休眠电流比预期大,排查思路是从电源正极开始,逐段测量电流。首先断开PMOS,测量电池正极到PMOS源极的电流,这个电流应该只有PMOS的漏电流和PCB漏电流,在纳安级别。如果这个电流有微安级别,说明PCB有漏电或者PMOS漏电流大。然后测量PMOS漏极到负载的电流,这个电流应该为零,如果有电流,说明PMOS没有完全截止。
我遇到过一次休眠电流2微安的情况,排查发现是墨水屏驱动芯片的SPI引脚在PMOS截止后仍然有电压,通过ESD二极管倒灌。解决办法是在PMOS截止前,把SPI引脚配置为模拟输入,确保没有倒灌路径。还有一次是ADC引脚在PMOS截止后仍然有0.3V电压,通过ADC输入保护二极管倒灌。解决办法是在ADC引脚对地加放电电阻,确保截止后电压降到0V。
还有一个容易被忽视的点:MCU的GPIO在输出高电平时,如果外部有上拉电阻到更高的电压,GPIO可能被拉高到超过VDD,导致MCU内部ESD二极管导通,产生漏电流。解决办法是确保GPIO的外部电压不超过VDD,或者用开漏输出加外部上拉到VDD。
5.4 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决办法 |
|---|---|---|---|
| PMOS导通后负载电压低 | 源漏接反 | 测源漏压差 | 调换源漏 |
| PMOS导通后负载电压低 | 栅极驱动不足 | 测栅极电压 | 改推挽输出或减小上拉电阻 |
| ADC读数跳动大 | 采样时间太短 | 增大采样时间测试 | 配置合适采样时间 |
| ADC读数跳动大 | PMOS导通干扰 | 示波器看ADC引脚 | 加RC滤波 |
| 休眠电流大 | PMOS未完全截止 | 测漏极电流 | 检查栅极电压和上拉电阻 |
| 休眠电流大 | 引脚倒灌 | 逐个断开引脚测试 | 配置引脚为模拟输入 |
| 休眠电流大 | PCB漏电 | 清洗前后对比 | 清洗PCB并烘干 |
6. 低功耗设计的延伸思考与经验总结
6.1 从PMOS开关到系统级低功耗设计
PMOS开关只是低功耗设计的一个环节,真正把休眠电流压到微安级别,需要系统级考虑。我的经验是,低功耗设计要遵循三个原则:第一,能断电的模块尽量断电,不要依赖芯片的休眠模式;第二,断电要彻底,包括电源、地、信号线都要考虑;第三,断电后的漏电流路径要逐一排查,不能有侥幸心理。
以我的项目为例,除了墨水屏和ADC分压网络,还有几个模块也做了断电处理:温湿度传感器的供电由另一个PMOS控制,不采样时完全断电;LED指示灯由NMOS控制,不指示时断开;甚至MCU的调试接口也在量产版本中做了断电处理。这些措施加起来,把休眠电流从最初的80微安压到了2.3微安。
还有一个经验是,低功耗设计要尽早介入,不要等到硬件定型后再优化。我在项目初期就规划了PMOS开关的位置和GPIO分配,PCB布局时把PMOS放在负载附近,减少走线长度和干扰。如果后期再改,飞线会引入额外的寄生参数和漏电流路径,效果大打折扣。
6.2 器件选型的几个硬指标
低功耗场景下选PMOS,我关注四个指标:阈值电压、导通电阻、漏电流、封装。阈值电压要低,确保3.3V驱动下可靠导通和截止;导通电阻要小,减少压降和损耗;漏电流要小,减少休眠电流;封装要小,节省PCB面积。AO3401A在这四个指标上比较均衡,但如果对漏电流要求更高,可以选BSS84,漏电流典型值1nA,但导通电阻大一些,约10欧姆,适合小电流负载。
ADC的选型也有讲究。STM32L4内部ADC的功耗在采样时约200微安,休眠时几乎为零。如果对精度要求高,可以选外部ADC,比如ADS1115,但外部ADC的静态电流在100微安级别,需要额外的PMOS开关控制。我的做法是用内部ADC,通过软件校准和温度补偿满足精度要求,省掉外部ADC的功耗和成本。
6.3 实测中的几个反直觉发现
第一个反直觉发现是,PMOS的导通电阻对ADC精度的影响比想象中小。我原本担心50毫欧的导通电阻会影响分压比,实测发现分压比误差在0.01%以内,完全可以忽略。原因是分压网络的等效源阻抗是50k,PMOS的50毫欧相比50k是千分之一,影响微乎其微。
第二个反直觉发现是,PMOS的关断速度比想象中慢。我原本以为GPIO拉高后PMOS立即截止,实测发现栅极电压从0V升到3.3V需要约40微秒,这段时间PMOS处于线性区,漏极电流逐渐减小。对于大多数应用,40微秒的关断时间可以接受,但如果需要快速关断,比如过流保护,需要额外的加速电路。
第三个反直觉发现是,PCB清洗对休眠电流的影响比想象中大。我实测过一块未清洗的PCB,休眠电流比清洗后大0.8微安,原因是助焊剂残留形成了微弱的导电通路。对于目标休眠电流个位数的场景,0.8微安是很大的占比。所以低功耗设计里,PCB清洗和烘干是必须的工序,不能省。
6.4 后续可以扩展的方向
这个PMOS开关方案还可以扩展到其他场景。比如多路ADC采样,可以用多个PMOS分别控制每路分压网络,采样时只导通对应路的PMOS,进一步降低功耗。再比如电池供电的无线传感器节点,可以用PMOS控制无线模块的供电,发送数据时导通,发送完成后截止,把无线模块的休眠电流也省掉。
还有一个方向是用PMOS做电源软启动,限制上电浪涌电流。我的项目里负载电容不大,浪涌不明显,但如果负载有大电容,比如超级电容或者大容量钽电容,PMOS的软启动功能就很有价值。具体做法是在栅极和源极之间并联电容,利用米勒效应延缓导通,实测可以把浪涌电流从1A降到200mA。
最后分享一个小技巧:在PMOS的栅极和源极之间并联一个100pF的电容,可以有效滤除高频干扰,防止PMOS误导通。这个电容的成本几乎为零,但效果很明显。我在一个电机控制项目里,PMOS栅极走线较长,没有加这个电容时,电机启动瞬间PMOS会误导通,加了之后问题消失。