STM32之SG90舵机控制(附视频讲解)

目录

前言:

一、硬件准备与接线

[1.1 硬件清单](#1.1 硬件清单)

[1.2 接线](#1.2 接线)

[二、 SG90舵机简介](#二、 SG90舵机简介)

[1.1 外观](#1.1 外观)

[1.2 基本参数](#1.2 基本参数)

[1.3 引脚说明](#1.3 引脚说明)

[1.4 控制原理](#1.4 控制原理)

[1.5 特点](#1.5 特点)

[1.6 常见问题](#1.6 常见问题)

[三、 单片机简介](#三、 单片机简介)

[四、 程序设计](#四、 程序设计)

[4.1 定时器配置](#4.1 定时器配置)

[4.2 角度控制函数](#4.2 角度控制函数)

[4.3 主函数调用](#4.3 主函数调用)

[五、 总结](#五、 总结)


前言:

STM32F103C8T6 是一款性价比极高的ARM Cortex-M3内核微控制器,广泛应用于嵌入式开发。SG90舵机 则是小型舵机的代表,常用于机器人、智能家居等场景。本文将通过硬件连接、PWM信号配置、代码实现等步骤,详细讲解如何用STM32F103C8T6控制SG90舵机。

视频讲解链接:

STM32之SG90舵机教学(附源码)

一、硬件准备与接线

1.1 硬件清单

器件 数量 备注
STM32F103C8T6最小系统板 1 核心控制器
SG90舵机 1 工作电压4.8-6V,信号线需PWM
5V电源模块 1 独立供电,避免板载电流不足
杜邦线 若干 连接电路

1.2 接线

SG90舵机 STM32F103C8T6 外部电源

棕色线(GND) → GND引脚 → GND

红色线(VCC) → 连外部5V → 5V

橙色线(信号) → PB0(TIM3_CH3)

注意:若需驱动多个舵机,建议使用独立电源供电,避免STM32板载电源过载。

二、 SG90舵机简介

1.1 外观

1.2 基本参数

参数 数值
工作电压 4.8V - 6V(典型5V)
电流消耗 100mA(空闲),250mA(运行)
扭矩 1.2kg·cm(4.8V),1.6kg·cm(6V)
转速 0.12秒/60°(4.8V),0.10秒/60°(6V)
重量 9克
尺寸 22.2mm × 11.8mm × 31mm
转动角度 180°(部分型号支持360°)
齿轮材质 塑料(部分型号为金属齿轮)
接口类型 3针(信号、电源、地)

1.3 引脚说明

SG90舵机通常有3根线

棕色线(GND):接地。

红色线(VCC):接电源(4.8V-6V)。

橙色线(信号线):接收PWM信号控制角度。

1.4 控制原理

PWM信号控制

  • 信号周期:20ms(50Hz)。

  • 脉冲宽度:0.5ms - 2.5ms,对应角度0° - 180°。

1.5 特点

优点

  • 体积小、重量轻:适合空间受限的项目。

  • 价格低廉:成本低,适合批量使用。

  • 易于控制:标准PWM信号接口,兼容性强。

缺点

  • 扭矩较小:仅适合轻负载场景。

  • 塑料齿轮易磨损:长时间高负载工作可能导致损坏。

1.6 常见问题

1)舵机抖动或不转动

  • 检查电源电压是否足够。

  • 检查PWM信号是否正确。

2) 舵机发热严重

  • 检查是否超负荷运行。

  • 确保转动范围内无机械卡阻。

3) 角度不准确

  • 校准PWM信号脉冲宽度。

  • 检查舵机齿轮是否磨损。

三、 单片机简介

STM32F103C8T6最小系统板:

本文使用的开发板为STM32F103C8T6最小系统板,SG90舵机使用到的引脚为PB0引脚。

四、 程序设计

4.1 定时器配置

使用 TIM3的通道3(PB0)生成PWM,步骤如下:

  1. 时钟配置
  • 系统时钟设为72MHz(默认配置)。

  • APB1总线预分频系数为2。

  • TIM3时钟源为APB1总线(36*2=72MHz)。

  1. 定时器参数计算
  • PWM频率:50Hz → 周期20ms 。

  • 预分频值(PSC):72MHz / (719 + 1) = 0.1MHz → 每个计数周期10μs。

  • 自动重装载值(ARR) :20ms / 10μs = 2000 → ARR = 1999(从0计数)。

  1. 脉冲宽度计算(以90°为例):
  • 1.5ms = 1500μs → 占空比 = 1500 / 20000 = 7.5%。

  • 比较寄存器(CCR) :2000 * 7.5% = 150 → CCR = 150 - 1 = 149

定时器初始化代码如下:

复制代码
void SG90_PWM_Init(u16 arr, u16 psc)
{
      GPIO_InitTypeDef GPIO_InitStructure;
      TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
      TIM_OCInitTypeDef TIM_OCInitStructure;

      // 使能定时器TIM3时钟,注意TIM3时钟为APB1,而非APB2
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

      // 使能PWM输出GPIO口时钟
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;       // 定时器TIM3的PWM输出通道3,TIM3_CH3
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化GPIO
 
      TIM_TimeBaseStructure.TIM_Period = arr;//自动重装值
      TIM_TimeBaseStructure.TIM_Prescaler =psc; //时钟预分频数
      TIM_TimeBaseStructure.TIM_ClockDivision = 0;
      TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数模式
      TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化TIM3
 
      //初始化TIM3_CH3的PWM模式
      TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
      TIM_OCInitStructure.TIM_Pulse = 0;
      TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

      TIM_OC3Init(TIM3, &TIM_OCInitStructure);
      TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能通道的预装载寄存器
      
      TIM_ARRPreloadConfig(TIM3, ENABLE); //使能重装寄存器
      TIM_Cmd(TIM3, ENABLE);//使能定时器TIM3,准备工作 
}

初始化参数如下:

复制代码
SG90_PWM_Init(1999,719);  //初始化舵机

4.2 角度控制函数

将角度转换为对应的占空比,角度最大为180° 。

复制代码
void SG90_Set_Angle(uint8_t angle)
{
    if (angle > 180)
        angle = 180;
    uint16_t duty = 10 * (angle + 45) / 9; // 角度转化为占空比

    TIM_SetCompare3(TIM3, duty); // 设置占空比    
}  

4.3 主函数调用

复制代码
SG90_Set_Angle(0);  //占空比2.5%,0度
delay_ms(1000);
SG90_Set_Angle(90);  //占空比7.5%,90度
delay_ms(1000);

五、 总结

通过STM32F103C8T6的定时器PWM功能,可精准控制SG90舵机角度。关键在于正确配置定时器的预分频值和自动重装载值,并合理映射角度到脉宽。本方案成本低、可靠性高,适合机器人、智能家居等应用场景。

相关推荐
郦7779 分钟前
MO+内核32位普冉单片机PY32F003开发板
单片机·嵌入式硬件
Ivy烎1 小时前
STM32学习笔记
笔记·stm32·学习
蜡笔小电芯3 小时前
【STM32】 LWIP -TCP 客户端收发数据
网络·stm32·tcp/ip
邹诗钰-电子信息工程3 小时前
嵌入式自学第四十二天
单片机·嵌入式硬件
iCxhust3 小时前
使用 Visual Studio 创建安装包的完整指南
ide·单片机·嵌入式硬件·microsoft·c#·visual studio
深圳市尚想信息技术有限公司5 小时前
意法STM32F103C8T6 单片机ARM Cortex-M3 国民MCU 电机控制到物联网专用
arm开发·stm32·单片机
技术流浪者5 小时前
PCB设计实践(三十六)PCB设计新手系统性注意事项总结
单片机·嵌入式硬件·硬件工程·pcb设计
小智学长 | 嵌入式6 小时前
Arduino入门教程:10、屏幕显示
单片机·嵌入式硬件·arduino
GodKK老神灭6 小时前
STM32 实现PID
stm32·单片机·算法·c
heater4046 小时前
【STM32 HAL库】使用HAL库操作FLASH
stm32·单片机