学习笔记12-SG90舵机

article/2025/8/19 0:01:51

目录

  • 一、简介
    • 接线
  • 二、原理
  • 3、代码段
    • 3.1、sg90.c
    • 3.2、main.c

一、简介

舵机是一种位置(角度)伺服的驱动器,适用于需要角度不断变化并可以保持的控制系统,可以根据控制信号来输出指定的角度(常见的有0-90°、0-180°、0-360°)。
实质是一个伺服马达。又分为模拟舵机和数字舵机。

  • 模拟舵机:需要不断发送目的地PWM信号,才能旋转到指定位置。(想转10°,要不断发送10°PWM信号直到指定位置才能停止)
  • 数字舵机:只需给一个目的地PWM信号,即可旋转到指定位置。(想转10°,发送一次10°PWM信号就可以转到10°)
    在这里插入图片描述

接线

红色----VCC
棕色----GND
橙色----信号线(连接到单片机输出PWM的引脚)

二、原理

舵机的控制一般需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分,对应控制180°舵机的0-180°,呈线性变化。

给它提供一定的脉宽,它的输出轴就会保持在一个相对应的角度上,无论外界转矩怎样改变,直到给它提供一个另外宽度的脉冲信号,它才会改变输出角度到新的对应的位置上。舵机内部有一个基准电路,产生周期20ms,宽度1.5ms的基准信号,有一个比较器,将外加信号与基准信号相比较,判断出方向和大小,从而产生电机的转动信号。

控制电路板接受来自信号线相应的PWM控制信号,进而控制电机转动,电机带动一系列齿轮组,减速后传动至输出舵盘。舵机的输出轴和位置反馈电位计是相连的,舵盘转动的同时,带动位置反馈电位计,电位计将输出一个电压信号到控制电路板,进行反馈,然后控制电路板根据所在位置决定电机的转动方向和速度,从而达到目标停止。

以180度角度伺服为例,那么对应的控制关系是这样的(t为高电平时间):
t=0.5ms(占空比2.5%)---------0°;
t=1.0ms(占空比5%)-----------45°;
t=1.5ms(占空比7.5%)---------90°;
t=2.0ms(占空比10%)---------135°;
t=2.5ms(占空比12.5%)-------180°;

即:高电平时间=0.5ms+(角度/180°)×2ms
在这里插入图片描述

3、代码段

根据PWM周期为20ms = (7200*200)/72000000=0.02。故TIM_Period=199TIM_Prescaler=7199

以转动45°为例,占空比为5%,所以TIM_SetCompare1的 TIMx 捕获比较 1 寄存器值就为200-200*5% = 190。

以下是代码展示,仅供参考:

3.1、sg90.c

