admin管理员组

文章数量:1558937

目录

一、SG90舵机模块介绍

二、SG90舵机模块接线说明

三、测试说明、SG90舵机驱动代码

四、串口调试助手把采集的SG90舵机数据发送出来

五、源代码

六、串口调试助手软件

七、舵机原理图资料 


一、SG90舵机模块介绍

        首先介绍说一下什么是舵机。舵机是一种位置(角度)伺服的驱动器。适用于一些需要角度不断变化的,可以保持的控制系统。sg90就是舵机的一种。

        舵机的工作原理比较简单。舵机内部有一个基准电压,单片机产生的PWM信号通过信号线进入舵机,与舵机内部的基准电压作比较,获得电压差输出。电压差的正负输出到电机驱动芯片上,从而决定正反转。开始旋转的时候,舵机内部通过级联减速齿轮带动电位器旋转,使得电压差为零,电机停止转动。 “舵机是一种直流微型伺服电机,它能够接收并响应控制信号,实现角度或位置的精确控制。舵机通常由直流电机、电机控制器、电位器和减速器等部分构成,并封装在一个便于安装的外壳中。它通过闭环控制系统来工作,能够根据输入的信号精确地控制输出轴的角度,并在负载变化时自动调节以保持稳定的控制状态。舵机的应用非常广泛,包括在自动驾驶仪中操纵飞机舵面,以及在智能小车和机器人中实现转向和关节运动等功能。舵机可以分为不同的类型和角度,其中180°舵机最为常见。”

        舵机一般可以再0-180度或0-360度转动任意角度,经常用于小车小船转向控制和机械臂的关节等。舵机的转动角度范围不是固定的,请购买时问问商家,到底是哪个范围的。实际使用中,我们对舵机有两个基本需求:

  1. 舵机转动一定角度。
  2. 舵机转动时,控制者要求舵机转到一个新的角度。

机器如何给舵机发送其转动角度呢?首先,要低成本,信号线要少。其次,要满足任意角度和中途打断。设计者推出了一个简单的方法:用一个时长为20ms的信号去控制舵机,信号的前一段为高电平,持续时间0.5ms到2.5ms,代表转动角度0-180或者360度,后半段为低电平,这就是PWM信号,具体如下图:


 

        容易看出来,PWM信号利用前段为高电平持续时间控制旋转角度,本质用占空比控制了旋转角度。运转时,舵机转到你指定的角度需要一定的时间,转动的角度越大,需要的时间越久,所以你可能需要等待一定的时间。如果你刚刚给舵机发送指令转到180度,紧接着又发送指令转到90度,舵机会不转到180度再转到90度,而是在接受到信号时直接在当前的角度直接转到90度去。

二、SG90舵机模块接线说明

1 红色线 外接3.3V-5V

2 黑色线 外接GND

3 橙色线  接单片机PA1引脚

三、测试说明、SG90舵机驱动代码

编译环境:keil5

测试单片机: STM32F103C8T6

功能:功能1:按键控制舵机旋转              功能2:0-180°循环旋转

PWM.c文件编写舵机驱动代码如下:

#include "stm32f10x.h"                  // Device header

void PWM_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	TIM_InternalClockConfig(TIM2);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 20000 - 1;		//ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;		//PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
	TIM_OC2Init(TIM2, &TIM_OCInitStructure);
	
	TIM_Cmd(TIM2, ENABLE);
}

void PWM_SetCompare2(uint16_t Compare)
{
	TIM_SetCompare2(TIM2, Compare);
}

PWM.h文件,对舵机驱动函数经行了声明:

#ifndef __PWM_H
#define __PWM_H

void PWM_Init(void);
void PWM_SetCompare2(uint16_t Compare);

#endif

四、串口调试助手把采集的SG90舵机数据发送出来

printf("舵机旋转角度= %d °\r\n",Angle);

五、源代码

《STM32单片机+SG90舵机+OLED屏幕+舵机旋转角度数据发送到串口调试助手》源代码_sg90舵机资源-CSDN文库

六、串口调试助手软件

串口调试助手-keil5调试工具资源-CSDN文库

七、舵机原理图资料 

SG90舵机原理图、模块资料资源-CSDN文库

本文标签: 舵机发送到串口单片机源代码