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); // 使能互补输出
}
运行与验证
- 在STM32CubeMX中配置TIM1时钟源为内部时钟(72MHz),按上述参数设置预分频、周期和中心对齐模式。
- 将ADC注入或规则通道触发源设为TIM1_TRGO,采样时间设为最大(如239.5周期)以避开开关噪声。
- 编译烧录后,用示波器测量:
- 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输出处于稳定电平(非边沿),采样窗口避开开关噪声。