void TIM1_PWM_Init(void)//自动重装载值 预分频系数
{  GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;RCC_APB2PeriphClockCmd(SG90_TIM_CLK, ENABLE);// //使能定时器1的时钟RCC_APB2PeriphClockCmd(SG90_GPIO_CLK , ENABLE);  //使能GPIO外设时钟使能//设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形GPIO_InitStructure.GPIO_Pin = SG90_Pin; //TIM_CH1    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHzGPIO_Init(SG90_Port, &GPIO_InitStructure);TIM_TimeBaseStructure.TIM_Period = 199; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 80KTIM_TimeBaseStructure.TIM_Prescaler =7199; //设置用来作为TIMx时钟频率除数的预分频值  不分频TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式TIM_TimeBaseInit(SG90_TIMx, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高TIM_OC1Init(SG90_TIMx, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMxTIM_CtrlPWMOutputs(SG90_TIMx,ENABLE);	//MOE 主输出使能	TIM_OC1PreloadConfig(SG90_TIMx, TIM_OCPreload_Enable);  //CH1预装载使能	 //使能输出比较预装载TIM_ARRPreloadConfig(SG90_TIMx, ENABLE); //使能TIMx在ARR上的预装载寄存器TIM_Cmd(SG90_TIMx, ENABLE);  //使能TIM1}

3.2、main.c

int main(void)
{		  u16 pwmval;	 DelayInit();TIM1_PWM_Init();  while(1){	DelayMs(500);	pwmval=195;  //0°					 TIM_SetCompare1(TIM8,pwmval);	DelayMs(500);	pwmval=190;  //45°					 TIM_SetCompare1(TIM8,pwmval);	DelayMs(500);	pwmval=185;  //90°					 TIM_SetCompare1(TIM8,pwmval);DelayMs(500);	pwmval=180;  //135°					 TIM_SetCompare1(TIM8,pwmval);		DelayMs(500);	 pwmval=175;  //180°					 TIM_SetCompare1(TIM8,pwmval);	   }		
}

关于选择TIM_OCMode_PWM2等的原因,详见:TIM_OCMode_PWM2;TIM_OCMode_PWM1

参考自:
1、单片机——SG90舵机工作原理
2、STM32控制SG90舵机
3、SG90舵机



http://chatgpt.dhexx.cn/article/juKnETM6.shtml

相关文章

PWM驱动sg90电机

关于PWM驱动sg90电机,不管是180还是360舵机都满足左侧的条件关系。 PWM周期为20ms,频率为50Hz 重装载值arr 1999 预分频值psc 7199 stm32f103主频72MHz TIM3_Int_Init(1999,7199);//Tout (arr1)(psc1)/TCLK;72000000/2000/720050PWM周期 (主频 / […

51单片机控制sg90舵机

2.1 简介 PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进 行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说…

SG90舵机使用介绍

舵机控制 型号:SG90 接线 黄线:信号线 红线:电源线 棕线:地线 PWM周期 需要通过信号线往舵机输入PWM波,才能驱动舵机转动 PWM波的频率不能太高,大约50HZ,即周期1/频率1/500.02s&#xff…

51单片机sg90舵机

51单片机按键控制舵机旋转 一、舵机工作原理 1、这里介绍的sg90的可旋转角度为 0~180 2、sg90有三条线,橙色(PWM)红色(5V)棕色(GND) 3、PMW的范围为0.5ms2.5ms,相应的旋转角度为…

PWM开发SG90舵机

1. 简介 PWM,全称:Pulse Width Modulation,脉冲宽度调制缩写,它是通过宽度对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空…

控制SG90舵机

1. 什么是舵机 如下图所示,最便宜的舵机sg90,常用三根或者四根接线,黄色为PWM信号控制 用处:垃圾桶项目开盖用、智能小车的全比例转向、摄像头云台、机械臂等 常见的有0-90、0-180、0-360 VCC:接电压端 GND:接地端 PWM信号&#…

STM32控制SG90舵机

简介 通过使用STM32控制SG90舵机进行转动 PWM输出:PC6 定时器:TM3,通道1 接线如下: 控制原理及PWM配置 舵机的控制一般需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分 PWM周…

【mcuclub】舵机-SG90

一、实物图(SG90) 二、原理图 编号名称功能1GND电源地(棕色线)2VCC电源正(红色线)3I/O信号线(黄色线) 三、简介 舵机(英文叫Servo),是伺服电机的…

STM32外设系列—sg90(舵机)

文章目录 一、sg90简介二、引脚连接三、控制方法四、程序设计4.1 配置定时器4.2 编写控制程序 五、360舵机 一、sg90简介 首先介绍说一下什么是舵机。舵机是一种位置(角度)伺服的驱动器。适用于一些需要角度不断变化的,可以保持的控制系统。…

java基本类型与包装类型

基本数据类型:byte,int, short, long, boolean,char, float,double等 包装类型 : Byte,Integer,Short,Long&#xff…

java基本类型与包装类型区别

java基本类型与包装类型区别 Java中基本类型都有固定的存储空间,不像其他大多数语言那样随机器硬件架构的变化而变化,这种占存储空间大小的不变性是java程序比其他大多数语言编写的程序更具可移植性的原因之一。 java中基本类型和包装类的区别&#xff1…

【包装类型】

文章目录 包装类八种基本类型及其包装类手动装箱/拆箱自动装箱/拆箱整数型常量池 Integer方法 包装类 我们已经知道,Java的数据类型分两种: 基本类型:byte,short,int,long,boolean,…

Java为什么要有基本数据类型和包装类型

作为面向对象语言为代表的Java, 在很多任务场景中经常看到它的身影。那么,Java为什么要有基本数据类型和包装类型? 这个问题看似简单,其实也不好回答。毕竟这个问题不仅你我感觉到困惑,许多大佬也感觉到困惑,一些人希望…

基本类型和包装类型的区别详解

六年前,我从苏州回到洛阳,抱着一幅“海归”的心态,投了不少简历,也“约谈”了不少面试官,但仅有两三个令我感到满意。其中有一位叫老马,至今还活在我的手机通讯录里。他当时扔了一个面试题把我砸懵了&#…

Boolean类型(基本与包装类型)

前面的话 当 Number、String、Boolean使用new操作符时,它们就不仅仅是基本类型了,变成了基本的包装类型,即引用类型。Boolean类型应该算是这三种类型中最简单的类型,这篇文章将介绍Boolean类型。 定义 Boolean类型只有两个字面…

34、Java 中有了基本数据类型,为什么还需要有包装类型?包装类型是啥?

文章目录 一、引入(基本数据类型弊端)二、包装类(1) 模拟包装类的实现(2) 包装类(Wrapper Class)(3) 自动装箱、自动拆箱① 自动装箱② 自动拆箱 三、整数类型包装类细节 ☆ 一、引入(基本数据类型弊端) &…

包装类和基本类型

什么是包装类 所谓包装类,就是能够直接将简单类型的变量表示为一个类,在执行变量类型的相互转换时,我们会大量使用这些包装类。 包装类 包装类有以下用途 1.集合不允许存放基本数据类型,故常用包装类 2.包含了每种基本类型的相…

包装类型和基本类型

包装类型和基本类型 Java中有八种基本数据类型,分别对应着八大包装类型,因为包装类型的实例都存在于堆中,所以包装类型也称为引用类型。 基本类型属于原始数据类型,变量中存储的就是原始值。包装类型属于引用数据类型&#xff0…

Java 的八大基本类型及其包装类型(超级详细)

Java 中有八种内置的基本数据类型,他们分别是 byte、short、int、long、float、double、char 和 boolean,其中,byte、short、int 和 long 都是用来表示整数,float 和 double 是用来表示浮点数的,那它们之间有什么区别和…

Java 八大包装类(超详细!)

一、8种基本数据类型对应的包装类型名 基本数据类型包装类型bytejava.lang.Byte(父类Number)shortjava.lang.Short(父类Number)intjava.lang.Integer(父类Number)longjava.lang.Long(父类Numbe…