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

目录

前言:

一、硬件准备与接线

1.1 硬件清单

1.2 接线

二、 SG90舵机简介

1.1 外观

 1.2 基本参数

1.3 引脚说明 

1.4 控制原理

1.5 特点

1.6 常见问题

三、 单片机简介

四、 程序设计 

4.1 定时器配置

4.2 角度控制函数

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)。

2) 定时器参数计算

  • PWM频率:50Hz → 周期20ms 。

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

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

3) 脉冲宽度计算(以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舵机角度。关键在于正确配置定时器的预分频值和自动重装载值,并合理映射角度到脉宽。本方案成本低、可靠性高,适合机器人、智能家居等应用场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

如愿小李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值