程序实现逻辑: 用一个定时器的一个通道去触发这个定时器的另一个通道和另外一个定时器的某个通道。
定时器配置步骤:
1.配置定时器和输出PWM波IO口对应时钟;
2.配置输出PWM波IO口;
3.配置定时器基本信息;
4.配置通道输出的信息;
5.配置主从模式的选择及对应关系;
注意事项:
1.定时器的选择
定时器的选择只能是高级和通用定时器,具体选择哪两个定时器要参考从模式寄存器的TSEL位域。
2.被触发的两路通道输出模式只能选择PWM2模式。
3.TIM_SelectInputTrig()函数中的TIM_TRIG_SEL_IN_TR0选择参考了表格,不同定时器选择不同。
4.移相的距离等于移相占空比减被移相PWM的占空比。这个例子中是TM1CH2占空比减去TM1CHI占空比。
程序代码如下:
void TIM_PWM_OUTPUT(void)
{
GPIO_InitType GPIO_InitStructure;
TIM_TimeBaseInitType TIM_TimeBaseStructure;
OCInitType TIM_OCInitStructure;
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_TIM1 |RCC_APB2_PERIPH_TIM8, ENABLE);
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA| RCC_APB2_PERIPH_GPIOB|RCC_APB2_PERIPH_GPIOC, ENABLE);
//PA8 TIM1-CH1 PB13 TIM1-CH1N
GPIO_InitStructure.Pin = GPIO_PIN_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
//PC6 TIM8-CH1 PA7 TIM8-CH1N
GPIO_InitStructure.Pin = GPIO_PIN_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitPeripheral(GPIOC, &GPIO_InitStructure);
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = (1200-1);
TIM_TimeBaseStructure.Prescaler = (10-1);
TIM_TimeBaseStructure.ClkDiv = 0;
TIM_TimeBaseStructure.CntMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(TIM1, &TIM_TimeBaseStructure);
TIM_InitTimeBase(TIM8, &TIM_TimeBaseStructure);
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OcMode = TIM_OCMODE_PWM2;
TIM_OCInitStructure.Pulse = (200);
TIM_OCInitStructure.OcPolarity = TIM_OC_POLARITY_LOW;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.OcIdleState = TIM_OC_IDLE_STATE_SET;
TIM_InitOc1(TIM8, &TIM_OCInitStructure);
TIM_InitOc1(TIM1, &TIM_OCInitStructure);
// ÒÆÏàPWM
TIM_OCInitStructure.Pulse = (200*2);
TIM_InitOc2(TIM1, &TIM_OCInitStructure);
// Ö÷´ÓģʽÅäÖÃ
TIM_SelectOutputTrig(TIM1, TIM_TRGO_SRC_OC2REF);
TIM_SelectMasterSlaveMode(TIM1, TIM_MASTER_SLAVE_MODE_ENABLE);
TIM_SelectInputTrig(TIM8, TIM_TRIG_SEL_IN_TR0);
TIM_SelectSlaveMode(TIM8, TIM_SLAVE_MODE_TRIG);
// ¶¨Ê±Æ÷ʹÄÜ
TIM_EnableCtrlPwmOutputs(TIM8, ENABLE);
TIM_Enable(TIM1, ENABLE);
TIM_EnableCtrlPwmOutputs(TIM1, ENABLE);
}