当前位置:   article > 正文

【51单片机】SG90舵机控制_sg90舵机模块

sg90舵机模块


前言

本章将向大家介绍SG90舵机模块使用,通过本章的学习,让大家能快速上手51单片机应用开发


一、SG90舵机模块简介

1.舵机简介

舵机是一种位置(角度)伺服的驱动器,适用那些需要角度不断变化并可以保持的控制系统。舵机只是一种通俗的叫法,其实质是一个伺服马达。舵机主要分为模拟舵机和数字舵机。模拟舵机:需要不断的发送目的地PWM信号,才能旋转到指定位置。例如:我现在让它旋转90度,我就需要不断的发送90度的PWM信号直到到达指定位置才能停止。数字舵机:只需给一个目的地PWM信号,即可旋转到指定位置。例如:我现在让它旋转90度,我只需要发送一次90度的PWM信号,它就可以旋转到90度。
SG90模拟舵机在市面上十分常见,价格也比较便宜。常用于航模,机器人或智能小车等。如下图所示:
在这里插入图片描述
在这里插入图片描述

一个舵机有三条线:VCC(红线)、GND(棕色线)和信号线(橙色线)。只要通过信号线给予规定的控制信号即可实现舵机码盘的转动。


2.模块参数

(1)模块主要电气参数
使用电压:4.8V-6V
尺寸:221.5mmX11.8mmX22.7mm
重量:9g
无负载速度:0.12S/60度(4.8V)
堵转扭矩:1.2-1.4公斤/cm(4.8V)
使用温度:-30~+60摄氏度
死区设定:7us
高精度 可达0.2cm
(2)模块引脚
一个舵机有三条线:VCC(红线)、GND(棕色线)和信号线(橙色线)。只要通过信号线给予规定的控制信号即可实现舵机码盘的转动。


3.模块工作原理

舵机内部有一个基准电压,微处理器产生的PWM信号通过信号线进入舵机产生直流偏置电压,与舵机内部的基准电压作比较,获得电压差输出。电压差的正负输出到电机驱动芯片上,从而决定正反转。当舵机开始旋转的时候,舵机内部通过级联减速齿轮带动电位器旋转,使得电压差为零,电机停止转动。
我们无需了解其内部构造,只需知道如何通过PWM控制其转动即可。
①我们需要使用单片机产生周期为20ms,高电平t等于0.5ms-2.5ms之间的这样一个方波。可以使用定时器+中断产生这样的方波。波形如下所示:
在这里插入图片描述

高电平在一个周期(20ms)的持续时间对应的舵机角度,如下图所示:
在这里插入图片描述

②简单讲一下编程思想,我所使用的是方法是定时器+中断,定时器每0.5ms中断一次,需要中断40次才能达到20ms。我们此时需要一个全局变量来记录中断的次数,当中断达到40次时,全局变量重新清零。当中断次数小于a时,信号线输出高电平,否则输出零。此时a的值对应关系如下(1–0度,2–45度,3–90度,4–135度,5–180度)。
该方法在基础实验DAC实验已经讲解,其实就是产生PWM,通过控制PWM占空比来控制舵机旋转角度。


二、硬件设计

1.硬件准备

本实验所需要的硬件资源如下:
①普中51开发板1个
②SG90舵机模块1个
③USB线1条(用于供电和程序下载)


2.硬件连接

接线说明:SG90舵机模块–>单片机IO
橙色(信号线)–>P21
红色(电源正)–>5V
褐色(电源负)–>GND

	  独立按键模块-->单片机IO
	  K1-->P31
	  K2-->P30
  • 1
  • 2
  • 3

在这里插入图片描述


三、软件设计

本实验程序是在开发板基础实验“LCD1602液晶显示实验”基础上修改,在App文件夹内新建了key、pwm文件夹用于存放按键和PWM相关的驱动程序,在该文件夹内均新建了2个文件,一个.c源文件和一个.h头文件。将该文件添加到App工程组中,并添加对应头文件路径,这些操作如果不会请看基础实验视频教程,此处不再重复。添加好的工程如下所示:
在这里插入图片描述
key.c是独立按键实验相关代码,PWM是DAC实验代码,我们仅对SG90舵机控制相关代码进行讲解,其它代码看基础实验教程。


1.main.c文件

main.c文件比较简单,就是将前面的功能代码进行整合。如下:

/**************************************************************************************
实验名称:SG90舵机实验
接线说明:SG90舵机模块-->单片机IO
		  橙色(信号线)-->P21
		  红色(电源正)-->5V
		  褐色(电源负)-->GND

		  独立按键模块-->单片机IO
		  K1-->P31
		  K2-->P30
		  	
实验现象:下载程序后,按下K1键控制舵机正转,按下K2键控制舵机反转
注意事项:																				  
***************************************************************************************/
#include "public.h"
#include "key.h"
#include "pwm.h"

/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	
	u8 key=0;
	u8 duty_value=0;

	pwm_init(0XFE,0X33,40,duty_value);//定时时间为0.5ms,PWM周期是40*0.5ms=20ms,初始占空比为0ms
	
	while(1)
	{
		key=key_scan(0);
		if(key==KEY1_PRESS)	
		{
			if(duty_value<=3)
				duty_value+=1;//以0.5ms步进递增45度
			pwm_set_duty_cycle(duty_value);
		}
		else if(key==KEY2_PRESS)
		{
			if(duty_value>=1)
				duty_value-=1;//以0.5ms步进递减
			pwm_set_duty_cycle(duty_value);
		}				
	}	
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

在main函数中,首先调用pwm_init(0XFE,0X33,40,duty_value)函数,将定时器0中断时间设置为0.5ms,即每0.5ms进入一次中断,PWM周期为400.5ms=20ms。占空比通过变量duty_value改变,初值为0,此时舵机默认为0度。然后进入while循环中,检测K1和K2键是否按下,若K1键按下,duty_value加1,即以0.5ms为步进增加,且修改占空比值,此时舵机也以45度修改,最大增加到4,即2ms高电平(445度=180度,和理论中高电平时间对应角度有偏差,但依然是180度旋转)。若K2键按下,duty_value减1,即以0.5ms为步进递减,且修改占空比值,此时舵机也以45度修改,最小减到0。


四、实验现象

B站演示视频:https://space.bilibili.com/444388619

在这里插入图片描述


联系作者

B站演示视频:https://space.bilibili.com/444388619
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/456577
推荐阅读
相关标签
  

闽ICP备14008679号