3. 三相逆变器PWM生成
任务目标
使用MCU高级定时器生成六路互补PWM(三对),每对输出之间插入死区时间,用于驱动三相两电平逆变器的六个开关管。以STM32F407的TIM1为例,输出中心对齐的互补PWM,频率20kHz,死区1µs。
硬件连接与依赖
- MCU:STM32F407(TIM1为高级定时器,自带死区发生器)
- 逆变桥:六个IGBT/MOSFET,上管接TIM1_CH1/2/3,下管接对应互补通道CH1N/2N/3N
- 依赖:STM32 HAL库(仅使用定时器相关API)
核心实现
// 定时器句柄
TIM_HandleTypeDef htim1;
// 六路互补PWM初始化(中心对齐,带死区)
void MX_TIM1_Init(void)
{
TIM_OC_InitTypeDef sConfigOC = {0};
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
htim1.Instance = TIM1;
htim1.Init.Prescaler = 84 - 1; // 84MHz/84 = 1MHz计数时钟
htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED1;
htim1.Init.Period = 50 - 1; // 1MHz/50 = 20kHz PWM
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
HAL_TIM_PWM_Init(&htim1);
// 三对互补通道配置
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 25; // 50%占空比(中心对齐时Pulse=Period/2)
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_1);
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2);
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3);
// 死区配置:1µs @ 1MHz计数时钟 = 1个计数周期
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.DeadTime = 1; // 死区时间 = 1/1MHz = 1µs
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.BreakFilter = 0;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig);
}
// 启动三对互补PWM输出
void Start_PWM_Output(void)
{
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
// 启动互补通道(必须同时启动主通道和互补通道)
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_3);
}
// 设置占空比(0~100%)
void Set_Duty(uint8_t ch, uint16_t duty_percent)
{
uint32_t pulse = (htim1.Init.Period + 1) * duty_percent / 100;
__HAL_TIM_SET_COMPARE(&htim1, ch, pulse);
}
运行与验证
- 初始化调用:在
main()中依次调用MX_TIM1_Init()和Start_PWM_Output()。 - 引脚映射:将TIM1_CH1/2/3及CH1N/2N/3N复用为AF1,分别连接到逆变桥上下管栅极驱动输入端。
- 验证方法:用示波器同时测量CH1与CH1N引脚,观察:
- 两路波形互补(高电平不重叠);
- 上升沿之间间隔约1µs(死区时间);
- PWM频率20kHz,占空比50%。
通过条件:示波器显示CH1与CH1N之间存在1µs±0.2µs的空白间隔,且频率为20kHz±1%,即判定死区插入正确。
关键说明
- 中心对齐模式(CENTERALIGNED1)下,计数器先增后减,PWM在计数到Pulse时翻转,适合FOC应用的低谐波需求。
- 死区时间由
DeadTime字段直接决定,单位为计数时钟周期。当前配置1MHz计数时钟,1个周期即1µs。 - 必须同时调用
HAL_TIM_PWM_Start和HAL_TIMEx_PWMN_Start,否则互补通道无输出。 - 修改占空比时调用
Set_Duty(),传入通道号(TIM_CHANNEL_1/2/3)和百分比值。