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
相关产品推荐
相关产品推荐

