舵机SG90详解

发布者:清新天空最新更新时间:2025-02-08 来源: jianshu关键字:舵机  SG90  STM32  伺服电机 手机看文章 扫描二维码
随时随地手机看文章

舵机,也叫伺服电机,在嵌入式开发中,舵机作为一种常见的运动控制组件,具有广泛的应用。其中,SG90 舵机以其高效、稳定的性能特点,成为了许多工程师和爱好者的首选,无论是航模、云台、机器人、智能小车中都有它的身影。

本文将深入探讨SG90舵机的技术规格、工作原理和使用方法,为您展现 SG90 舵机的功能和无限可能。


1. 源码下载及前置阅读

本文所涉及的源码及安装包如下(由于平台限制,请点击以下链接阅读原文下载):

https://www.lxlinux.net/e/stm32/sg90-tutorial.html

如果你是嵌入式开发小白,那么建议你先读读下面几篇文章。

  • 了解不同的下载程序方法,为你的嵌入式开发提供更多选择:STM32下载程序的五种方法

  • 手把手让你掌握MDK的使用方式和技巧,助你更高效地进行开发:一文教你使用MDK开发工具

  • 从零开始轻松掌握STM32开发的必备指南:零基础快速上手STM32开发(手把手保姆级教程)

往期精彩教程,有兴趣的小伙伴可以看看。

  • 从零开始轻松掌握STM32开发的必备指南:零基础快速上手STM32开发(手把手保姆级教程)

  • 深入浅出,帮助您理解和应用MQTT协议:万字猛文:MQTT原理及案例

  • 通俗易懂的 GPIO 介绍与实践:如何快速成为点灯大师?

我本科及硕士都是学机械,通过自学成功进入世界500强外企。我已经将自己的学习经验写成了一本电子书,超千人通过此书学习并转行成功。现在将这本电子书免费分享给大家,希望对你们有帮助:

电子书链接:https://www.lxlinux.net/1024.html

2. SG90介绍

2.1 型号介绍

市面上常见的舵机型号有 SG90、MG90S、MG995、MG996R 等等,主要是扭矩大小、工作电压大小、齿轮材质塑料或金属的不同。

一般分为180度和360度:

  • 180度:可以控制旋转角度、有角度定位。上电后舵机自动复位到0度,通过一定参数的脉冲信号控制它的角度。

  • 360°舵机版本不可控制角度,只能控制顺时针旋转、逆时针旋转、停止和调节转速。

我们今天的主角是 SG90,180度版。

2.2 工作参数及引脚介绍

工作参数如下:

  • 工作扭矩:1.6kg/cm

  • 反应速度:0.12 - 0.13秒/60°

  • 死区设定:5us

  • 转动角度:常见0°、90°、180°、360°

  • 齿轮材质:尼龙塑料齿

  • 工作电压:3V - 6V

  • 温度范围:-30° ~ +60°

引脚接线参考如下:

SG90STM32
PWM 信号线(橙色线)任意GPIO
VCC(红线)3.3/5V
GND(棕色线)GND

3. SG90原理

舵机的控制信号是通过脉冲宽度调制(PWM)来实现的。PWM 信号的周期通常为20ms,而脉冲宽度则在 0.5ms 至 2.5ms 之间变化。这个脉冲宽度与舵盘的位置呈线性关系,范围从0度到180度。

当给舵机提供特定宽度的脉冲信号时,输出轴会保持在相应的角度上,不受外界转矩的影响,直到接收到不同宽度的脉冲信号才会改变输出角度,使舵盘移动到新的位置。舵机内部有一个基准电路,产生周期为 20ms、宽度为 1.5ms 的基准信号。同时,还有一个比较器,用于将外部输入信号与基准信号进行比较,以确定转动方向和幅度,并生成驱动电机转动的信号。

控制电路板接收来自信号线的 PWM 控制信号,然后控制电机的转动。电机带动一系列齿轮组,在经过减速传动后,将力量传递到输出舵盘上。舵机的输出轴与位置反馈电位计相连,当舵盘旋转时,位置反馈电位计也会随之变化,向控制电路板输出电压信号进行反馈。控制电路板根据位置反馈信号判断当前位置,并决定电机的转动方向和速度,以实现目标停止。

