STM32驱动SG90舵机全攻略:从波形生成到实战应用(中下) | 零基础入门STM32第八十四步

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

师从洋桃电子,杜洋老师


文章目录

    • 一、PWM控制舵机原理
      • 1.1 舵机控制信号特性
      • 1.2 定时器PWM模式
    • 二、硬件系统架构
      • 2.1 硬件连接方案
    • 三、核心代码解析
      • 3.1 主程序逻辑框架
      • 3.2 PWM初始化函数详解
    • 四、关键技术点解析
      • 4.1 周期与占空比计算
      • 4.2 重映射配置
    • 五、扩展应用设计
      • 5.1 多通道舵机控制
      • 5.2 中央对齐模式应用
    • 六、调试与优化
      • 6.1 示波器测量要点
      • 6.2 常见问题排查
    • 七、相关资源


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

▲ 回顾上期STM32驱动SG90舵机全攻略:从波形生成到实战应用(中上) | 零基础入门STM32第八十三步


一、PWM控制舵机原理

1.1 舵机控制信号特性

典型舵机控制信号参数:

参数 数值范围 对应角度
周期 20ms (50Hz) 固定不变
高电平时间 0.5ms-2.5ms 0°-180°
STM32驱动SG90舵机全攻略:从波形生成到实战应用(中下) | 零基础入门STM32第八十四步_第1张图片
(图1:波形对应角度示意图)

1.2 定时器PWM模式

STM32提供两种PWM模式:

/* PWM模式选择 */
TIM_OCMode_PWM1: 向上计数CNT<CCR有效,向下计数CNT>CCR无效
TIM_OCMode_PWM2: 向上计数CNT<CCR无效,向下计数CNT>CCR有效

二、硬件系统架构

2.1 硬件连接方案

模块 连接引脚 功能说明
舵机信号线 PB0 (TIM3_CH3) PWM信号输出
OLED显示屏 I2C接口 角度显示
触摸按键 独立GPIO 角度选择控制

三、核心代码解析

3.1 主程序逻辑框架

int main(void) {
    // 系统初始化
    RCC_Configuration();  // 时钟配置
    TIM3_PWM_Init(59999,23); // PWM初始化(20ms周期)
    
    while(1) {
        // 按键扫描与角度设置
        if(按键A按下) Set_Angle(0);   // 0.5ms
        if(按键B按下) Set_Angle(45);  // 1.5ms
        if(按键C按下) Set_Angle(90);  // 2.0ms 
        if(按键D按下) Set_Angle(180); // 2.5ms
    }
}

void Set_Angle(uint8_t angle) {
    uint16_t pulse = 1500 + angle*33; // 角度转脉冲计算
    TIM_SetCompare3(TIM3, pulse);     // 修改CCR寄存器值
}

3.2 PWM初始化函数详解

void TIM3_PWM_Init(u16 arr, u16 psc) {
    // GPIO配置
    GPIO_InitTypeDef GPIO_InitStruct = {
        .GPIO_Pin = GPIO_Pin_0,
        .GPIO_Mode = GPIO_Mode_AF_PP,  // 复用推挽输出
        .GPIO_Speed = GPIO_Speed_50MHz
    };
    GPIO_Init(GPIOB, &GPIO_InitStruct);

    // 定时器基础配置
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct = {
        .TIM_Period = arr,        // 自动重装载值
        .TIM_Prescaler = psc,     // 预分频系数
        .TIM_CounterMode = TIM_CounterMode_Up // 向上计数模式
    };
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);

    // PWM通道配置
    TIM_OCInitTypeDef TIM_OCInitStruct = {
        .TIM_OCMode = TIM_OCMode_PWM1,
        .TIM_OCPolarity = TIM_OCPolarity_High,
        .TIM_OutputState = TIM_OutputState_Enable
    };
    TIM_OC3Init(TIM3, &TIM_OCInitStruct);

    TIM_Cmd(TIM3, ENABLE); // 启动定时器
}

四、关键技术点解析

4.1 周期与占空比计算

计算公式:
STM32驱动SG90舵机全攻略:从波形生成到实战应用(中下) | 零基础入门STM32第八十四步_第2张图片

示例参数分析:

TIM3_PWM_Init(59999, 23);
/* 
TIM_CLK = 72MHz
T = (59999+1)*(23+1)/72,000,000 = 0.02s (50Hz)
脉冲分辨率 = 20ms / (59999+1) ≈ 0.33μs
*/

4.2 重映射配置

// 重映射配置函数
void GPIO_Remap_Config(void) {
    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); // 部分重映射
    /* 
    默认通道映射:
    TIM3_CH1 -> PA6
    部分重映射:
    TIM3_CH1 -> PB4
    */
}

五、扩展应用设计

5.1 多通道舵机控制

// 扩展TIM3其他通道
#define SERVO_NUM 3
uint16_t servo_pins[SERVO_NUM] = {GPIO_Pin_0, GPIO_Pin_1, GPIO_Pin_4};

void Multi_Servo_Init(void) {
    for(int i=0; i<SERVO_NUM; i++) {
        GPIO_Init(GPIOB, servo_pins[i]); // 初始化多个PWM输出
    }
    // 配置各通道比较寄存器
}

5.2 中央对齐模式应用

// 配置中央对齐模式
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
/* 
模式特点:
- 减少电机噪声
- 生成对称PWM波形
- 适合电机控制场景
*/

六、调试与优化

6.1 示波器测量要点

测量参数 预期值 调整方法
PWM周期 20ms ±1% 修改arr/psc参数
脉冲宽度 0.5-2.5ms 调整CCR寄存器值
上升沿时间 <1μs 检查GPIO速度设置

6.2 常见问题排查

现象 可能原因 解决方案
舵机无反应 PWM极性设置错误 检查TIM_OCPolarity配置
角度控制不准确 脉冲计算错误 校验角度转换公式
多通道干扰 重映射配置冲突 检查AFIO重映射设置

七、相关资源

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


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

下期预告:下一期将探讨定时器PWM程序分析2,欢迎持续关注!

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

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

  • v1.0 初始版本(2025-03-25)

你可能感兴趣的:(STM32入门教程(100步),stm32,驱动开发,单片机,嵌入式硬件,物联网)