返回

如何通过STM32F103RCT6芯片控制SG90舵机,实现正反转角度控制

后端

前言

    SG90舵机是一种小巧、轻便、性价比高的微型舵机,它被广泛应用于机器人、智能家居、航模等领域。该舵机可以通过脉宽调制(PWM)信号来控制其转动角度。STM32F103RCT6芯片是一款功能强大的微控制器,它具有丰富的资源和外设,非常适合用于控制舵机。本文将介绍如何使用STM32F103RCT6芯片控制SG90舵机,实现正反转角度控制。
    
    ## 硬件准备
    
    - STM32F103RCT6开发板
    - SG90舵机
    - 杜邦线
    - 面包板
    - 电源
    
    ## 软件准备
    
    - Keil MDK-ARM
    - STM32CubeMX
    
    ## 连接电路
    
    1. 将STM32F103RCT6开发板的5V电源引脚与面包板的正极连接。
    2. 将STM32F103RCT6开发板的地线引脚与面包板的负极连接。
    3. 将SG90舵机的红线与面包板的正极连接。
    4. 将SG90舵机的黑线与面包板的负极连接。
    5. 将SG90舵机的黄线与STM32F103RCT6开发板的TIM2_CH1引脚连接。
    
    ## 固件开发
    
    1. 打开Keil MDK-ARM软件,新建一个工程。
    2. 在工程中添加STM32F103RCT6芯片。
    3. 配置STM32F103RCT6芯片的时钟系统。
    4. 配置STM32F103RCT6芯片的TIM2定时器。
    5. 编写控制舵机的程序。
    
    ## 程序代码
    
    ```c
    #include "stm32f10x.h"

    /*----------------------------------------------------------------------------
    * 函数: main
    * : 主函数
    *----------------------------------------------------------------------------*/
    int main(void)
    {
        // 初始化时钟系统
        SystemInit();

        // 初始化TIM2定时器
        TIM2_Init();

        // 初始化舵机
        Servo_Init();

        // 等待1秒
        Delay(1000);

        // 让舵机正转30度
        Servo_SetAngle(30);

        // 等待1秒
        Delay(1000);

        // 让舵机反转30度
        Servo_SetAngle(-30);

        // 等待1秒
        Delay(1000);

        // 让舵机停止转动
        Servo_SetAngle(0);

        // 死循环
        while (1)
        {
        }
    }

    /*----------------------------------------------------------------------------
    * 函数: TIM2_Init
    * : 初始化TIM2定时器
    *----------------------------------------------------------------------------*/
    void TIM2_Init(void)
    {
        // 使能TIM2时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

        // 设置TIM2定时器为基本定时器模式
        TIM2->CR1 &= ~TIM_CR1_DIR;

        // 设置TIM2定时器的时钟预分频系数
        TIM2->PSC = 72 - 1;

        // 设置TIM2定时器的重装载值
        TIM2->ARR = 1000 - 1;

        // 使能TIM2定时器的输出比较中断
        TIM2->DIER |= TIM_DIER_UIE;

        // 启动TIM2定时器
        TIM2->CR1 |= TIM_CR1_CEN;

        // 等待TIM2定时器中断发生
        while ((TIM2->SR & TIM_SR_UIF) == 0)
        {
        }

        // 清除TIM2定时器的中断标志位
        TIM2->SR &= ~TIM_SR_UIF;
    }

    /*----------------------------------------------------------------------------
    * 函数: Servo_Init
    * 描述: 初始化舵机
    *----------------------------------------------------------------------------*/
    void Servo_Init(void)
    {
        // 设置TIM2通道1的输出比较模式
        TIM2->CCMR1 &= ~TIM_CCMR1_OC1M;
        TIM2->CCMR1 |= TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1M_1;

        // 设置TIM2通道1的输出比较预装载值
        TIM2->CCR1 = 1500;

        // 使能TIM2通道1的输出比较功能
        TIM2->CCER |= TIM_CCER_CC1E;
    }

    /*----------------------------------------------------------------------------
    * 函数: Servo_SetAngle
    * 描述: 设置舵机的角度
    *----------------------------------------------------------------------------*/
    void Servo_SetAngle(int angle)
    {
        // 计算舵机的占空比
        int duty = 1500 + angle * 11;

        // 设置TIM2通道1的输出比较预装载值
        TIM2->CCR1 = duty;
    }

    /*----------------------------------------------------------------------------
    * 函数: Delay
    * 描述: 延时函数
    *----------------------------------------------------------------------------*/
    void Delay(uint32_t ms)
    {
        uint32_t i;
        for (i = 0; i < ms; i++)
        {
            for (uint32_t j = 0; j < 10000; j++)
            {
            }
        }
    }
    ```
    
    ## 程序说明
    
    该程序首先初始化STM32F103RCT6芯片的时钟系统和TIM2定时器。然后初始化舵机。接着让舵机正转30度,等待1秒,再反转30度,等待1秒,最后停止转动。最后,程序进入死循环,等待用户输入。
    
    ## 结语
    
    本文介绍了如何使用STM32F103RCT6芯片控制SG90舵机,实现正反转角度控制。该程序可以很容易地修改以实现更复杂的功能。希望本文能对读者有所帮助。