为了控制舵机,需要使用单片机来生成周期为 20ms 的脉冲信号,并通过控制脉冲的高电平时间在 0.5ms 至 2.5ms 之间来控制舵机的角度。这样,我们可以通过调整 PWM 信号的脉冲宽度来精确控制舵机的位置和运动。

以 SG90,180度版为例,那么对应的控制关系是这样的:

脉冲高电平角度占空比
0.5ms2.5%
1.0ms45°5.0%
1.5ms90°7.5%
2.0ms135°10.0%
2.5ms180°12.5%

4. 编程实战

现在我们就动手,让 SG90 每秒转动一下,0° -> 20° -> 40° -> 100° -> 180° 如此循环。

4.1 硬件接线

本教程使用的硬件如下:

  • 单片机:STM32F103C8T6

  • 舵机:SG90

  • 烧录器:ST-LINK V2

接线如下:

SG90STM32
PWM 信号线(橙色线)A0
VCC(红线)3.3/5V
GND(棕色线)GND

烧录的时候接线如下表,如果不会烧录的话可以看我之前的文章【STM32下载程序的五种方法】。

ST-Link V2STM32
SWCLKSWCLK
SWDIOSWDIO
GNDGND
3.3V3V3

接好如下图:

我用的是我自己打的板子,上官二号。大家可以用自己的板子,是 STM32F103C8T6 就行。

4.2 舵机初始化

将舵机 PWM 引脚进行一个初始化。

void SG_Init(void)

{

    GPIO_InitTypeDef GPIO_InitStruct = {0};


    __HAL_RCC_GPIOA_CLK_ENABLE();


    GPIO_InitStruct.Pin = GPIO_PIN_0;                           /* PWM引脚 */

    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;                     /* 复用推挽 */

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;                /* 低速 */

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);                     /* 初始化PWM引脚 */

}


4.3 定时器初始化

我们 PWM 引脚接 A0,对应的是定时器2和通道1,以下是初始化代码。


void TIM2_Init(void)

{

    //PA0     ------> TIM2_CH1

    TIM_ClockConfigTypeDef sClockSourceConfig = {0};            /* 定时器设置结构体 */

    TIM_MasterConfigTypeDef sMasterConfig = {0};

    TIM_OC_InitTypeDef sConfigOC = {0};


    htim2.Instance = TIM2;                                      /* 通用定时器2 */

    htim2.Init.Prescaler = 7199;                                /* 预分频系数 */

    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;                /* 递增计数模式 */

    htim2.Init.Period = 199;                                    /* 自动装载值 */

    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;          /* 时钟分频因子 */

    htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;

    HAL_TIM_Base_Init(&htim2);

    sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;

    HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig);

    HAL_TIM_PWM_Init(&htim2);

    sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;

    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

    HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);

    sConfigOC.OCMode = TIM_OCMODE_PWM1;

    sConfigOC.Pulse = 0;

    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

    HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);

}


void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)

{

    if(tim_baseHandle->Instance==TIM2)

    {

        /* 定时器2时钟使能 */

        __HAL_RCC_TIM2_CLK_ENABLE();

    }

}


4.4 舵机控制

已知 PWM 信号的周期为20ms;高电平 0.5ms 指向 0° 位置,2.5ms 指向 180° 位置。如果我们要指向 angle°:

2.5-0.5=2ms,对应于180°

CCRx / (199 + 1)  * 20 = 0.5 +(angle / 180)× 2

于是 CCRx =(1.0 / 9.0) * angle + 5.0



void SG_Control(uint16_t angle)

{

   float CCRx;

   CCRx =(1.0 / 9.0) * angle + 5.0;                             //占空比值 = 1/9 * 角度 + 5

   __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, (uint16_t )CCRx);

}


4.5 主函数

主函数如下:


int main(void)

