PWM驱动180度舵机

发布时间 2023-09-05 22:03:37作者: Yannnnnnn

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));

    }

}