ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

IR2104 H桥电机驱动方案详解:自举电路与MOS管驱动实战

IR2104 H桥电机驱动方案详解:自举电路与MOS管驱动实战 做电机驱动的朋友多多少少都经历过“H桥烧MOS管”的痛新画的板子一上电啪的一声MOS管冒烟了或者电机转着转着管子突然短路把电源都拉保护了。排查来排查去问题往往不在MOS管本身而在栅极驱动这一环。这篇博文我就把一套成熟的IR2104电机驱动方案拆开揉碎讲清楚——从自举电路的工作原理、元件参数计算到原理图和STM32控制逻辑再到调试中容易踩的坑。如果你正在搭24V以内的直流电机驱动照着这套思路走基本能一次点亮。1. 为什么H桥总是烧MOS管驱动芯片的入场理由1.1 从MOS管栅极驱动的基础难题说起先聊一个基础但关键的问题MOS管到底是怎么导通的对N沟道增强型MOS管来说栅极电压必须比源极电压高出一个阈值Vgs(th)导电沟道才会建立。比如你用STM32的3.3V GPIO直接去驱动一个低压MOS管1.8V阈值的那种勉强能开一点点但导通电阻Rds(on)会非常大管子处于“半开半关”的线性区电流一过就发热冒烟。更麻烦的是MOS管的栅极不是一个纯电阻负载它本质上是几十纳法的小电容开通瞬间需要瞬间灌入一个很大的充电电流这个任务普通单片机的IO口根本干不了。如果你用分立元件搭驱动电路比如三极管推挽又会遇到一个新问题高速开关时的米勒平台效应。MOS管的Vgs在米勒平台阶段会停留一段时间这段时间Vds还在下降如果驱动电流不够开关时间就被拉长开关损耗成倍增加。我见过不少新手自己用两个三极管搭图腾柱驱动结果波形上升沿软得像水一样开关频率一上10kHz管子就烫得没法摸。这就是驱动能力不足的表现。这里顺便说一下一个常见误区有人问我能不能用IR2104的Vcc直接接3.3V供电。绝对不行。IR2104的Vcc工作范围是10V到20V你至少要给它供10V以上栅极驱动电压才有意义。至于逻辑输入的电平它倒是兼容TTL/CMOSSTM32的3.3V可以直接控制但驱动芯片本身的供电必须单独搞定。1.2 H桥用IR2104的核心优势对比市面上电机驱动方案很多L298N、TB6612这类集成驱动模块确实省事但它们内部的功率管大多是达林顿管或者集成式的MOS导通压降大、发热厉害大电流场景根本撑不住。TB6612在小电流场合很好用但超过1.2A左右就不太行了。如果你想驱动一个几十瓦的直流电机或者想自己控制MOS管选型来匹配不同的母线电压那就绕不开“驱动芯片外置MOS管”这种方案。IR2104是典型的半桥栅极驱动芯片它解决了三个最让人头疼的问题。第一是电平转换高边MOS的源极是悬浮的栅极电压必须跟着源极走IR2104内置的电平移位电路能把这个悬浮信号处理好。第二是死区时间IR2104内部集成了固定的死区防止上下管同时导通造成直通短路。第三是驱动能力它能在瞬间灌入和拉出几百毫安的栅极电流让MOS管快速切换把开关损耗压到最低。从成本角度看一片IR2104的价格不高配合两颗几十安的N-MOS管整体BOM成本比买一个成品驱动模块还要便宜而且耐流上限完全由你选的MOS管决定。这也是为什么很多做无刷电机驱动器、机器人底盘、AGV小车的工程师都偏爱这种方案。用它来做H桥一个全桥需要两片IR2104左右半桥各一片逻辑上完全可控。2. 自举电路拆解IR2104搞定高边栅极驱动的关键2.1 自举电容的“移动电池”原理很多新手第一次看半桥驱动电路图时最困惑的就是那个电容VB和VS引脚之间跨接的电容到底是干嘛的它为什么能让高边MOS正常开启我打一个比方自举电容就像一块“移动充电宝”。开关电源建立后IR2104的Vcc会给自举电容充电电容两端电压被充到大约等于Vcc减去二极管压降。等到低边MOS管关断、高边MOS管需要开通的时候这个电容的负端会跟随着VS引脚电压一起被抬上去——因为VS引脚接到了半桥中点也就是电机端。当VS被外部电路拉高时电容负端抬高正端就自然高出Vcc一截这个高出来的电压正好用来给高边MOS的栅极供电。这个过程的专业说法叫“自举”核心思想就是利用电容电压不能突变的特性把电容上存储的电压作为高边栅极的悬浮电源。IR2104内部的电平移位电路再把这个悬浮信号转换成真实的栅极驱动信号从HO脚输出。所以高边MOS能正常开关完全依赖这个电容在低边导通期间“充电”积攒的能量。有人可能会问那如果高边一直导通、低边一直关断这个电容不是没机会充电了吗没错这就是自举电路的固有缺陷。你的PWM占空比不能长时间停留在100%否则自举电容的电压会逐渐掉到欠压阈值以下IR2104会关闭高边输出电机转速反而掉下来。这个坑后面我再细说。2.2 自举电容容值计算与占空比限制自举电容的容值不能拍脑袋随便选太小了高边栅极电量不够太大了充电恢复时间又太长影响高频工作。计算公式并不复杂C ≥ Qg / ΔV其中Qg是高边MOS的总栅极电荷这个参数看MOS管数据手册就能找到。ΔV是你允许自举电容在一次开关周期内的电压跌落值一般取0.3V到0.5V比较稳。比如我常用的IRLR7843这颗逻辑电平N-MOS在Vgs10V条件下Qg大概是40nC左右如果ΔV取0.5V那么C至少需要40nC/0.5V 80nF。但实际使用时我建议留10倍以上的余量所以0.82μF到1μF之间是合理区间我习惯直接选1μF的X7R陶瓷电容。耐压方面要留足裕量。自举电容承受的电压等于Vcc加上VS的浮动幅度12V系统里用25V耐压足够了如果是24V母线建议用50V耐压的。电容的ESR和ESL也要尽量小所以首选X7R或者C0G材质的陶瓷电容不要用普通的电解电容高频特性差得太远。还有一个占空比限制是很多人忽略的。因为低边MOS需要有一段时间保持导通才能给自举电容充电如果你的PWM占空比接近100%高边一直开着低边几乎没有导通时间自举电容得不到补充Vbs电压就会一路下跌。解决思路有三个一是软件上把最大占空比限制在95%左右我给电机做PWM调速时会刻意把占空比上限钳位二是把PWM频率调低一点让低边导通时间更长三是对调速范围要求极高的场景直接换用带电荷泵的驱动芯片或者独立隔离电源方案。3. 手把手搭建IR2104电机驱动电路3.1 整体电路结构和控制逻辑先看整体架构。一个完整的IR2104 H桥电机驱动需要两片IR2104分别驱动左右两个半桥。每个半桥由一颗高边N-MOSQ1/Q3和一颗低边N-MOSQ2/Q4组成半桥中点接到电机的两个接线端。电机属于感性负载所以通常在电机两端并联续流二极管或者在每个MOS管旁边加反并联的肖特基二极管给关断瞬间的反电动势一个泄放路径。控制逻辑上我推荐“PWM调速方向电平”这种经典组合。左侧半桥的IN_L接单片机定时器的PWM输出用来控制电机转速右侧半桥的IN_R接一个普通GPIO用来控制转向。IR2104的SD引脚是关断控制低电平有效平时拉高需要急停时拉低就能立刻关断整个桥。左侧半桥的IN脚电平为高时上管开下管关电流从左半桥流入电机右侧半桥的IN_R为低时右半桥下管常开电流从电机流出经过右半桥下管回到地电机就正转了。反转则把左右半桥的角色互换。这样设计的好处是控制逻辑简单清晰一个PWM通道就解决了调速问题不太需要用到定时器的互补输出功能。当然如果你希望更保险也可以把左右两个IN都接成互补PWM用高级定时器的死区生成功能来保证时序但对IR2104来说它自己已经有内置死区了外部再配不配互补PWM不影响安全性。3.2 元件选型与参数计算MOS管选型是整个方案的重中之重。我的建议是选逻辑电平MOS管这样即使在驱动电压因为自举压降只剩10V左右的情况下也能保证完全导通。以12V系统为例我常选IRLR7843或者同类管子Vds耐压30V留够电机反电动势余量Rds(on)大约3mΩQg约40nC。如果是24V系统Vds耐压至少要选60V以上比如IRLR3410这种100V管然后把IR2104的Vcc用稳压器降到12V到15V供电。栅极电阻Rg的选择也直接影响开关波形。Rg太小栅极充电电流大开关速度快但环路寄生电感容易引起振铃严重时会产生几伏的负压尖峰把栅极氧化层击穿。Rg太大开关速度变慢开关损耗增加管子发热。我实测下来12V系统的半桥驱动栅极电阻取10Ω到22Ω是甜点区间。如果你对EMI有要求可以在栅极电阻上并联一个小二极管实现开慢关快让开通稍缓、关断迅速。关于续流二极管这里有一个新手容易犯的错误只看MOS管体二极管能续流就不加外部二极管了。小电流场景确实可以靠体二极管但体二极管反向恢复时间慢在PWM高频动作时会产生额外损耗和尖峰。大电流场景建议在低边MOS的D-S之间并联SS34或SS54这类肖特基二极管正向压降小、恢复快能大幅减少发热和电压尖峰。IR2104的Vcc供电需要单独处理。12V系统可以直接从母线取12V但要在Vcc引脚附近加100nF陶瓷电容加10μF电解电容的组合去耦。24V系统则必须先把母线电压降到15V以下再供给Vcc可以用7815或一个DC-DC降压模块千万别直接把24V接到IR2104上超过20V的极限就直接烧芯片。3.3 原理图之外的布线要点画完原理图画PCB布局时有几个地方不注意还是会出问题。第一是自举电容的位置必须尽量靠近IR2104的VB和VS引脚走线越短越好长走线的寄生电感会削弱自举电容的高频响应能力。第二是栅极驱动回路要短IR2104的输出引脚到MOS管栅极之间的走线尽量宽且短最好不超过1厘米。大电流环路是另一个重点。从电源正极进来经过高边MOS、电机、低边MOS回到电源负极这个环路面积必须尽可能小。环路面积大等效电感就大MOS管关断瞬间的di/dt会在电感上感应出很高的尖峰电压击穿管子就是这么来的。我一般会在母线正负之间紧挨着H桥位置放一个低ESR的大容量电容比如470μF电解并联一个100nF薄膜电容吸收开关瞬间的能量。散热也不能忽视。MOS管的散热焊盘要铺铜并且打过孔连接到内层和背面的铜箔。如果电流持续超过5A建议直接在MOS管上贴小散热片。实测经验是同样的电路散热没做好连续跑10分钟后温度从70℃蹿到110℃做好散热设计后能稳在60℃左右。温度每升高25℃MOS管的可靠性就明显下降不要在这上面省钱。4. STM32控制逻辑与软件实现4.1 控制策略PWM调速、方向切换与死区保障硬件搭好了接下来是软件。控制一台直流电机本质就三件事调速、换向、刹车。调速用PWM调压实现。PWM频率的选取有讲究我建议放在10kHz到20kHz之间。低于10kHz电机运转时会有明显的嗞嗞噪声因为PWM及其谐波落入了人耳可听范围高于20kHzMOS管的开关损耗会显著增加而且对栅极驱动和布线的要求也更高。我常用的是16kHz到20kHz听不到声音开关损耗也在可控范围。方向切换的关键是要“先停后换”。如果电机正在高速正转你想瞬间切换到反转左半桥和右半桥的电流路径要立刻翻转电机电感中的电流不能突变会产生很大的冲击电流和反电动势尖峰轻则拉低电源电压重则击穿MOS管。正确的顺序是先把PWM输出降为0让电机自然滑行或者主动刹车一小段时间再切换方向引脚最后再恢复PWM输出。这段延时不需要很长20ms到50ms就够了但对保护功率级意义重大。刹车的实现方法有两种。一种是让PWM输出为0电机靠摩擦和惯性自然停这叫滑行停止。另一种是主动刹车把电机的两个接线端短接此时电机变成发电机反电动势产生制动力矩。用IR2104实现主动刹车可以将右侧半桥的下管保持导通左侧半桥的下管也导通相当于把电机两端都接到地。这个逻辑下左侧IN_L要高、右侧IN_R也要高因为IR2104是IN高时下管关、上管开不对这里要小心——IR2104的HO和LO是互补的IN为高时HO高、LO低即上管开下管关。那么要让下管导通IN应该是低电平。所以要两个半桥的IN都拉低两个下管都导通电机两端都接地实现能耗制动。我在实际项目中一般用这种短路制动减速效果明显又安全。死区的问题IR2104内部已经处理了但我在软件上仍然会做一个超时保护如果方向切换信号和PWM信号同时发生变化先处理方向延时50μs后再更新PWM占空比。这样即使硬件上有微小延迟也不会有瞬间的直通风险。此外SD引脚对应的GPIO初始状态一定要拉低让IR2104默认处于关断输出状态等到初始化完成后——比如延时200ms确认电源稳定——再把SD拉高使能输出。这个顺序能显著降低上电瞬间炸管的风险。4.2 初始化代码和时序处理以STM32F103为例我用定时器TIM3输出PWM频率20kHz。初始化思路是定时器时钟84MHz分频后计数频率2MHzARR设为99这样PWM频率是2MHz/10020kHz。代码如下// TIM3 PWM初始化通道1输出到PA6 TIM_HandleTypeDef htim3; TIM_OC_InitTypeDef sConfigOC {0}; htim3.Instance TIM3; htim3.Init.Prescaler 42 - 1; // 84MHz / 42 2MHz htim3.Init.CounterMode TIM_COUNTERMODE_UP; htim3.Init.Period 100 - 1; // 2MHz / 100 20kHz htim3.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(htim3); sConfigOC.OCMode TIM_OCMODE_PWM1; sConfigOC.Pulse 0; // 初始占空比0% sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(htim3, sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_Start(htim3, TIM_CHANNEL_1);调速时通过修改CCR值来更新占空比也就是__HAL_TIM_SET_COMPARE(htim3, TIM_CHANNEL_1, duty);。我把duty的范围限制在0到94也就是占空比上限94%给自举电容留出足够的充电时间。这里有一个小技巧如果目标转速比较高不要一次性把duty从0跳到94而是写一个软件斜坡每5ms增加一个步长。这样能有效避免启动瞬间的冲击电流对MOS管和电机都是保护。方向切换和刹车的代码逻辑也比较直接。定义两个GPIO一个接左侧半桥的IN_LPWM输出脚一个接右侧半桥的IN_R再一个接SD。换向函数大概长这样void motor_set_dir(uint8_t dir) { HAL_GPIO_WritePin(SD_GPIO_Port, SD_Pin, GPIO_PIN_RESET); // 先关断输出 __HAL_TIM_SET_COMPARE(htim3, TIM_CHANNEL_1, 0); // PWM归零 HAL_Delay(20); // 等待电流泄放 // 先切方向 if (dir DIR_FORWARD) { HAL_GPIO_WritePin(IN_R_GPIO_Port, IN_R_Pin, GPIO_PIN_RESET); } else if (dir DIR_BACKWARD) { HAL_GPIO_WritePin(IN_R_GPIO_Port, IN_R_Pin, GPIO_PIN_SET); } HAL_Delay(20); HAL_GPIO_WritePin(SD_GPIO_Port, SD_Pin, GPIO_PIN_SET); // 再恢复使能 }刹车就直接把PWM降为0把两个IN都拉低让两个下管导通实现电机两端短路制动。实测在12V、额定电流3A的减速电机上这种刹车方式能让电机在几百毫秒内停稳效果非常明显。5. 常见故障排查与实战经验5.1 烧MOS管原因速查我把这些年做电机驱动踩过和见过的坑整理成了一张速查表调试的时候可以对照排查。故障现象最常见原因排查思路上电瞬间炸管逻辑电源未先建立功率电先上电MOS栅极悬空受干扰误导通先供Vcc再供母线IN/SD加下拉电阻SD上电默认拉低单管发烫严重栅极电阻过大或PWM频率过高开关损耗太大测量Vgs波形上升沿调整Rg或降低开关频率高边MOS无法完全导通转速上不去自举电容容值太小或占空比接近100%增大自举电容限制最大占空比到94%左右输出电压波形有严重振铃栅极驱动回路寄生电感大Rg偏小优化布局缩短走线Rg先串10Ω电机运转时偶发停机母线电压跌落导致Vcc欠压或过流保护误触发检查母线电容容量检查电源带动能力换向瞬间炸管未先停PWM就切换方向冲击电流过大软件上严格执行“PWM归零-延时-换向-延时-恢复PWM”的时序上电顺序是很多新手第一个栽跟头的地方。我见过一个同学的板子逻辑电源和功率电源用一个开关同时接通结果每次上电MOS管都炸。后来检查发现是功率电的上升沿更快在逻辑还没稳定的时候IR2104的输入引脚表现为高阻栅极驱动输出受到干扰两个半桥同时导通直通电流瞬间就把管子烧了。解决办法很简单SD引脚和IN引脚都加100kΩ下拉电阻到地确保上电期间IR2104的输出保持关断状态。另外有一个容易忽略的问题是IR2104逻辑输入信号的边沿质量。如果IN脚的信号上升沿特别缓慢比如前面串了RC滤波就会让IR2104内部逻辑在高低电平之间反复切换输出级可能会出现短暂的上下管微导通状态。单片机GPIO配置成推挽输出时边沿一般没问题但如果是从光耦或者长线传过来的信号一定要确认边沿够陡必要时加施密特触发器整形。5.2 上电顺序、测试方法和示波器检查技巧调试IR2104驱动板我强烈建议分步上电。第一步先接通控制板和IR2104的Vcc用万用表确认Vcc在10V到20V之间然后测量VB和VS之间的电压正常应该在8V以上如果这个电压接近0说明自举电容没充上电先查电容有没有焊反。第二步再把功率母线接上观察空载情况下电机端的波形。第三步才接电机负载。示波器是排查电机驱动的神器但用法有讲究。我一般先把探头放在半桥中点看电机端的方波波形是否正常——正常应该是幅值接近母线电压的PWM方波高低电平干净利落。然后看HO和LO的波形重点观察两者之间有没有死区间隙。IR2104内置死区时间正常情况上下管波形应该有几百纳秒的空档如果看到上下管波形有交叠说明直通风险存在要立即停机排查。还有一个实用的技巧用示波器观察低边MOS的Vds波形。当电机堵转或过流时Vds的波形会出现明显异常导通期间压降增大或者出现高频振荡。这个信号能帮助你判断是不是真的过流还是驱动波形本来就不好导致管子没有完全导通。我调试时习惯把示波器探头挂在低边MOS的D和S之间用DC耦合触发模式设为Normal这样能捕捉到很多偶发性的异常波形。功耗和发热的估算可以通过计算来预判。以一对应的12V、3A系统为例MOS管的导通损耗是I²乘以Rds(on)3A × 3A × 0.003Ω大约27mW非常小。但开关损耗就大了每次开关的瞬时功率接近Vds × Id如果开关过程持续200ns一个周期二次开关20kHz下开关损耗可能达到瓦级。所以当MOS管烫手时第一反应不应该是加散热片而是先用示波器看开关波形确认开关时间是否在合理范围。很多时候把栅极电阻从100Ω改到10Ω温度能直接降一半以上。6. 写在最后关于这套方案的一些体会用IR2104搭电机驱动我自己从画板到调试走过不少弯路。最大的教训是硬件设计不能只看原理图通不通要时刻想着电流从哪里走、回到哪里去。H桥的工作电流很大电源回路和栅极回路的电感都会影响MOS管的生存状态。还有一个体会是调试顺序的重要性如果你每次上电前都习惯先看一遍SD引脚的电平状态先把芯片置于关断输出状态再检查功率部分能避免至少一半的烧管事故。另外我多说一句关于自举电路的心得。很多人觉得自举只是“加个电容就能用”的辅助功能实际上它对占空比范围和PWM频率是有明确约束的。如果你做的是高速电机控制或者需要长时间保持100%占空比输出IR2104这种自举方案就不是最优选择了可以考虑用隔离电源供电的驱动方案。但如果你做的是常见的直流电机调速、机器人小车、泵阀控制这类应用IR2104这套方案成熟、便宜、稳定值得作为首选方案反复使用。希望这些经验能帮你少烧几颗管子一次把驱动板调通。
返回列表