您的位置:

使用STM32控制舵机

一、了解舵机

舵机是一种可以精确控制角度的电机,常用于机器人、模型、自动门和遥控车等领域。舵机通常有三个线缆:电源、地线和信号线。通过改变信号线上的脉冲宽度,可以改变舵机转动的角度。

标准的舵机可以转动0度到180度,其中90度为中心位置。改变脉冲宽度可以让舵机转动到任意角度。

二、连接舵机和STM32

舵机通常需要在一定电流下运行。因此,可以通过使用外部电源来提供舵机的电源,来避免过大的负载对STM32的影响。连接舵机的线缆时,需要将信号线连接到STM32的一个旁边的GPIO引脚上。

示例连接:


    //引入库
    #include "stm32f10x.h"
    
    //定义舵机控制引脚
    #define Servo_Pin GPIO_Pin_7
    #define Servo_Port GPIOB
    
    int main(void)
    {
        //初始化GPIO引脚
        GPIO_InitTypeDef GPIO_InitStruct;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  //使能GPIOB时钟
        GPIO_InitStruct.GPIO_Pin = Servo_Pin;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽输出
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;         //50MHz
        GPIO_Init(Servo_Port, &GPIO_InitStruct);
        
        //设置GPIO引脚输出高电平,以控制舵机复位
        GPIO_SetBits(Servo_Port, Servo_Pin);
        
        while (1)
        {
            //控制舵机偏向左移动10度
            GPIO_ResetBits(Servo_Port, Servo_Pin);
            delay_ms(1);
            GPIO_SetBits(Servo_Port, Servo_Pin);
            delay_ms(19);
        }
    }

三、控制舵机旋转

通过改变脉冲宽度来控制舵机旋转,具体要控制多少角度需要根据具体舵机的型号来决定。假设舵机的最小脉冲宽度为500us,最大脉冲宽度为2500us,则中间位置的脉冲宽度应该为1500us。

假设使用的是72MHz的系统时钟,可以使用定时器输出PWM波来产生脉冲宽度,具体的控制代码如下:


    #include "stm32f10x.h"
    
    #define Servo_Pin GPIO_Pin_7
    #define Servo_Port GPIOB
    
    #define PWM_Prescaler 71
    #define PWM_Period 1999
    
    int main(void)
    {
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
        GPIO_InitTypeDef GPIO_InitStruct;
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
        
        GPIO_InitStruct.GPIO_Pin = Servo_Pin;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(Servo_Port, &GPIO_InitStruct);
        
        TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInitStruct.TIM_Prescaler = PWM_Prescaler;
        TIM_TimeBaseInitStruct.TIM_Period = PWM_Period;
        TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);
        
        TIM_OCInitTypeDef TIM_OCInitStruct;
        
        TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
        TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OCInitStruct.TIM_Pulse = 1500;
        TIM_OC1Init(TIM3, &TIM_OCInitStruct);
        
        TIM_Cmd(TIM3, ENABLE);
        
        while (1)
        {
            //控制舵机向左移动5度
            TIM_SetCompare1(TIM3, 1700);
            delay_ms(1000);
            
            //控制舵机向右移动5度
            TIM_SetCompare1(TIM3, 1300);
            delay_ms(1000);
        }
    }

四、总结

本文介绍了如何使用STM32控制舵机,包括连接舵机和STM32、控制舵机旋转等方面。通过学习本文可以掌握如何使用STM32控制舵机的基本知识,为后续的舵机控制项目提供帮助。