2. PWM中心对齐模式配置

任务目标

在单电阻FOC系统中,电流采样窗口必须避开PWM开关边沿的振荡区间。本案例完成STM32定时器PWM中心对齐模式配置,使计数器向上/向下计数,PWM输出在周期中心对称,确保ADC触发点位于PWM周期中点,避开开关噪声。

环境依赖

  • 硬件:STM32F103(或同系列)开发板 + 电机驱动板(单电阻采样电路)
  • 软件:STM32CubeMX生成初始化代码 + Keil/IAR/STM32CubeIDE
  • 定时器:TIM1(高级定时器,带互补输出和刹车功能)

关键完整代码


/* TIM1 PWM中心对齐模式配置(使用STM32 HAL库) */
void MX_TIM1_Init(void)
{
    TIM_OC_InitTypeDef sConfigOC = {0};
    TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};

    htim1.Instance = TIM1;
    htim1.Init.Prescaler = 72 - 1;                 // 72MHz/72 = 1MHz计数时钟
    htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED1;  // 中心对齐模式1
    htim1.Init.Period = 1000 - 1;                  // PWM频率 = 1MHz/1000 = 1kHz
    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 = 500;                          // 50%占空比
    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);

    sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
    sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
    sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
    sBreakDeadTimeConfig.DeadTime = 0;              // 本例不插入死区
    sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
    sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
    sBreakDeadTimeConfig.BreakFilter = 0;
    sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
    HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig);

    HAL_TIM_MspPostInit(&htim1);
}

/* ADC触发配置:使用TIM1_TRGO,在计数器上溢/下溢时触发 */
void ADC_Trigger_Config(void)
{
    TIM_MasterConfigTypeDef sMasterConfig = {0};
    sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;  // 上溢/下溢均触发
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
    HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig);
}

/* 启动PWM输出 */
void PWM_Start(void)
{
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
    HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);   // 使能互补输出
}

运行与验证

  1. 在STM32CubeMX中配置TIM1时钟源为内部时钟(72MHz),按上述参数设置预分频、周期和中心对齐模式。
  2. 将ADC注入或规则通道触发源设为TIM1_TRGO,采样时间设为最大(如239.5周期)以避开开关噪声。
  3. 编译烧录后,用示波器测量:
  • CH1(PWM输出)应为1kHz、50%占空比、波形关于周期中点对称的脉冲。
  • CH2(ADC触发信号,可测TIM1_TRGO引脚)的触发脉冲应位于PWM周期的中心点(即计数器上溢/下溢时刻)。

通过条件:示波器观察到PWM波形中心对称,且ADC触发脉冲与PWM边沿之间的时间间隔大于开关振荡衰减时间(通常>1μs),即采样点不在开关切换瞬间。

关键说明

  • 中心对齐模式1(TIM_COUNTERMODE_CENTERALIGNED1)在计数器向下计数时置1、向上计数时置0,适合单电阻采样中需要精确控制采样点位于PWM周期中心的应用。
  • 若使用中心对齐模式2或3,PWM输出极性翻转时刻不同,需根据实际采样窗口需求选择。
  • ADC触发使用TIM_TRGO_UPDATE,在计数器上溢和下溢时均产生触发事件,此时PWM输出处于稳定电平(非边沿),采样窗口避开开关噪声。