此函数运用片内输出口(PWM波形输出口)为定时中断2(TIM2)的ETR通道2(TIM_CH2)
控制MG996R舵机需要调制一个频率为50Hz,也就是周期为20ms的波形,此时我选择分频器的值为720,ARR重装器的值为2000
详细计算公式相信大家也会
` TIM_TimeBaseInitStucture.TIM_Period = 2000-1; //ARR自动重装器的值
TIM_TimeBaseInitStucture.TIM_Prescaler = 720-1; //PSC预分频器值
`
void PWM_SetCompare2(uint16_t ComPare) 此函数是用来改变CCR的值的,也就是用来改变PWM波形的脉冲宽度,此时ComPare的值的取值范围为0——2000,对应的就是0ms——20ms,例如当调用此函数将110赋予给ComPare后,MG996R舵机将顺时针速度次一点运转。
void PWM_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //启用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
TIM_InternalClockConfig(TIM2); //选择内部时钟为时基频率
GPIO_InitTypeDef GPIO_InitStucture;
GPIO_InitStucture.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出(指定)
GPIO_InitStucture.GPIO_Pin = GPIO_Pin_1; //PA0口为TIM2_CH2通道输出口
GPIO_InitStucture.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStucture);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStucture;
TIM_TimeBaseInitStucture.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStucture.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStucture.TIM_Period = 2000-1;
TIM_TimeBaseInitStucture.TIM_Prescaler = 720-1;
TIM_TimeBaseInitStucture.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStucture); //时基单元配置
TIM_OCInitTypeDef TIM_OCInitStucture;
TIM_OCInitStucture.TIM_Pulse = 0; //CCR的值
TIM_OCInitStucture.TIM_OCMode = TIM_OCMode_PWM1; //输出比较模式
TIM_OCInitStucture.TIM_OCNPolarity = TIM_OCPolarity_High; //极性设置
TIM_OCInitStucture.TIM_OutputState = ENABLE;
TIM_OC2Init(TIM2,&TIM_OCInitStucture); //比较单元的配置
TIM_Cmd(TIM2,ENABLE);
}
void PWM_SetCompare2(uint16_t ComPare) //改变通道2CCR的值
{
TIM_SetCompare2(TIM2,ComPare);
}