目的
目的:用定时器8通道1、2产生相位分别25%50%的PWM波
原理
如图所示设置为比较输出模式,向上计数。当计数值大于比较直输出时产生翻转。即便CNT值清零重新计数也会保持当前电平。这个模式和通用定时器PWM输出比较模式不同。
由上图可以看出PWM的占空比永远为50%,周期为2(ARR+1)*Tcnt。
故ARR影响周期,CCRx 影响初相。
代码
void MX_base_time_Init(uint16_t arr,uint16_t psc)
{
TIM_OC_InitTypeDef timx_oc_cop_pwm={0};
g_timx_handle.Instance=TIM8;
g_timx_handle.Init.CounterMode=TIM_COUNTERMODE_UP;
//预分频值
g_timx_handle.Init.Prescaler=psc;
//重装载值
g_timx_handle.Init.Period=arr;
g_timx_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; /* 使能TIMx_ARR进行缓冲 */
g_timx_handle.Init.RepetitionCounter=0; /* 重复计数器初始值 0*/
HAL_TIM_OC_Init(&g_timx_handle);/* 输出比较模式初始化 */
timx_oc_cop_pwm.OCMode=TIM_OCMODE_TOGGLE; /* 比较输出模式翻转功能 */
timx_oc_cop_pwm.Pulse=250-1;/* 设置输出比较寄存器的值 设置CCRx的值*/
timx_oc_cop_pwm.OCPolarity=TIM_OCPOLARITY_HIGH; /* 输出比较极性为高 CNT <CCRx为高*/
HAL_TIM_OC_ConfigChannel(&g_timx_handle,&timx_oc_cop_pwm,TIM_CHANNEL_1);/* 初始化定时器的输出比较通道1 */
__HAL_TIM_ENABLE_OCxPRELOAD(&g_timx_handle,TIM_CHANNEL_1);/* 通道1 预装载使能 CCRx有影子寄存器 */
timx_oc_cop_pwm.Pulse=500-1;/* 设置输出比较寄存器的值 设置CCRx的值*/
HAL_TIM_OC_ConfigChannel(&g_timx_handle,&timx_oc_cop_pwm,TIM_CHANNEL_3);/* 初始化定时器的输出比较通道1 */
__HAL_TIM_ENABLE_OCxPRELOAD(&g_timx_handle,TIM_CHANNEL_3);/* 通道1 预装载使能 CCRx有影子寄存器 */
HAL_TIM_OC_Start(&g_timx_handle,TIM_CHANNEL_1);
HAL_TIM_OC_Start(&g_timx_handle,TIM_CHANNEL_3);
}
void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance==g_timx_handle.Instance)
{
//使能时钟
__HAL_RCC_TIM8_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitTypeDef gpio_init_struct;
gpio_init_struct.Pin=GPIO_PIN_6|GPIO_PIN_8;
gpio_init_struct.Mode=GPIO_MODE_AF_PP;
gpio_init_struct.Pull=GPIO_PULLUP;
gpio_init_struct.Speed=GPIO_SPEED_FREQ_VERY_HIGH;
gpio_init_struct.Alternate=GPIO_AF3_TIM8;
HAL_GPIO_Init(GPIOC,&gpio_init_struct);
}
}
MX_base_time_Init(1000-1,84-1);