STM32驱动SG90舵机全解析:入门到精通的实战教程(上)

主题 内容 教学目的/扩展视频
舵机控制 电路连接,驱动原理,驱动程序,调用控制。 能写入角度值,为小车开发做准备。

师从洋桃电子,杜洋老师


📑文章目录

  • 一、SG90舵机核心特性
  • 1.1 基本参数
  • 1.2 硬件连接方案
  • 二、PWM控制原理深度解析
  • 2.1 角度-脉宽对应关系
  • 2.2 波形时序分析
  • 三、驱动程序实现分析
  • 3.1 GPIO初始化配置
  • 3.2 角度控制函数解析
  • 四、关键应用电路设计
  • 4.1 电源系统设计
  • 4.2 信号整形电路
  • 五、工程实践注意事项
  • 5.1 校准调试技巧
  • 5.2 常见问题排查
  • 六、扩展应用设计
  • 6.1 多舵机协同控制
  • 6.2 角度平滑过渡算法
  • 七、相关资源

  • 一、SG90舵机核心特性

    1.1 基本参数

    (图1:SG90示意图)

  • 工作电压:4.8V-6V(推荐5V)
  • 工作电流:100-250mA(空载)
  • 旋转角度:0°-180°
  • 控制信号:50Hz PWM(周期20ms)
  • 1.2 硬件连接方案

    /* 典型接线定义 */
    #define SERVO_PWM_PIN    GPIO_Pin_15   // PA15作为PWM输出
    #define SERVO_VCC       5V电源         // 独立供电
    #define SERVO_GND       共地           // 必须与单片机共地
    

    二、PWM控制原理深度解析

    2.1 角度-脉宽对应关系

    2.2 波形时序分析

    角度 高电平时间 低电平时间 总周期
    0.5ms 19.5ms 20ms
    90° 1.5ms 18.5ms 20ms
    180° 2.5ms 17.5ms 20ms

    三、驱动程序实现分析

    3.1 GPIO初始化配置

    void SG90_Init(void) {
        GPIO_InitTypeDef GPIO_InitStruct;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        
        GPIO_InitStruct.GPIO_Pin = SERVO_PWM_PIN;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  // 推挽输出
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(SERVO_PORT, &GPIO_InitStruct);
    }
    

    3.2 角度控制函数解析

    void SG90_angle(u8 angle) {
        uint16_t high_time = 500 + angle * 11;  // 0.5ms基准+角度换算
        GPIO_SetBits(SERVO_PORT, SERVO_PWM_PIN);
        delay_us(high_time);                   // 高电平持续时间
        GPIO_ResetBits(SERVO_PORT, SERVO_PWM_PIN);
        delay_us(20000 - high_time);           // 低电平补足周期
    }
    

    四、关键应用电路设计

    4.1 电源系统设计

  • 推荐使用独立电源供电
  • 添加100μF电解电容滤波
  • 大功率负载需并联续流二极管
  • 4.2 信号整形电路

    // 可选RC滤波电路参数
    #define R_VALUE  100   // 单位Ω
    #define C_VALUE  0.1   // 单位μF
    

    五、工程实践注意事项

    5.1 校准调试技巧

    1. 零点校准

      SG90_angle(0);   // 理论0°
      // 实际测量后调整偏移量
      high_time = 500 + calib_value; 
      
    2. 满量程校准

      SG90_angle(180); // 理论180°
      // 机械限位检测调整
      

    5.2 常见问题排查

    现象 可能原因 解决方案
    舵机无反应 电源未接通 检查VCC-GND电压
    角度偏差大 机械安装错位 重新校准零点
    电机发热 堵转或过载 减少负载或增加散热
    抖动严重 PWM信号不稳定 添加硬件滤波电路

    六、扩展应用设计

    6.1 多舵机协同控制

    // 使用定时器PWM输出(TIM3示例)
    void TIM3_PWM_Init(void) {
        TIM_TimeBaseInitTypeDef TIM_InitStruct;
        TIM_OCInitTypeDef TIM_OCInitStruct;
        
        // 时基配置
        TIM_InitStruct.TIM_Period = 1999;        // 20ms周期
        TIM_InitStruct.TIM_Prescaler = 71;       // 72MHz/72=1MHz
        TIM_TimeBaseInit(TIM3, &TIM_InitStruct);
        
        // PWM通道配置
        TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
        TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStruct.TIM_Pulse = 50;        // 初始0.5ms
        TIM_OC1Init(TIM3, &TIM_OCInitStruct);
        
        TIM_Cmd(TIM3, ENABLE);
    }
    

    6.2 角度平滑过渡算法

    void Smooth_Rotate(uint8_t target_angle) {
        static uint8_t current_angle = 0;
        while(current_angle != target_angle) {
            current_angle += (current_angle < target_angle) ? 1 : -1;
            SG90_angle(current_angle);
            delay_ms(20);  // 控制旋转速度
        }
    }
    

    七、相关资源

    [1] 洋桃电子B站课程-STM32入门100步
    [2] STM32官方文档手册
    [3] STM32F103固件函数库用户手册(中文)
    [4] 延时函数驱动舵机程序
    [5] 舵机原理与驱动.pptx


    💬 技术讨论(请在评论区留言~)


    📌 下期预告:下一期将探讨定时器PWM原理,欢迎持续关注!

    点击查阅🔍往期【STM32专栏】文章

    版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
    实测开发版:洋桃1号开发版(基于STM32F103C8T6)
    更新日志

  • v1.0 初始版本(2025-03-24)
  • 作者:触角01010001

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32驱动SG90舵机全解析:入门到精通的实战教程(上)

    发表回复