PWM驱动180度舵机
PWM周期 20ms
高电平0.5-2.5ms
电平与角度对应关系
0度 | 0.5ms/20ms | ![]() |
90度 | 1.5ms/20ms | ![]() |
180度 | 2.5ms/20ms | ![]() |
PWM设置,Timer Clocks 84MHz
TIM_HandleTypeDef h_TIM2;
void S_TIM2_Init(void)
{
/*TIM2CH1 = PA0*/
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_Init;
GPIO_Init.Pin=GPIO_PIN_0;
GPIO_Init.Mode=GPIO_MODE_AF_PP;
GPIO_Init.Pull=GPIO_NOPULL;
GPIO_Init.Speed=GPIO_SPEED_FREQ_HIGH;
GPIO_Init.Alternate=GPIO_AF1_TIM1;
HAL_GPIO_Init(GPIOA,&GPIO_Init);
__HAL_RCC_TIM2_CLK_ENABLE();
h_TIM2.Instance = TIM2;
h_TIM2.Init.Prescaler = 8400-1;
h_TIM2.Init.CounterMode = TIM_COUNTERMODE_UP;
h_TIM2.Init.Period = 200-1;
h_TIM2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
h_TIM2.Init.RepetitionCounter = 0;
h_TIM2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
HAL_TIM_PWM_Init(&h_TIM2);
TIM_OC_InitTypeDef TIM2_OC_Init;
TIM2_OC_Init.OCMode = TIM_OCMODE_PWM1;
TIM2_OC_Init.Pulse = 5;
TIM2_OC_Init.OCPolarity = TIM_OCPOLARITY_HIGH;
TIM2_OC_Init.OCNPolarity = TIM_OCNPOLARITY_HIGH;
TIM2_OC_Init.OCFastMode =TIM_OCFAST_DISABLE;
TIM2_OC_Init.OCIdleState=TIM_OCIDLESTATE_RESET;
TIM2_OC_Init.OCNIdleState=TIM_OCNIDLESTATE_RESET;
HAL_TIM_PWM_ConfigChannel(&h_TIM2,&TIM2_OC_Init,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&h_TIM2, TIM_CHANNEL_1);
}
舵机测试函数
void servo_Test(void)
{
for(int i=5;i<=25;i++)
{
__HAL_TIM_SetCompare(&h_TIM2, TIM_CHANNEL_1, i);
HAL_Delay(500);
printf("%.1fms=%ddegree",((float)i)/10,(i-5)*(180/20));
}
}