在 MOS 桥(如 H 桥、半桥)驱动中,死区控制是核心技术之一,用于防止同一桥臂的上下两个 MOS 管因开关延迟同时导通而造成电源短路。
STM32 的高级定时器(TIM1、TIM8) 内置了硬件死区生成功能,可精确控制互补 PWM 信号的死区时间,比软件延时更可靠。
一、死区控制原理
MOS 桥同一桥臂的上下管(如 Q1 和 Q2)需要互补导通:
- 当 Q1 导通时,Q2 必须关断;Q2 导通时,Q1 必须关断。
- 由于 MOS 管存在开通 / 关断延迟(如米勒效应),直接切换可能导致短暂的 “共态导通”,造成电源短路。
死区时间:在 Q1 关断后,延迟一段时间再开通 Q2(反之亦然),这段延迟即为死区时间(通常几百 ns 到几 us,根据 MOS 管参数调整)。
STM32 高级定时器通过互补 PWM 输出和死区寄存器实现硬件级死区控制,无需软件干预。
二、硬件基础
-
核心组件:
- STM32 高级定时器(如 TIM1,支持互补输出和死区)
- MOS 桥驱动电路(如半桥或 H 桥,含上下管驱动芯片)
- MOS 管(需匹配驱动电压和电流)
-
连接关系:
- 定时器主通道(如 TIM1_CH1)→ 上管驱动信号
- 定时器互补通道(如 TIM1_CH1N)→ 下管驱动信号
- 驱动芯片需隔离(如光耦或专用隔离驱动 IC),避免高压干扰 MCU
三、软件实现核心(基于 HAL 库)
1. 高级定时器配置要点
- 启用互补 PWM 输出(主通道 + 互补通道)
- 配置死区时间(通过 BDTR 寄存器的 DTG 位)
- 配置 PWM 模式(通常用 PWM 模式 1)
- 使能主输出(MOE 位,控制互补通道输出)
2. 死区时间计算
死区时间由定时器时钟频率和 BDTR 寄存器的DTG[7:0]位决定,公式如下:
死区时间 = DTG值 × 时间单位
时间单位与 DTG 的高 3 位(DTG[7:5])相关,对应关系:
| DTG[7:5] | 时间单位 | 适用 STM32 系列(以 72MHz 为例) |
|---|---|---|
| 000 | Tck_int | 13.89ns(72MHz 时,1/72e6) |
| 001 | 2×Tck_int | 27.78ns |
| 010 | 4×Tck_int | 55.56ns |
| 011 | 8×Tck_int | 111.11ns |
| 100 | 16×Tck_int | 222.22ns |
| 101 | 32×Tck_int | 444.44ns |
| 110 | 64×Tck_int | 888.89ns |
| 111 | 128×Tck_int | 1.778us |
例如:DTG=0x10(二进制 00010000),DTG[7:5]=000,时间单位 = 13.89ns,死区时间 = 16×13.89ns≈222ns。
四、代码实现(以 TIM1 为例)
1. 头文件(mos_bridge.h)
#ifndef __MOS_BRIDGE_H
#define __MOS_BRIDGE_H
#include "stm32f1xx_hal.h"
// 函数声明
void MOS_Bridge_Init(void); // 初始化MOS桥控制(含死区)
void MOS_Bridge_SetPWM(uint16_t duty); // 设置PWM占空比(0~1000)
void MOS_Bridge_Enable(void); // 使能输出
void MOS_Bridge_Disable(void); // 禁用输出
#endif
2. 源文件(mos_bridge.c)
#include "mos_bridge.h"
TIM_HandleTypeDef htim1; // TIM1句柄
// 高级定时器TIM1初始化(含死区配置)
static void MX_TIM1_Init(void) {
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
htim1.Instance = TIM1;
htim1.Init.Prescaler = 0; // 不分频,时钟=72MHz
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 999; // 周期=1000,PWM频率=72MHz/(1000)=72KHz
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim1) != HAL_OK) {
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK) {
Error_Handler();
}
if (HAL_TIM_PWM_Init(&htim1) != HAL_OK) {
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) {
Error_Handler();
}
// 配置主通道和互补通道为PWM模式1
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0; // 初始占空比0
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;
// 配置主通道(CH1)
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) {
Error_Handler();
}
// 配置死区时间和刹车功能
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.DeadTime = 0x10; // 死区时间=16×13.89ns≈222ns(根据需要调整)
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; // 禁用刹车(如需保护可使能)
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK) {
Error_Handler();
}
HAL_TIM_MspPostInit(&htim1); // 配置GPIO
}
// GPIO初始化(互补PWM输出引脚)
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(timHandle->Instance==TIM1) {
__HAL_RCC_GPIOA_CLK_ENABLE();
// TIM1_CH1 -> PA8(上管驱动)
// TIM1_CH1N -> PA7(下管驱动)
GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽输出
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
}
// 初始化MOS桥控制
void MOS_Bridge_Init(void) {
MX_TIM1_Init();
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); // 启动主通道PWM
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1); // 启动互补通道PWM
MOS_Bridge_Disable(); // 初始禁用输出,防止误触发
}
// 设置PWM占空比(0~1000对应0~100%)
void MOS_Bridge_SetPWM(uint16_t duty) {
if (duty > 1000) duty = 1000;
TIM1->CCR1 = duty; // 直接设置比较值(主通道和互补通道自动关联)
}
// 使能输出(MOE位控制)
void MOS_Bridge_Enable(void) {
TIM1->BDTR |= TIM_BDTR_MOE; // 主输出使能
}
// 禁用输出
void MOS_Bridge_Disable(void) {
TIM1->BDTR &= ~TIM_BDTR_MOE; // 主输出禁用
}
五、关键注意事项
-
死区时间选择:
需根据 MOS 管的turn-off时间(关断延迟)设置,确保上管完全关断后下管才开通。例如,若 MOS 管关断延迟为 500ns,死区时间应设置为 600ns 以上。 -
输出极性:
根据驱动电路设计(如 MOS 管是高电平导通还是低电平导通),通过OCPolarity和OCNPolarity调整 PWM 极性。 -
故障保护:
高级定时器支持刹车功能(Break),可接入过流、过压检测信号,触发时自动关闭所有输出(需配置BreakState和相关引脚)。 -
电源隔离:
MOS 桥通常工作在高压大电流环境,需通过隔离驱动芯片(如 SI8233、TLP250)隔离 MCU 与驱动电路,避免干扰和损坏。 -
PWM 频率:
频率过高会增加开关损耗,过低会导致电流纹波大,通常选择 10KHz~100KHz(根据 MOS 管和电感参数调整)。
六、应用示例
#include "mos_bridge.h"
int main(void) {
HAL_Init();
SystemClock_Config(); // 配置系统时钟为72MHz
MOS_Bridge_Init(); // 初始化MOS桥控制
MOS_Bridge_Enable(); // 使能输出
while (1) {
// 占空比从10%渐变到90%
for (uint16_t duty = 100; duty <= 900; duty += 50) {
MOS_Bridge_SetPWM(duty);
HAL_Delay(100);
}
// 占空比从90%渐变到10%
for (uint16_t duty = 900; duty >= 100; duty -= 50) {
MOS_Bridge_SetPWM(duty);
HAL_Delay(100);
}
}
}
通过 STM32 高级定时器的硬件死区功能,可实现高精度、高可靠性的 MOS 桥控制,广泛应用于电机驱动、逆变器、DC-DC 转换器等场景。核心是根据硬件特性合理配置死区时间,避免共态导通。
1万+

被折叠的 条评论
为什么被折叠?



