You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32 TIM1操作CCER寄存器后同相与互补PWM输出相同致IGBT短路问题

STM32F030C8T6三相BLDC驱动问题:同相/互补PWM波形一致导致IGBT短路

我使用STM32F030C8T6,通过霍尔传感器结合死区功能控制三相BLDC电机,尝试根据霍尔信号使能对应相的高端(同相)和低端(互补)PWM。但运行后发现同相和互补PWM信号完全相同(占空比80%、频率一致),直接导致IGBT短路。预期波形应为高端80%占空比的PWM,低端为互补的约20%占空比信号。

现有代码

set_phase函数

void set_phase(uint8_t hall)
{
    // Turn off all channels first
//    __HAL_TIM_MOE_DISABLE(&htim1);
    TIM1->CCER &= ~(TIM_CCER_CC1E | TIM_CCER_CC1NE |
                        TIM_CCER_CC2E | TIM_CCER_CC2NE |
                        TIM_CCER_CC3E | TIM_CCER_CC3NE);

    switch(hall)
    {
        case 0b001:  // C+, B-
            TIM1->CCER = TIM_CCER_CC3E | TIM_CCER_CC2NE;
            break;
        case 0b101:  // A+, B-
            TIM1->CCER = TIM_CCER_CC1E | TIM_CCER_CC2NE;
            break;
        case 0b100:  // A+, C-
            TIM1->CCER = TIM_CCER_CC1E | TIM_CCER_CC3NE;
            break;
        case 0b110:  // B+, C-
            TIM1->CCER = TIM_CCER_CC2E | TIM_CCER_CC3NE;
            break;
        case 0b010:  // B+, A-
            TIM1->CCER = TIM_CCER_CC2E | TIM_CCER_CC1NE;
            break;
        case 0b011:  // C+, A-
            TIM1->CCER = TIM_CCER_CC3E | TIM_CCER_CC1NE;
            break;
        default:
            TIM1->CCER = 0;  // Brake
            break;
    }

    __HAL_TIM_MOE_ENABLE(&htim1);  // Re-enable outputs
}

TIM1初始化代码

static void MX_TIM1_Init(void)
{

  /* USER CODE BEGIN TIM1_Init 0 */

  /* USER CODE END TIM1_Init 0 */

  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};

  /* USER CODE BEGIN TIM1_Init 1 */

  /* USER CODE END TIM1_Init 1 */
  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 0;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 65535;
  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();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 32767;
  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;
  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  {
    Error_Handler();
  }
  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  sBreakDeadTimeConfig.DeadTime = 255;
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_ENABLE;
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_ENABLE;
  if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM1_Init 2 */

  /* USER CODE END TIM1_Init 2 */
  HAL_TIM_MspPostInit(&htim1);

}

问题根源与修复方案

1. 互补通道极性配置错误

初始化时OCNPolarity = TIM_OCNPOLARITY_HIGH会让互补通道与主通道极性完全相同,无法形成互补波形。需修改为:

sConfigOC.OCNPolarity = TIM_OCNPOLARITY_LOW;

这样主通道输出高电平时,互补通道输出低电平,配合死区时间实现上下桥臂互锁。

2. CCER寄存器操作方式错误

直接用TIM1->CCER = ...会覆盖寄存器所有位,可能清除其他必要配置。改为|=置位目标位:

void set_phase(uint8_t hall)
{
    // 先关闭所有通道
    TIM1->CCER &= ~(TIM_CCER_CC1E | TIM_CCER_CC1NE |
                    TIM_CCER_CC2E | TIM_CCER_CC2NE |
                    TIM_CCER_CC3E | TIM_CCER_CC3NE);

    switch(hall)
    {
        case 0b001:  // C+, B-
            TIM1->CCER |= TIM_CCER_CC3E | TIM_CCER_CC2NE;
            break;
        case 0b101:  // A+, B-
            TIM1->CCER |= TIM_CCER_CC1E | TIM_CCER_CC2NE;
            break;
        case 0b100:  // A+, C-
            TIM1->CCER |= TIM_CCER_CC1E | TIM_CCER_CC3NE;
            break;
        case 0b110:  // B+, C-
            TIM1->CCER |= TIM_CCER_CC2E | TIM_CCER_CC3NE;
            break;
        case 0b010:  // B+, A-
            TIM1->CCER |= TIM_CCER_CC2E | TIM_CCER_CC1NE;
            break;
        case 0b011:  // C+, A-
            TIM1->CCER |= TIM_CCER_CC3E | TIM_CCER_CC1NE;
            break;
        default:
            // 保持所有通道关闭实现刹车
            break;
    }

    __HAL_TIM_MOE_ENABLE(&htim1);  // 重新启用输出
}

3. 调整PWM脉冲值匹配预期占空比

当前脉冲值32767对应50%占空比,要实现80%占空比需修改为:

sConfigOC.Pulse = 52428;  // 65535 * 0.8 ≈ 52428

4. 验证死区时间有效性

当前设置的DeadTime = 255在48MHz时钟下对应足够的死区时间,可根据IGBT实际参数微调,确保上下桥臂不会同时导通。

内容的提问来源于stack exchange,提问作者Ali Mustafa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:09:49