{

    HAL_Init();                         /* 初始化HAL库 */

    sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */

    delay_init(72);                     /* 延时初始化 */

    TIM2_Init();                        /* 定时器4初始化 */

    SG_Init();                          /* 舵机初始化 */

    HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);


    while(1)

    {

        SG_Control(0);                  //舵机旋转到0度

        HAL_Delay(1000);

        SG_Control(20);                 //舵机旋转到20度

        HAL_Delay(1000);

        SG_Control(40);                 //舵机旋转到40度

        HAL_Delay(1000);

        SG_Control(100);                //舵机旋转到100度

        HAL_Delay(1000);

        SG_Control(180);                //舵机旋转到180度

        HAL_Delay(1000);

    }

}


4.6 运行效果

SG90 每秒转动一下,0° -> 20° -> 40° -> 100° -> 180° 如此循环。


5. 总结

通过了解 SG90 舵机的工作原理和特点,我们可以更好地利用它的潜力,为我们的项目带来更多可能性和创新。无论是初学者还是专业工程师,SG90 舵机都是一个很不错的模块,它可以帮助我们实现精确的位置控制和稳定的运动性能。

关键字:舵机  SG90  STM32  伺服电机 引用地址:舵机SG90详解

上一篇:一次性成功搭建STM32-Simulink硬件在环开发环境
下一篇:32F1 主从定时器 控制步进电机

推荐阅读最新更新时间:2026-03-24 11:36

