半桥驱动与MOSFET开关:从PWM到栅极的工程实践

📅 发布时间:2026/10/6 20:21:59
半桥驱动与MOSFET开关:从PWM到栅极的工程实践
1. 半桥驱动到底在解决什么问题很多人第一次接触半桥驱动脑子里冒出来的第一个疑问是我直接用单片机IO口推MOSFET不就行了吗为什么还要专门搞一个驱动芯片这个问题我当年也问过后来烧了几颗管子之后才真正明白——半桥驱动的核心价值不在于能不能通而在于通得快不快、关得干不干净、上下管会不会打架。半桥拓扑的本质是两个MOSFET串联在电源正负之间中间那个点就是输出节点。上管高边管负责把负载接到电源正极下管低边管负责把负载拉到地。听起来简单但实际操作中上管的源极电位是浮动的——它跟着开关状态在电源电压和地之间跳。这就意味着你不能用普通的对地参考信号去驱动它必须有一套电平移位或者自举电路把控制信号抬到上管的源极电位之上。这就是半桥驱动芯片存在的第一个理由。第二个理由是电流能力。MOSFET的栅极本质上是一个电容容量从几百pF到几十nF不等。要在几十纳秒内把这个电容充到10V以上瞬间电流可能达到几安培。单片机IO口那点驱动能力就像用吸管给游泳池注水等你把栅极充到阈值电压开关损耗已经大到管子发烫了。驱动芯片的作用就是把这个吸管换成消防水管。第三个理由也是最容易被忽视的——死区时间控制。半桥最怕的就是上下管同时导通那相当于电源正负极直接短路瞬间电流可以到几百安培管子直接炸。死区时间就是在关断一个管子之后、开通另一个管子之前刻意插入的一段两个管子都不导通的时间。这段时间太短会直通太长会增加输出失真和体二极管导通损耗。驱动芯片通常内置了死区时间控制或者至少提供了精确控制死区的手段。我见过太多初学者在这上面栽跟头用STM32的PWM输出直接接MOSFET栅极跑低频的时候看起来没问题一上到20kHz以上管子就开始烫效率低得离谱。示波器一测栅极波形上升沿缓慢得像爬坡MOSFET在米勒平台区停留时间过长开关损耗自然大。换成专用驱动芯片之后同样的电路同样的负载管子温度直接降了三十多度。所以半桥驱动不是可选项而是功率电子设计中的必选项。理解它的工作原理是掌握PWM控制与MOSFET开关策略的前提。2. PWM信号从定时器到栅极的完整链路2.1 STM32定时器PWM输出模式的底层逻辑以STM32F103为例它的高级定时器TIM1和通用定时器TIM2-TIM4都能输出PWM。但很多人只会在CubeMX里点几下配置成PWM Generation CHx却不知道底层到底发生了什么。定时器的核心是一个计数器它从0数到ARR自动重装载寄存器的值然后归零重新开始。PWM输出的本质是比较计数器值小于CCR捕获比较寄存器时输出一种电平大于时输出另一种电平。改变CCR就改变了占空比改变ARR就改变了频率。这里有个关键细节STM32的PWM模式1和模式2的区别。模式1是计数器小于CCR时输出有效电平模式2是计数器小于CCR时输出无效电平。有效电平的高低又由CCER寄存器中的极性位决定。这三个设置组合起来才能确定最终的输出波形。我见过有人配置成PWM模式1、极性高结果发现占空比和预期反了就是因为没搞清楚这三层关系。对于半桥驱动通常需要两路互补的PWM信号。STM32的高级定时器支持互补输出CH1和CH1N是一对CH2和CH2N是一对CH3和CH3N是一对。互补输出意味着CH1为高时CH1N为低反之亦然。但这里有个陷阱互补输出默认会插入死区时间而死区时间是由BDTR寄存器中的DTG位控制的。如果你不配置BDTR死区时间可能是0上下管就有直通风险。2.2 死区时间的计算与设置死区时间的计算是半桥驱动中最需要精确处理的参数之一。STM32F103的BDTR寄存器中DTG[7:0]这8位决定了死区时间但它的编码方式不是线性的而是分段的。当DTG[7:5]0xx时死区时间DTG[7:0]×Tdtg其中Tdtg是定时器时钟周期。当DTG[7:5]10x时死区时间(64DTG[5:0])×2×Tdtg。当DTG[7:5]110时死区时间(32DTG[4:0])×8×Tdtg。当DTG[7:5]111时死区时间(32DTG[4:0])×16×Tdtg。假设定时器时钟是72MHzTdtg13.89ns。如果你需要500ns的死区时间可以选DTG[7:5]110然后(32DTG[4:0])×8×13.89ns500ns算出来DTG[4:0]约等于0.5取整后DTG[4:0]0或1实际死区时间约444ns或556ns。这个精度对于大多数应用已经够了。但死区时间不是随便设的。设得太小MOSFET的关断延迟可能导致直通设得太大输出波形失真严重体二极管导通时间过长效率下降。我的经验是先查MOSFET数据手册中的关断延迟时间td(off)和上升时间tr死区时间至少要是td(off)tr的1.5倍。比如一个MOSFET的td(off)50nstr30ns那死区时间至少120ns实际取200ns比较稳妥。2.3 从定时器输出到驱动芯片输入的信号调理STM32的PWM输出是3.3V电平而大多数半桥驱动芯片的输入高电平阈值在2V左右看起来直接连就行。但实际使用中我强烈建议在中间加一级缓冲或者电平转换。原因有两个第一STM32的IO口驱动能力有限虽然驱动芯片输入阻抗很高但长走线带来的寄生电容可能导致信号边沿变缓在高频下尤其明显。第二如果驱动芯片和单片机之间距离较远地弹和噪声可能让3.3V的信号在驱动芯片端看起来只有2.5V甚至更低接近阈值就容易误触发。我通常的做法是用74HC244或者74LVC244做缓冲既能提高驱动能力又能隔离噪声。如果驱动芯片支持3.3V逻辑输入那就更简单直接连就行但走线要尽量短最好在同一块PCB上。还有一个容易被忽略的点PWM信号的初始状态。在系统上电时STM32的IO口默认是浮空输入定时器还没配置好这时候驱动芯片的输入是什么状态如果驱动芯片输入浮空输出可能不确定上下管可能同时导通。所以硬件上要在驱动芯片输入端加下拉电阻软件上要先把IO口配置成低电平输出再初始化定时器。3. MOSFET开关过程中的损耗与热管理3.1 开关损耗的构成与计算MOSFET的损耗分两部分导通损耗和开关损耗。导通损耗是MOSFET完全导通时电流流过沟道电阻Rds(on)产生的计算公式是P_condI²×Rds(on)×D其中D是占空比。这部分损耗相对好算查数据手册的Rds(on)就行但要注意Rds(on)会随结温升高而增大通常数据手册给的是25°C时的值到100°C时可能增大50%甚至更多。开关损耗就复杂多了。它发生在MOSFET从关断到导通、从导通到关断的过渡过程中。在这段时间里MOSFET同时承受电压和电流瞬时功率可能非常大。开关损耗的近似计算公式是P_sw0.5×Vds×Id×(trtf)×f_sw其中tr是上升时间tf是下降时间f_sw是开关频率。这个公式看起来简单但tr和tf不是固定值它们取决于栅极驱动电流、栅极电荷Qg、以及米勒电容Cgd。栅极驱动电流越大tr和tf越短开关损耗越小。这就是为什么驱动芯片的峰值输出电流这个参数很重要——它直接决定了你能把开关损耗压到多低。举个例子假设Vds24VId5Af_sw20kHztrtf100ns。P_sw0.5×24×5×200ns×20kHz0.24W。如果tr和tf降到50nsP_sw就降到0.12W。看起来差别不大但如果你的负载电流是20A那开关损耗就是0.96W和0.48W的区别对于一个小封装的MOSFET来说这可能是能不能稳定工作的分界线。3.2 米勒平台对开关速度的影响米勒平台是MOSFET开关过程中最关键的阶段。当栅极电压上升到阈值电压Vgs(th)时MOSFET开始导通漏极电流开始上升但漏极电压还没怎么降。这时候栅极电压会停留在一个平台上这个平台电压就是米勒平台电压大约等于Vgs(th)Id/gm其中gm是跨导。在米勒平台期间驱动电流几乎全部用来给米勒电容Cgd充放电栅极电压几乎不变。这个阶段持续的时间越长开关损耗越大。要缩短米勒平台时间要么增大驱动电流要么减小Cgd。Cgd是MOSFET的固有参数选型时就要考虑通常低压MOSFET的Cgd比高压MOSFET小。我实测过不同驱动电流下的开关波形。用10mA驱动电流时米勒平台持续约200ns用100mA时降到约50ns用1A时降到约20ns。但驱动电流也不是越大越好太大的驱动电流会导致栅极振荡因为栅极走线的寄生电感会和栅极电容形成LC谐振。通常驱动电阻在2Ω到10Ω之间比较合适具体值要通过实验确定。3.3 热阻系数与散热设计MOSFET的热阻系数是热管理设计的核心参数。数据手册里通常给出两个热阻Rθjc结到壳和Rθja结到环境。Rθjc用于加散热器的场景Rθja用于不加散热器的场景。计算结温的公式是TjTaP×Rθja不加散热器或TjTcP×Rθjc加散热器Tc是壳温。但这里有个坑Rθja这个参数是在特定条件下测的比如JEDEC标准板实际PCB的铜箔面积、层数、过孔数量都会影响散热效果。我见过有人按Rθja50°C/W算出来结温没问题实际跑起来管子烫得手都摸不了就是因为实际PCB的散热条件比标准板差很多。我的经验是对于TO-252、TO-263这类贴片封装如果PCB铜箔面积小于1平方厘米Rθja实际可能到80°C/W甚至更高。要准确评估最好用热像仪实测或者用热电偶测壳温然后按Rθjc反推结温。散热设计的另一个关键是PCB布局。MOSFET的漏极通常接在散热焊盘上这个焊盘要尽可能大并且要多打过孔连接到背面铜箔。如果是多层板最好在内层也铺铜通过过孔阵列把热量传导出去。我通常会在MOSFET下面放9到16个过孔孔径0.3mm间距1mm左右散热效果比不放过孔好很多。4. 半桥驱动中的故障保护与异常处理4.1 直通故障的成因与防护直通是半桥驱动中最致命的故障。它发生在上管和下管同时导通的时候电源通过两个管子直接短路电流只受回路寄生电阻限制可能达到几百甚至上千安培。直通的原因通常有三个死区时间不足、驱动信号受干扰、或者一个管子关断延迟过长。死区时间不足是最常见的原因。前面说过死区时间要大于MOSFET的关断延迟加上升时间。但很多人只考虑了常温下的参数忽略了高温下关断延迟会增大。MOSFET的关断延迟随温度升高而增加通常每升高100°C关断延迟增加20%到30%。所以死区时间要按最高工作温度下的参数来算。驱动信号受干扰是另一个原因。如果PWM信号走线靠近功率走线功率走线上的dv/dt可能通过寄生电容耦合到PWM信号上导致驱动芯片误触发。防护措施包括PWM信号走线远离功率走线最好用地线隔离在驱动芯片输入端加RC滤波截止频率要高于PWM频率但低于干扰频率使用带滞回输入的驱动芯片。驱动芯片本身通常有直通保护功能比如检测到上下管驱动信号同时为高时自动插入死区或者封锁输出。但不要完全依赖这个功能硬件设计上还是要保证死区时间足够。4.2 过流与过温保护策略过流保护通常通过采样电阻或者MOSFET的Rds(on)来实现。采样电阻方案精度高但会增加功耗和成本Rds(on)采样方案成本低但精度受温度影响大。我比较推荐用采样电阻加比较器的方式。采样电阻放在半桥的下管源极和地之间阻值选1mΩ到10mΩ根据最大电流和允许的功耗来定。比较器的阈值设为最大电流对应的电压一旦超过就触发保护封锁PWM输出。比较器的响应时间要快最好在1微秒以内否则电流可能已经上升到危险值了。过温保护可以用NTC热敏电阻贴在MOSFET附近通过ADC采样。但NTC的响应速度慢通常要几秒才能反应过来所以过温保护是最后一道防线不能替代过流保护。我通常把过温阈值设在100°C到110°C留20°C到30°C的余量。还有一种保护是欠压锁定UVLO。驱动芯片的供电电压如果太低MOSFET可能工作在线性区而不是饱和区Rds(on)急剧增大瞬间就会过热烧毁。UVLO功能会在供电电压低于阈值时封锁输出防止这种情况发生。选驱动芯片时一定要确认它有UVLO功能并且阈值要合适。4.3 PWM故障保护的实际配置在STM32中高级定时器TIM1和TIM8支持刹车功能Break Function。当刹车引脚检测到有效电平时定时器会自动封锁PWM输出把输出引脚置为安全状态。这个功能配合过流比较器使用非常方便。配置刹车功能时要注意几个参数刹车极性高电平有效还是低电平有效、刹车后的输出状态高阻、低电平还是高电平、以及自动恢复还是需要软件清除。我通常设置成刹车输入低电平有效刹车后输出低电平需要软件清除刹车标志后才能恢复输出。这样在过流发生后系统会保持安全状态直到软件确认故障已排除。刹车输入引脚要加滤波防止噪声误触发。STM32的刹车输入有数字滤波功能可以设置滤波长度我一般设成8个时钟周期既能滤掉窄脉冲噪声又不会明显延迟响应。5. 从原理图到PCB的工程落地细节5.1 自举电容与自举二极管的选型自举电路是高边驱动供电的核心。它的原理是当下管导通时自举电容通过自举二极管从电源充电当上管导通时自举电容的电压被抬到上管源极电位之上给高边驱动供电。自举电容的容量要足够大能在上管导通期间维持高边驱动电路的供电。计算公式是C_boot≥Q_total/ΔV其中Q_total是高边驱动电路的总电荷需求包括MOSFET的Qg和驱动芯片的静态电流ΔV是允许的电压下降。通常ΔV取0.5V到1V。举个例子如果MOSFET的Qg50nC驱动芯片静态电流1mA上管最大导通时间10微秒那Q_total50nC1mA×10μs60nC。如果ΔV0.5VC_boot≥120nF实际取220nF或470nF比较稳妥。自举二极管要选快恢复二极管反向恢复时间要短否则在下管导通时自举电容的电荷会通过二极管反向恢复倒灌回电源。我通常用1N4148或者BAV99反向恢复时间几纳秒足够用了。但要注意二极管的耐压要大于电源电压电流要大于自举电容的充电电流。5.2 栅极电阻的取值与布局栅极电阻有两个作用限制栅极充电电流防止振荡调节开关速度平衡开关损耗和EMI。取值太小开关速度快但容易振荡取值太大开关速度慢但损耗大。我的经验是先按驱动芯片的峰值电流和MOSFET的Qg估算一个初始值。比如驱动芯片峰值电流1AQg50nC那理想情况下充电时间50ns栅极电阻Rg(Vdrive-Vplateau)/I_peak大约(12V-3V)/1A9Ω。实际取值在2Ω到10Ω之间通过实验调整。栅极电阻的布局很关键。电阻要尽量靠近MOSFET的栅极走线要短而粗。如果驱动芯片和MOSFET距离较远栅极走线要用地线包围减少寄生电感。我见过有人把栅极电阻放在驱动芯片旁边走线10厘米到MOSFET结果开关波形振荡得厉害就是因为走线电感太大。5.3 功率回路的寄生电感控制功率回路的寄生电感是EMI和电压尖峰的主要来源。当MOSFET关断时回路电流突变寄生电感产生电压尖峰VL×di/dt。如果寄生电感是100nH电流是10A关断时间是100ns那尖峰电压就是100nH×10A/100ns10V。如果电源是24V尖峰就是34V可能超过MOSFET的耐压。控制寄生电感的方法功率走线要短而宽最好用铺铜而不是走线输入电容要尽量靠近半桥减小电容到MOSFET的回路面积上下管的漏极和源极连接要尽量短最好直接叠在一起。我通常会把输入电容、上管、下管放在同一块铜皮上回路面积控制在1平方厘米以内。还有一个技巧在上下管之间加一个RC吸收电路吸收电压尖峰。电阻取1Ω到10Ω电容取100pF到1nF。但吸收电路会增加损耗所以只在尖峰确实超标时才加。6. 实测波形分析与常见问题排查6.1 栅极波形的正确形态与异常识别正常的栅极波形应该是快速上升、平台短暂、快速下降。上升时间在几十纳秒量级米勒平台持续几十纳秒下降时间也在几十纳秒。如果上升沿缓慢说明驱动电流不足或者栅极电阻太大如果波形有振荡说明栅极走线电感太大或者驱动电流太大如果米勒平台过长说明驱动电流不足或者Cgd太大。我实测过一个案例用STM32直接驱动MOSFET栅极波形上升时间约500ns米勒平台约300ns。换成专用驱动芯片后上升时间降到50ns米勒平台降到30ns。同样的负载MOSFET的壳温从85°C降到52°C。这个对比很直观地说明了驱动芯片的价值。6.2 输出节点波形的振铃与抑制输出节点的波形在开关瞬间通常会有振铃这是功率回路寄生电感和MOSFET输出电容谐振的结果。振铃频率通常在几十MHz到几百MHz幅度可能达到电源电压的50%甚至更高。抑制振铃的方法减小功率回路寄生电感前面说过在输出节点加RC吸收电路适当增大栅极电阻减慢开关速度。但减慢开关速度会增加开关损耗所以要权衡。我通常先优化布局把寄生电感降到最低如果振铃还是超标再加RC吸收。6.3 死区时间不足的波形特征死区时间不足的波形特征很明显在上下管切换的瞬间输出节点会出现一个尖峰然后迅速回到正确电平。这个尖峰就是直通电流在寄生电感上产生的电压。如果死区时间严重不足尖峰可能很大甚至导致MOSFET损坏。用示波器观察时要把时间轴展开到纳秒级才能看清死区期间的波形。如果看到输出节点在死区期间有异常跳变或者电源电流在开关瞬间有尖峰那基本可以确定是死区时间不足。解决方法就是增大死区时间或者换用关断延迟更小的MOSFET。7. 几个容易踩的坑与个人经验第一个坑忽略自举电容的耐压。自举电容承受的电压是电源电压加上驱动电压比如电源24V驱动12V那自举电容要承受36V。如果选16V耐压的电容直接炸。我通常选50V耐压的X7R陶瓷电容容量220nF到1μF。第二个坑驱动芯片的供电没有去耦。驱动芯片的供电引脚要加0.1μF和10μF的电容尽量靠近芯片。没有去耦的话驱动芯片输出电流突变时供电电压会波动导致驱动能力下降甚至误动作。第三个坑MOSFET的源极走线太长。下管的源极是功率回路的一部分也是驱动回路的参考地。如果源极走线太长驱动回路的参考地会波动导致驱动电压不稳定。我通常把下管源极直接铺铜到输入电容的负极走线尽量短。第四个坑忽略MOSFET的体二极管导通。在半桥驱动感性负载时关断瞬间负载电流会通过体二极管续流。体二极管的正向压降比MOSFET导通压降大损耗也大。如果续流时间长体二极管可能过热。解决方法是用同步整流在续流期间开通下管让电流走沟道而不是体二极管。第五个坑PWM频率选得太高。频率越高开关损耗越大驱动芯片和MOSFET的发热越严重。但频率太低输出纹波大负载可能啸叫。我通常选20kHz到50kHz超过20kHz人耳听不到啸叫50kHz以下开关损耗还能接受。具体值要根据MOSFET的参数和散热条件来定。最后分享一个调试技巧在调试半桥电路时先用低压电源比如5V和低频率比如1kHz测试确认波形正确后再逐步升高电压和频率。这样即使有问题也不会炸管子。我见过太多人一上来就上24V、20kHz结果一通电就冒烟。循序渐进是功率电子调试的铁律。