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);
}

运行与验证

  1. 初始化调用:在main()中依次调用MX_TIM1_Init()和Start_PWM_Output()。
  2. 引脚映射:将TIM1_CH1/2/3及CH1N/2N/3N复用为AF1,分别连接到逆变桥上下管栅极驱动输入端。
  3. 验证方法:用示波器同时测量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)和百分比值。