STM32驱动SG90舵机全攻略:从原理到代码实现(上) | 零基础入门STM32第八十二步

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

师从洋桃电子,杜洋老师



一、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.5ms19.5ms20ms
90°1.5ms18.5ms20ms
180°2.5ms17.5ms20ms

三、驱动程序实现分析

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值