简单H桥电机驱动电路分析及其隔离设计
出处:网络整理 发布于:2026-07-10 15:43:44 | 33 次阅读

H 桥是一种结构相对简单却应用广泛的电路,在电子设备中发挥着重要作用。它主要由四个可独立控制的 MOSFET 构成,这些 MOSFET 作为开关元件,用于引导电流流经负载,通常该负载为电感负载,比如电机。
MOSFET 中的寄生二极管与外部续流二极管在 N 沟道 MOSFET 里,源极和漏极属于 N 型区域,基区则是 P 型材料,这就形成了两个 PN 结。由于源极和基区通常短接,源极 - 基区的 PN 结不起作用,而漏极 - 基区的 PN 结便形成了寄生二极管,这种现象在多数功率 MOSFET 中都存在,所以在一些仿真软件中,MOSFET 的拓扑符号后会有反向并联的二极管标识。
电机作为典型的感性负载,当电流变化时会产生反电动势。在 H 桥中,MOSFET 切换状态时,电流变化会使电感负载产生高电压尖峰,该尖峰可能反向施加在 MOSFET 上,导致其损坏或使电路操作不稳定。
为保护 MOSFET 和其他电路元件,通常会在每个 MOSFET 的漏极和源极之间并联一个续流二极管。其作用主要体现在以下几个方面:
提供电流续流路径:当 MOSFET 关闭时,感性负载的电流无法立刻停止,续流二极管为电流提供通路,避免因电流中断产生高电压尖峰,保护电路元件。
保护 MOSFET:它可以限制感性负载产生的反电动势,防止电压尖峰直接加在 MOSFET 上,避免其因过压损坏。
稳定电路操作:在高频开关操作中,能减少电路中的电磁干扰(EMI)和噪声,提高电路稳定性和可靠性。
虽然 MOSFET 自带的寄生二极管在某些情况下能起到续流作用,比如开关断开瞬间为电感性负载提供电流续流路径,但由于其导通电压较高、反向恢复时间较长,特性不如专门设计的续流二极管(如肖特基二极管),所以在实际电路设计中通常不能完全替代续流二极管。若对续流二极管有严格要求,会在电路中另外并联性能更好的二极管。
电流衰减模式电机作为感性负载,电流不能突变。要使电机减速,断开电机两端电压时,电压瞬间衰减至零,根据电磁感应定律,电机会产生反向电动势,电压变化率大时可能损坏 MOSFET。因此,让电机停下除断开供电外,还需形成续流回路释放电机能量,这就是续流二极管的作用。
在减速时的电流再生过程中,H 桥通常有两种工作模式:
快速衰减(Fast Decay Mode):此模式下四个 MOSFET 全部关断,反电动势带来的反向感应电流通过 Q2、Q3 的寄生二极管(续流二极管)流动,感应电流方向与电源电压方向相反,线圈电流迅速衰减。为避免同一侧上下臂 MOSFET 同时导通造成击穿,需添加死区时间,在此期间允许激励 FET 开关切换到关闭状态,电感负载的电流由寄生二极管或外部续流肖特基二极管承载。快速衰减模式下电流能迅速降为零,但电机速度因惯性逐渐减小,呈现 “滑动” 式减速。
慢速衰减(Slow Decay Mode):该模式下 Q1、Q3 关断,Q2、Q4 导通,感应电流以循环方式流经 Q2 和 Q4 并降至零,电流在流经电感阻抗和两个 FET 的导通阻抗时以热量形式耗散。虽然通常描述为两个低侧 FET 开关打开、两个高侧 FET 开关关闭,但也可通过启用两个高侧 FET 开关、禁用两个低侧 FET 开关实现相同效果,即衰减回路可以是上臂或下臂,部分 IC 支持通过输入信号配置。在直流电机上,慢速衰减模式会使电机绕组短路,形成反电动势短路,让转子快速停止旋转。
此外,还有混合衰减(Mixed Decay Mode),其电流衰减至零的速度介于快速衰减和慢速衰减之间。实现方法是协调 FET 开关的开 / 关时间,在固定时间内处于快速衰减模式,剩余时间处于慢速衰减模式,系统保持在两种模式中的时间比例称为混合衰减百分比。混合衰减对步进电机驱动,尤其是微步进驱动很有意义,例如通常用正弦波(电流曲线)驱动步进电机绕组,也可使用三角形和菱形。
MOSFET 高低端驱动与自举电路在 H 桥电路中,MOSFET 分为高端(High - Side)和低端(Low - Side)两部分。高端 MOSFET 连接在电源和负载之间,低端 MOSFET 连接在负载和地之间。MOSFET 导通需满足 VGS > VGS (th)。
自举电路是常用解决方案,用于生成高端 MOSFET 所需的高电压驱动信号,通常包括一个二极管和一个电容器(自举电容),配合驱动芯片工作。以半桥为例,当 Q2 导通时,Q1 的源极被拉到地电位(低电平),自举电容 C1 通过二极管充电(所加电压 V 一般由 LDO 架构电源输出),此时自举电容电压接近电源电压 V。当 Q2 断开时,SW 位置电位不再为地电位,自举电容 C1 两端储存电压为 V,A 点电压变为 VSW + V,可轻松驱动高端 MOSFET,此时由 C1 提供上管驱动阶段所需的所有电流,自举二极管(一般为肖特基二极管)处于反向截止状态,将自举压降限制在自举回路内,防止其回流至上一级损坏电路。
自举电容持续放电会使高端 MOSFET 的栅极对地电压持续减小,直至等于 V。要让高端 MOSFET 持续导通,需让自举电容不断充放电,或增加自举电容容量、更换 IC,或在设计中避免持续导通需求。由于 MOSFET 的特性,自举电路在增加栅源电压的同时,还能减小 MOSFET 的导通电阻,减少发热损耗。
H 桥驱动控制对 MOSFET 栅极引入 PWM 控制,可调节电机转动方向和速度。PWM 的占空比对应电机转速,占空比越大,平均等效输出电压越大,转速越快。通常 PWM 频率在 10Khz 至 20KHz 之间,频率太低电机转速过低,易出现高噪声或高频机械振动;频率太高,MOSFET 开关损耗影响变大,降低系统效率。
根据不同桥臂的 PWM 控制方式,大致分为三种:
受限单极模式:电机电枢驱动电压极性单一,控制电路简单,但电机不能刹车、进行能耗制动,负载超过设定速度时不能提供向力矩,调速静差大,调速性能和稳定性差。PWM 高电平时,电机两端分别为 VM 和 GND,有电流流过产生扭矩转动;PWM 低电平时,电机两端未导通,无电流,电机转动难以控制。
单极模式:引入互补 PWM 波(PWMN),一般由 MCU 高级定时器生成,如 STM32F429 的 TIM1、TIM8。相比受限单极模式,Q1 信号为低电平时,由互补 PWM 对 Q2 施加高电平信号使其打开,Q2、电机、Q4 形成闭合回路,电机仍有电流,能产生磁场和力矩控制转动。该模式启动快,能加速、刹车、能耗制动、能量反馈,调速性能较好,负载超速时能提供反向力矩。
双极模式:电枢电压极性正负交替。PWM1、PWM2 由定时器输出,PW1N、PW2N 为其互补 PWM 通道,PWM1 和 PWM2 周期相同、占空比相同、极性相反,使对角线上的两个 MOSFET 同时导通和关断。电机转动方向由 PWM 和 PWM1 共同决定,若 A 的 PWM 占空比高于 50%,电流从左至右;低于 50%,则从右至左。该模式继承单极模式优点,速度接近 0 时也能提供一定力矩,加减速性能更好,正反转性能优于单极模式,但控制更复杂,功耗大。
死区时间
死区时间(Dead Time)是切换两个互补的 MOSFET 时,为避免同时导通导致短路或直通故障,在关断一个 MOSFET 和导通另一个 MOSFET 之间插入的延迟时间。它提供缓冲,确保一个 MOSFET 完全关闭后另一个才开始导通。
MOSFET 的导通和关断需要时间,包括栅极充电和放电时间,不同类型的 MOSFET 开关速度不同。死区时间设置太短,可能无法覆盖 MOSFET 的开关时间,导致直通故障;设置太长,会降低电路效率,因为死区时间内两对互补的 MOSFET 都关闭,无电流通过负载,造成功率损失和电机或负载性能下降。
MOSFET 的开关速度与栅极电荷(Qgs、Qgd)和栅极驱动电流有关,死区时间应与这些参数匹配。较低的栅极电荷通常意味着更快的开关速度,可使用更短的死区时间。高侧和低侧 MOSFET 的不同 Rds (on) 值也会影响开关速度,设计死区时间时需考虑。一些驱动 IC 会根据 MOSFET 的特性自动调整死区时间,以优化性能和保护 MOSFET。
程序代码(以 STM32 HAL 库为例)
以 IRS21867S 方案为例,MCU 为 STM32F1,PWM 由 TIM1 通道 3 生成,PWM - N 由 TIM1 通道 3 的互补通道生成;PWM1 由 TIM1 通道 2 生成,PWM1 - N 由 TIM1 通道 2 的互补通道生成。PWM 信号从对应的复用 GPIO 管脚连接至驱动 IC。
根据真值表,可通过修改对应的 TIM 通道的 PWM 极性来配置电机工作模式,还可自定义工作模式函数。需要注意的是,在受限单极模式和单极模式下,修改 Set_Motor_Mode () 函数后,要根据表格修改对应桥臂 MOSFET 的栅极信号,保证其处于恒导通状态,为电枢电流提供回路。
// 电机工作模式设置(定时器状态)
void Set_Motor_Mode(uint8_t mode)
{
switch (mode)
{
case 0: // 受限单极模式(正转)
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_2);
HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_3);
HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_3);
break;
case 1: // 受限单极模式(反转)
HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2);
HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_3);
break;
case 2: // 单极模式(正转)
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);
HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_3);
HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_3);
break;
case 3: // 单极模式(反转)
HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2);
HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_3);
break;
case 4: // 双极模式
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_3);
break;
case 5: // 关闭输出
HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2);
HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_2);
HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_3);
HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_3);
break;
default:
// 处理非法模式
break;
}
}
配置TIM1:
void MX_TIM1_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig={0};
TIM_OC_InitTypeDef sConfigOC = {0};
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig={0};
htim1.Instance= TIM1;
htim1.Init.Prescaler= (uint32_t)((SystemCoreClock / 2) / 20000) - 1;//预分频寄存器写入
htim1.Init.CounterMode= TIM_COUNTERMODE_UP;
htim1.Init.Period=1000 - 1;// 自动重载寄存器写入
htim1.Init.ClockDivision= TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter=0;
htim1.Init.AutoReloadPreload= TIM_AUTORELOAD_PRELOAD_DISABLE;
HAL_TIM_Base_Init(&htim1);
sClockSourceConfig.ClockSource= TIM_CLOCKSOURCE_INTERNAL;
HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig);
HAL_TIM_PWM_Init(&htim1);
sConfigOC.OCMode= TIM_OCMODE_PWM1;
sConfigOC.Pulse=500;// 初始占空比50%
sConfigOC.OCPolarity= TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity= TIM_OCNPOLARITY_HIGH;
sConfigOC.OCFastMode= TIM_OCFAST_DISABLE;
sConfigOC.OCIdleState= TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState= TIM_OCNIDLESTATE_RESET;
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2);
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3);
//死区设置
sBreakDeadTimeConfig.OffStateRunMode= TIM_OSSR_DISABLE;
sBreakDeadTimeConfig.OffStateIDLEMode= TIM_OSSI_DISABLE;
sBreakDeadTimeConfig.LockLevel= TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.DeadTime=100;
sBreakDeadTimeConfig.BreakState= TIM_BREAK_DISABLE;
sBreakDeadTimeConfig.BreakPolarity= TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.AutomaticOutput= TIM_AUTOMATICOUTPUT_DISABLE;
HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig);
}
void set_pwm(int speed)
{
// 处理速度的正负,正值表示正转,负值表示反转
if (speed > 0)
{
Set_Motor_Mode(2); // 正转
// *******此处要记得将Q4栅极信号拉高*******
}
else if (speed < 0)
{
Set_Motor_Mode(3); // 反转
// *******此处要记得将Q3栅极信号拉高*******
speed = -speed; // 将速度值取绝对值
}
else
{
Set_Motor_Mode(5); // 停止
return;
}
// 限制最低速度,确保电机能够启动
int min_speed = 10; // 定义最低速度
if (speed < min_speed)
{
speed = min_speed;
}
// 将速度值映射到PWM占空比范围
speed = 700 - speed; // 这里700是基准值,越接近700,PWM占空比越小
TIM1->CCR2 = speed; // 设置TIM1通道2的PWM占空比
TIM1->CCR3 = speed; // 设置TIM1通道3的PWM占空比
}
主函数:
int main(void)
{
HAL_Init();
SystemClock_Config();
// 初始化TIM1
MX_TIM1_Init();
// 选择电机的工作模式
Set_Motor_Mode();
// 主循环
while (1)
{
// 在这里可以通过修改占空比来控制电机速度
set_pwm();
}
}
以上是一个最简单的能让电机在开环下转起来的代码。如果要实现动态控制、动态调速,需要加入控制环节。
版权与免责声明
凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。
本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。
如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。