STM32 Cubemax(一)——PWM配置及控制SG90舵机
前言 这是一篇基于STM32F429的保姆级入门的用CubeMAX配置生成并编写的控制舵机SG90的教程 一、SG90舵机 常见的SG90舵机 SG90引出三条线,分别是控制线(橙色),VCC(红色),GND(黑色),用杜邦线依次连接在开发板上即可 SG90舵机要求工作在频率为50HZ——周期为20ms的PWM波,且对应信号的高低电平在0.5ms - 2.5ms之间,对应的舵机转动角度如下表所示(当然也可以按照这个线性的对应关系去达到转动自己想要的角度,如想要转动60°,则高电平脉宽为大概为1.2ms,具体能不能转到特定的角度还和舵机的精度有关) 二、CubeMax配置 1.选型(这里用实验的开发板为正点原子的F4
[单片机]
<font color='red'>STM32</font> Cubemax(一)——PWM配置及控制<font color='red'>SG90</font><font color='red'>舵机</font>
门禁系统设计方案 基于STM32F103C8T6单片机+RFID-RC522模块+SG90舵机
一、项目背景 门禁系统是现代社会中非常重要的安全控制系统之一,其功能是在保障建筑物安全的同时,为合法用户提供便利。当前设计一种基于STM32+RC522的门禁系统设计方案,通过RFID-RC522模块实现了对用户卡的注册、识别及身份验证,通过控制SG90舵机实现门锁的开关,具有较高的安全性和可靠性。实验结果表明,该门禁系统可以有效地保障建筑物的安全性。 门禁系统广泛应用于各种建筑物、企事业单位,用于管理人员的进出、控制人员活动范围、实现安全监控等功能。传统的门禁系统采用密码输入或刷卡的方式进行身份验证,但存在易被破解的风险。基于RFID的门禁系统已经成为一种相对先进的安全控制方案。 本次设计的STM32+RC522门禁系统,通
[单片机]
舵机SG90详解
舵机,也叫伺服电机,在嵌入式开发中,舵机作为一种常见的运动控制组件,具有广泛的应用。其中,SG90 舵机以其高效、稳定的性能特点,成为了许多工程师和爱好者的首选,无论是航模、云台、机器人、智能小车中都有它的身影。 本文将深入探讨SG90舵机的技术规格、工作原理和使用方法,为您展现 SG90 舵机的功能和无限可能。 1. 源码下载及前置阅读 本文所涉及的源码及安装包如下(由于平台限制,请点击以下链接阅读原文下载): https://www.lxlinux.net/e/stm32/sg90-tutorial.html 如果你是嵌入式开发小白,那么建议你先读读下面几篇文章。 了解不同的下载程序方法,为你的嵌入式开发提供更多选择:S
[单片机]
【51单片机STC89C52】IO口模拟PWM控制SG90舵机
一、PWM PWM ,英文名 Pulse Width Modulation ,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进 行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通 过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的 时间占据整个信号周期的百分比,例如方波的占空比就是50%. 占空比 : 一个周期内,高电平占据时长的百分比 STC89C52没有集成PWM功能,可以通过IO口软件模拟,相对硬件PWM来说精准度略差 二、关于舵机控制原理 舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的
[单片机]
【51单片机STC89C52】IO口模拟PWM控制<font color='red'>SG90</font><font color='red'>舵机</font>
浅谈用单片机控制SG90舵机
SG90舵机(模拟舵机) 一、日常吐槽额~~~~~~,在开始今天的主题之前,占用大家一些时间。容我骂街一番,$##%%%$%#$#$$%^艹……………….,哎呀妈呀,骂的有点喘不过来了,额~呸,是言(文明人,文明人)。 可能就奇了怪了,你不好好码字,骂什么街呢!说来惭愧,上边被骂的人就是笔者自己。今天在调试程序的时候,对,就这个鬼舵机,怎么都不转!!!检查硬件---检查程序---百度,如此反复N小时。始终找不到问题所在,程序呢,怎么看,怎么美!硬件呢,怎么看,怎么帅!说是急,那是快,电闪雷鸣,刀光剑影,啪,一个数字1摔在脸上,于是乎,快速打开课本,啪~啪~啪,数字0、1,大脑瓜子一拍,哎呀,一定是这错误了!快速拿起闪闪发光的鼠标
[单片机]
浅谈用单片机控制<font color='red'>SG90</font><font color='red'>舵机</font>
一文分清普通电机、减速电机、步进电机、舵机伺服电机的区别
这里所说的普通电机、步进电机、伺服电机、舵机是指直流微电机,平时我们接触的也多是直流电机。电动机,别名“马达”,就是指根据电磁感应定律保持电磁能的变换或传送的这种电磁感应设备。电机也称(别名电机),在电源电路连用英文字母“M”(旧规范用“D”)表达。其主要功能是产生驱动扭矩,用作电器或各种机器的动力源。发电机由电路中的字母“G”表示。 普通电机 普通电机是我们平时见得比较多的电机,电动玩具,刮胡刀等里面都有,一般为直流有刷电机。这种电机有转速过快、扭力过小的特点,一般只有两个引脚,用电池的正负极接上两个引脚就会转起来,然后电池得正负极再相反的接在两引脚上电机将会反向转动。 减速电机 减速电机就是普通电机加上了减速箱,这样
[机器人]
stm32控制舵机旋转到不同角度
最近学习了stm32,就想用它来控制舵机,然后写下这篇文章分享给大家,如果有理解不到位的地方欢迎大家指正。(我使用的是stm32f103ve型号的开发板,即使和你的型号不同,也有参考价值) 想要控制舵机的转动,首先你得知道舵的工作原理。 舵机的主要组成部分为伺服电机,所谓伺服就是服从信号的要求而动作。在信号来之前,转子停止不动;信号来到之后,转子立即运动。因此我们就可以给舵机输入不同的信号,来控制其旋转到不同的角度。 舵机接收的是PWM信号,当信号进入内部电路产生一个偏置电压,触发电机通过减速齿轮带动电位器移动,使电压差为零时,电机停转,从而达到伺服的效果。简单来说就是给舵机一个特定的PWM信号,舵机就可以旋转到指定的位置
[单片机]
<font color='red'>stm32</font>控制<font color='red'>舵机</font>旋转到不同角度
STM32学习笔记-pwm生成-舵机控制
pwm是由定时器产生的 这是一个定时器3控制舵机的例子 不同舵机pwm的频率和占空比不同,用改变定时器初值和预分频值即可.
[单片机]
<font color='red'>STM32</font>学习笔记-pwm生成-<font color='red'>舵机</font>控制
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved