零基础STM32单片机编程入门(三十六) 180度SG90舵机详解及实战源码

一.概要

SG90舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。在机器人机电控制系统中,舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易驱动起来。

在这里插入图片描述

二.SG90舵机介绍

尺寸:21.5mmX11.8mmX22.7mm
重量:9克(1kg=1公斤=2斤)
无负载速度:0.12秒/60度(4.8V)0.002s/度
堵转扭矩:1.2-1.4公斤/厘米(4.8V)
使用温度:-30~~+60摄氏度
死区设定:7us(7MHZ)
工作电压:4.8V-6V
位置等级:1024级
脉冲控制精度为2us

舵机一般可以在0-180度或0-360度转动任意角度,经常用于小车小船转向控制和机械臂的关节等。舵机的转动角度范围不是固定的,一般我们选用0-180度旋转的舵机,简称180度舵机。

三.SG90舵机的原理

舵机的工作原理主要由电机、电子控制板和位置反馈器三部分组成。当系统通过SG90 PWM信号控制电子控制板,电机内部的电机轴向上旋转或下旋转,以此产生转动机械上的输出轴,输出一定的转角位置。位置反馈器会读取输出轴的角度位置信息,并将该信息反馈给电子控制板,从而实现闭环控制。

四.SG90舵机的的角度控制

SG90舵机,首先,控制引脚都是三根线,分别是GND(棕色)、VCC(红色)、PWM(黄色),控制方式也是一样的PWM时序,具体的方法如下:

(1)采用PWM控制的方式来进行舵机的旋转
(2)舵机的控制需要MCU产生一个20ms的脉冲信号,以0.5ms到2.5ms的高电平来控制舵机的角度。
(3)高电平时间跟舵机旋转的角度对应关系:
0.5ms-------------0度;对应函数中占空比为2.5%
1.0ms------------45度;对应函数中占空比为5.0%
1.5ms------------90度;对应函数中占空比为7.5%
2.0ms-----------135度;对应函数中占空比为10.0%
2.5ms-----------180度;对应函数中占空比为12.5%

180舵机是根据接收到的PWM波高电平时间进行旋转,到了指定角度就不旋转了,再发同样的PWM波也不会旋转了,除非换高电平时间不同的PWM波。

视频演示

180度SG90舵机不同PWM波高电平时间对应旋转角度

五.STM32单片机驱动SG90舵机180度来回旋转实验

板子与SG90舵机(180度舵机)用杜邦线连接:
板子5V----红色线
板子A6----橙色线
板子G-----棕色线
5V USB线把板子与电脑相连

打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F103C8,再双击就创建新的工程
在这里插入图片描述
配置下载口引脚
在这里插入图片描述
配置外部晶振引脚
在这里插入图片描述
配置PWM输出,周期20ms
在这里插入图片描述

配置系统主频
在这里插入图片描述
配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述
生成工程
在这里插入图片描述
用Keil5打开工程
在这里插入图片描述
添加代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

主要程序:

extern uint16_t Pluse_Time;

/* USER CODE END 0 */

TIM_HandleTypeDef htim3;

/* TIM3 init function */
void MX_TIM3_Init(void)
{
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 71;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 19999;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = Pluse_Time;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  HAL_TIM_MspPostInit(&htim3);

}
uint16_t Pluse_Time=1000;//1毫秒脉冲,单位是us


/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();//8M外部晶振,72M系统主频

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM3_Init();//配置PWM输出,PA6
  /* USER CODE BEGIN 2 */

	
	Pluse_Time=500;//0.5ms高电平脉冲,用于控制舵机转到0度
	HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);//PWM停止输出
	MX_TIM3_Init();//重新初始化配置PWM波
	if (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) != HAL_OK)//PA6脚PWM输出
	{
	/* PWM generation Error */
	while(1);
	}
	HAL_Delay(300);//等待300ms
	HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);//PWM停止输出	

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */


			//以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°;		
			Pluse_Time=500;//高电平时间=0.5ms,旋转到0度
			MX_TIM3_Init();//重新初始化配置PWM波
			if (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) != HAL_OK)//PA6脚PWM输出
			{
			/* PWM generation Error */
			while(1);
			}
			HAL_Delay(1000);	
	  	HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);//PWM停止输出	

			Pluse_Time=2500;//高电平时间=2.5ms,旋转到180度
			HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);//PWM停止输出
			MX_TIM3_Init();//重新初始化配置PWM波
			if (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) != HAL_OK)//PA6脚PWM输出
			{
			/* PWM generation Error */
			while(1);
			}
			HAL_Delay(1000);
			HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);//PWM停止输出	

  }

  
  /* USER CODE END 3 */
}

六.CubeMX工程源代码下载

通过百度网盘分享的文件:36.SG90舵机180度旋转实验.rar
链接:https://pan.baidu.com/s/1WLVCu6Nf8-3e9AMOdIU5ag
提取码:0e3u
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行

CSDN代码下载

七.小结

SG90舵机目前在高档遥控玩具,如航模、包括飞机模型、潜艇模型、遥控机器人中已经使用得比较普遍。

  • 22
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值