很多人玩电机驱动,第一步就是搭个H桥,四个MOS管一接,觉得正转反转就是两两导通的事,简单得很。结果一上电,管子莫名其妙炸了,或者高边管怎么都驱动不充分,电机嗡嗡响却使不上劲。这些问题的根子,往往不在"桥"本身,而在死区时间、续流和自举电路这三个容易被忽略的细节上。H桥电机驱动看着只是四个开关的组合,但真正的工程难点全藏在这三个词里。这篇文章我把这三块掰开揉碎讲清楚,顺便把我在调试中踩过的坑也一并交代出来。
这篇文章适合正在用分立MOS管搭H桥的硬件工程师、刚开始接触电机驱动的嵌入式开发者,以及用L298N、TB6612这类模块但想搞明白内部逻辑的爱好者。我尽量不堆公式,但涉及计算的地方会给出完整推导,毕竟这些参数是实打实要写进代码和原理图里的。
1. H桥不是四个开关那么简单:先看懂电流往哪走
1.1 为什么正反转非要"桥"这种结构
直流电机的本质是一个装有换向器的线圈,你给它正向电压它就正转,反向电压它就反转。实现反转最简单粗暴的办法是继电器换向,但继电器有机械寿命、切换速度慢、触点火花大,PWM调速根本玩不转。于是就有了半导体开关搭成的H桥:四个开关管按字母H的形状排列,电机接在中间横杠上。
电气专业的读者一眼就能看出,这其实就是"双极性双开关"架构的一个特例。H桥的核心价值不是"能反转",而是能在同一个电源下,用纯电子手段快速切换电流方向,同时支持PWM调速。
来看四种基本开关组合。我把左上管标为Q1,右上管标为Q2,左下管标为Q3,右下管标为Q4:
| 工作模式 | 导通的管子 | 电流路径 | 电机状态 |
|---|---|---|---|
| 正转 | Q1 + Q4 | 电源正 → Q1 → 电机 → Q4 → 电源负 | 正转 |
| 反转 | Q2 + Q3 | 电源正 → Q2 → 电机 → Q3 → 电源负 | 反转 |
| 刹车(低边) | Q3 + Q4 | 电机两端短路到地 | 急刹车 |
| 刹车(高边) | Q1 + Q2 | 电机两端短路到电源 | 急刹车 |
| 滑行 | 全部关断 | 电机两端悬空,电流靠续流二极管走 | 自由停车 |
1.2 电流路径里藏着的第一道坎
正转的时候,电流从电源正极出发,经过左上管、电机、右下管回到地,这个路径上电源电压全部加在电机上。问题来了:如果正转时我不小心把右上管Q2也打开了会怎样?
电源正极 → Q1 → Q2 → 电源负极,这条路直接短路。这就是H桥最经典的"直通"(shoot-through)事故,也叫桥臂直通。直通瞬间电流只受线路寄生电阻和管子导通电阻限制,几十安甚至几百安的电流瞬间把管子击穿,连铜皮都可能烧断。
直通是死区时间要解决的核心问题。但在此之前,我们还必须意识到另一件事:电机是感性负载,电流不能突变。当开关管关断时,电机电感里储存的能量必须找一个去处——这就是续流。而高边管的驱动,又牵扯出自举电路。这三个问题其实环环相扣,下面逐个拆解。
2. 死区时间:一场精准控制的"撤火"艺术
2.1 上下管同时导通的机理:不是你想开才开
很多人有个误解,以为只要代码里先关Q2再开Q1,就不会直通。但MOSFET不是理想开关,它从门极拿到电压到漏源真正导通,中间要经历一段"半导通"状态。更关键的是,关断比开通慢得多。
原因在于米勒电容。MOSFET的栅极和漏极之间存在一个反馈电容Cgd(米勒电容),关断时栅极电压要先经历米勒平台,把漏极电压抬升上来,这个过程需要泄放电荷。而开通时,栅极驱动电流只需要给Cgs充电,速度往往更快。典型结果是:同一颗管子,开通延迟个几十纳秒,关断延迟个一两百纳秒,甚至更多。
假设控制信号在同一时刻翻转:Q2还没完全关断(还处于半导通状态,电阻很小),Q1已经开始导通,这时候电源正极到地之间等于接了两个"可变电阻"串联。半导通状态下的管子消耗的功率极其可观,几纳秒就能让结温飙升。如果PWM频率高、每次开关都这样,管子必炸。
2.2 死区时间怎么定:从栅极电荷参数倒推
死区时间就是"先让上管彻底关断,等一会儿,再让下管导通"的等待时间。定多少合适?查MOSFET数据手册里的开关特性参数:
- td(on):开通延迟时间
- tr:上升时间
- td(off):关断延迟时间
- tf:下降时间
那么理论上最小安全死区就是:
T_dead_min = td(off) + tf - td(on)
但实际工程不能只算理论值,因为栅极驱动电阻、温度、批次差异都会改变开关时间。我的习惯是理论值基础上乘以1.5到2倍,再留50~100ns的裕量。比如IRLR7843这类低压MOS管,理论死区大概在60ns左右,实际我会设200~300ns,既安全又不明显影响波形。
如果你用的是一体化驱动芯片,比如IR2104,芯片内部已经把死区做进去了,典型值520ns,外部不用管。但我依然建议用示波器确认一下实际波形,因为有些国产替代芯片的死区参数和IR原厂并不一致,我就遇到过标称520ns实际只有200ns的,用在重负载电机上直接烫手。
2.3 STM32高级定时器的死区配置:一个寄存器的事
使用STM32的TIM1/TIM8高级定时器时,死区由TIMx_BDTR寄存器的DTG[7:0]位配置。具体分两段:DTG[7:5]为0时,死区时间DT = DTG[7:0] × Tdtg,Tdtg = 1/定时器时钟;DTG[7:5]非0时,Tdtg会倍增。下面是一段实际配置代码:
// 以72MHz定时器时钟为例 // 死区时间设为 0.5us = 36 个计数周期 TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1; TIM_TimeBaseStructure.TIM_Period = 999; // 20kHz PWM TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); // 配置死区,DTG = 36,对应 36/72MHz = 0.5us TIM_BDTRInitTypeDef bdtr; bdtr.TIM_OSSRState = TIM_OSSRState_Enable; bdtr.TIM_OSSIState = TIM_OSSIState_Disable; bdtr.TIM_LOCKLevel = TIM_LOCKLevel_OFF; bdtr.TIM_DeadTime = 36; bdtr.TIM_Break = TIM_Break_Disable; bdtr.TIM_BreakPolarity = TIM_BreakPolarity_High; bdtr.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable; TIM_BDTRInit(TIM1, &bdtr);注意一个细节:STM32的死区是双向插入的。也就是说,上升沿和下降沿各推迟一半死区时间,而不是只在一边加。这意味着实际有效占空比比设定的要窄,如果你做闭环控制,占空比死区补偿是必须的,否则低速时电机会有明显的非线性。
2.4 死区太长会发生什么
死区不是越大越好。死区时间内,上下桥臂全部关断,电机电流只能靠续流二极管续流。死区越大,续流时间越长,二极管压降造成的损耗越大。更麻烦的是,续流期间电机的电流方向决定了输出端电压被钳位到电源轨还是地轨,这个期间输出的平均电压会偏离理想值,引入谐波和转矩脉动。
我的经验是:死区时间取MOSFET关断总时间的2~3倍就够,再大纯属浪费。如果实测发热异常、波形有台阶,先复查死区,再看驱动电阻。
3. 续流路径:电机电感憋着的能量必须有个去处
3.1 电感断流为何会"拉电弧"
电机的等效模型是电阻串联电感,再加一个反电动势(发电机效应)。电感的特性是电流不能突变,你强行把开关断开,电感会产生一个反向电动势试图维持电流。这个反电动势的幅度是 L × di/dt,di/dt越大,电压尖峰越高。
拿一个典型的直流电机来说,电枢电感可能在几百微亨到几毫亨之间。如果PWM关断瞬间电流变化率是1A/μs,电感1mH,那反电动势就是1000V。而你的MOSFET耐压可能只有40V,这一个尖峰就把管子打穿了。所以续流并不是"为了让电流继续流动"这么简单,更是为了防止电感反电动势击穿开关管。
3.2 体二极管续流 vs 外部肖特基续流
低压MOSFET的漏源之间天生有一个寄生体二极管,电流方向从源极到漏极。当H桥中某个管子关断,需要续流时,体二极管恰好能承担这个角色。一个典型场景:正转PWM控制Q1,Q4常通,Q2、Q3关断。当PWM关断时,电机电流必须保持原方向(从Q1流入电机)。这时Q1关断,电流路径被打断,唯一能续流的是Q2的体二极管:电机 → Q2体二极管 → 电源正极。
注意,电流回流到电源正极意味着这是能量回馈,电机的部分动能被用来给母线电容充电。这个路径的效率取决于二极管压降。
体二极管虽然方便,但有两个问题:续流恢复速度慢,以及导通压降大(通常0.7~1.5V)。对于低成本低压驱动,体二极管勉强够用。但在大电流或高频场合,体二极管的损耗和反向恢复会让管子严重发热,这时就需要在MOSFET外部并联肖特基二极管。
| 对比维度 | 体二极管续流 | 外部肖特基续流 |
|---|---|---|
| 正向压降 | 0.7~1.5V | 0.3~0.5V |
| 反向恢复 | 慢,可能引起振铃 | 几乎无反向恢复 |
| 附加成本 | 无 | 每桥臂需加1~2颗 |
| 适用场景 | 低压小电流、频率<20kHz | 大电流、高频或高效率要求 |
3.3 续流路径的损耗估算
续流损耗怎么算?假设PWM关断期间,电机电流I完全通过二极管续流,二极管导通压降Vf,续流时间占整个周期的比例是(1-D),那么一个周期的续流损耗为:
P_fly = Vf × I × (1 - D)
举个例子:电机电流5A,二极管压降1V,占空比D=0.7(也就是70%时间在开通),那么续流损耗就是1 × 5 × 0.3 = 1.5W。这个损耗分布在续流二极管上,如果正好是你的MOSFET体二极管,那也就是加在管子身上。表面看来1.5W不算大,但如果散热不良,结温连续爬升到120°C以上,MOSFET的导通电阻会恶化,雪崩效应随之而来。
所以我会在PCB布局时,在每一颗MOSFET的D-S两端预留肖特基二极管位。即使最初设计用体二极管续流能工作,预留位置也能在后续升级电流时直接贴上,不用重新画板。
还有一个小细节:续流路径上也要注意PCB走线的寄生电感。二极管离MOSFET越远,寄生电感越大,换流瞬间的电压尖峰越高。我在4层板上习惯把功率回路走线尽量缩短,二极管紧贴MOS管放置,这个习惯帮我省掉了很多吸收电路。
4. 自举电路:高边驱动怎么"凭空"变出电源
4.1 高边MOSFET的驱动难题在哪
N沟道MOSFET要完全导通,栅源电压Vgs必须超过阈值,最好在10~15V。低边管(如Q4)的源极接地,栅极只要加一个10V以上的电压就能导通,这很容易,用一路隔离电源或者一个简单的推挽驱动都行。
但高边管(如Q1)的源极接到电机,电机工作时源极电压等于母线电压,一般12V或24V。如果栅极也只加12V,那Vgs接近0V,管子根本打不开。怎么办?得有"比母线电压还高"的栅极驱动电源。最省成本的办法就是用自举电容:
- 低边管导通时,高边的自举电容通过自举二极管从VCC充电
- 低边管关断后,自举电容的电荷提供给高边驱动电路,让高边栅极驱动电压等于 电容两端电压 + 源极电压
可以这样理解:低边管导通的瞬间,等于给高边驱动电路"充了一次电",高边管工作时就靠这个电容里的电"悬浮供电"。所有自举电容的工作井逻辑都围绕"充电—保持—再充电"这个循环。
4.2 自举电容的容量怎么算
这是很多人翻车的地方。自举电容太小,高边管的栅极电压在导通期间跌落太多,管子半开导致导通损耗剧增;自举电容太大,充电时间常数过长,可能导致高边开通瞬间栅极驱动电压还没建立起来。
自举电容的最小容量公式:
C_boot = Q_g / ΔV
其中Q_g是MOSFET的总栅极电荷(数据手册里都有),ΔV是允许的自举电压跌落。IR2104之类的驱动芯片,内部还带电平转换电路,这部分也消耗电荷,通常按经验在Q_g基础上加20~30%。
实际算一个例子。IRLR7843的Q_g约36nC,允许跌1V,那么C_boot = 36nC / 1V = 36nF,加上余量取0.1μF就够。但在实际应用中,我从来不会只按这个公式选,因为电容容值会随温度、老化衰减,而且电解电容在低频下的等效串联电阻也不能忽略。
我的经验值:PWM频率20kHz以下,取4.7μF~22μF的X7R陶瓷电容;PWM频率几十kHz以上,可以降到1μF~4.7μF。注意用X7R或C0G介质,X5R在高偏压下容量会衰减到标称值的50%甚至更低,这是陶瓷电容的直流偏压特性,不少人没注意这一点,选了个看起来足够大的电容实际容量却缩水了。
4.3 占空比和频率对自举充电的限制
自举电路有一个内在限制:高边导通时间不能太长,也不能太短。
- 高边导通时间太长,自举电容一直在放电,能量耗尽后高边就会关断或半导通。这在超低PWM频率或100%占空比时尤其致命。
- 高边导通时间太短,每个周期内低边充电的时间太短,电荷补充不足。注意这里充电路径是:VCC → 自举二极管 → 电容 → 低边MOSFET → 地。这个回路有电阻,电容充电是渐进的,需要时间常数足够小。
最后一个重要场景:如果PWM占空比长期大于95%,或者你需要100%占空比输出,很多驱动芯片的自举方案就撑不住了。解决办法是用电荷泵或者隔离电源给高边单独供电。对于要求不高的小功率电机驱动,也可以改用"互补PWM+死区"模式,让低边在每个开关周期都短暂导通一下,给自举电容补电,但这个方案的代价是低边管多了额外的开关损耗。
关于自举二极管的选型,很多人忽略它。这个二极管必须是快恢复二极管或超快恢复二极管,因为它反向恢复时间直接影响充电效率和尖峰。普通1N4148在几十kHz下勉强能用,但开关边沿越陡,反向恢复损耗越明显。我习惯用US1M或ES1J这类贴片快恢复管,耐压按母线电压的1.5倍以上选。
4.4 自举失效的典型症状
自举不足的故障表现很有特点,我在测试中遇到过好几次:空载时电机转得很顺,一带负载就转速抖动,高边MOSFET温度迅速升高。这是因为空载电流小,母线电压毛刺小,高边半导通状态下的压降损失不明显;一旦负载增大,半导通管压降增大,热量全耗在管子上。
用示波器探头分别测高边管的栅极和源极波形,可以直观看到:正常时Vgs是高电平稳定方波,自举不足时Vgs高电平呈"下降斜坡"状,像一个泄了气的皮球。这个波形是判断自举问题的最有力证据。
另外,上电时序也会影响自举。很多驱动芯片上电瞬间,低边还没导通过,自举电容是没电的。如果程序一上来就给高边发PWM,第一次高边导通可能根本打不开。所以启动代码里,要先让低边导通几百微秒,确保电容充满。
5. 示波器与发热:实战调试里最容易翻车的三件事
5.1 用示波器测死区:差分探头最靠谱
测死区时间,最标准的方式是用差分探头同时测上管和下管的Vgs。但很多人手头没有差分探头,于是用两个普通探头插座供电两端测,结果出现了奇怪的现象——关断的管子栅极波形上出现了莫名其妙的负压尖峰,或者上下管波形交叉重叠,被误判为直通。
这个问题本质是普通探头的地线夹子连到了不同的参考地,接地回路引入了共模噪声。ESD和噪声都会叠加到波形上。实在没有差分探头,我建议探头地线夹直接夹在MOSFET源极旁边紧挨着的功率地铜皮上,不用飞线,测试点之间距离越短越好。
一个更省事的判定方法:直接测下管GS波形,看关断沿到另一个桥臂开通沿之间的时间间隔。配合示波器的光标功能,把死区读出来。熟练之后,看波形形状就能猜到死区设的是多少,快且准。
5.2 自举电容炸了?先怀疑振铃
自举电容在PCB上如果离驱动芯片太远,回路电感大,高边开关切换瞬间会在自举电容上产生高频振铃。这种振铃除了带来EMI问题,更危险的是可能导致自举电容过压击穿。我遇到过一次陶瓷电容开裂的案例,排查到最后发现根本不是电容质量问题,而是走线太长、振铃峰值超过了电容额定电压。
解决思路三件事:自举电容尽量靠驱动芯片的VB-VS引脚放置;在自举电容旁边并联一个小容值的C0G电容(比如100nF)吸收高频分量;检查自举二极管的反向恢复特性。这套组合拳下来,振铃基本能被压到可以接受的范围。
5.3 一个典型故障复盘:电机嗡嗡响,高边管烧了
最后分享一个完整的排障案例。一个12V直流电机驱动板,用两颗IR2104驱动四个IRLR7843,PWM 20kHz。客户反馈:电机空载正常,加载后高边管持续发热,最后烧毁。
拿到板子我先量了死区:IR2104用的是内部死区520ns,示波器实测约500ns,正常。再量高边Vgs空载波形:高电平稳定,无跌落。接上负载再量:高边Vgs高电平时出现明显下降斜坡,从12V掉到8V以下。这说明自举电容在带载时电压被拉垮了。
查板子发现,自举电容用的是224(220nF)X5R介质,批次实际容量在12V偏压下只剩约40%,加上驱动芯片输出级的电荷消耗,有效电压维持不住。我换成了4.7μF X7R,同样位置,带载测试Vgs无明显跌落,表面温度下降了差不多15°C。
这个案例想强调的是:自举电容的"标称容量"和"实际容量"是两回事。大家在选型时,尽量留足余量,有条件的话直接拿LCR表加偏压测一下真实电容值。
5.4 关于栅极电阻和续流二极管的最后一件事
死区、续流、自举都正常的前提下,MOSFET驱动电阻选择不当也会让前面的努力功亏一篑。开通时电阻大、开关慢,开关损耗大;电阻小、开关快,电压尖峰和振铃更严重。我的做法是分别用开通电阻和关断电阻:在栅极串一个电阻,再反向并在电阻上并一个二极管,让导通慢一点、关断快一点。这个电路的代价是BOM多了一个二极管,换来的是开关损耗和尖峰都相对可控。
在续流方面,如果你的H桥驱动的是有刷电机,建议在电机两端并联一个RC吸收电路(俗称snubber),参数可以从100Ω + 1nF起步试。这个吸收电路能明显减小PWM开关造成的电压过冲,也能减轻一部分EMI,但它不替代续流二极管,两者职责不同。别搞混了。
最后一个实用的规矩:H桥的功率地和小信号地要单点连接,靠近母线电容负极的位置。我的经验是,把这个单点连好了,示波器上的杂波会少一大半,排查问题的工作量也跟着直线下降。很多人把电路设计想得很玄,其实是这些小细节决定了板子到底稳不稳。