SG90舵机介绍

舵机简介

舵机是一种位置(角度)伺服的驱动器,适用那些需要角度不断变化并可以保持的控制系统。舵机只是一种通俗的叫法,其实质是一个伺服马达。舵机主要分为 模拟舵机和数字舵机

  • 模拟舵机:需要不断的发送目的地PWM信号,才能旋转到指定位置。例如:我现在让它旋转90度,我就需要不断的发送90度的PWM信号直到到达指定位置才能停止。

  • 数字舵机:只需给一个目的地PWM信号,即可旋转到指定位置。例如:我现在让它旋转90度,我只需要发送一次90度的PWM信号,它就可以旋转到90度。

一个舵机有三条线:VCC(红线),GND(棕色线),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度 其实就是产生PWM, 通过控制PWM占空比来控制舵机旋转角度

main.c

/*********************************************************************************
* 【函数功能】: 	舵机使用
接线:红色->VCC
      棕色->GND
			橙色->P3^5
**********************************************************************************/

# include <reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;

sbit PWM=P3^5;//设定PWM输出的I/O口端口

u8 count=0;
u8 timer1;


void delay_ms(u16 ms)
{
	u16 i,j;
	for(i=ms;i>0;i--)
	{
		for(j=110;j>0;j--);
	}
}

//定时器T0初始化
void Timer0_Init()
{
	TMOD &=0x00;
	TMOD |=0x01;//定时器T0设置成方式1
	TH0=0xFF;//定时器常数 0.1ms  晶振11.0952
	TL0=0xA4;
	ET0=1;
	TR0=1;
	EA=1;
}
//T0中断初始化
void Time0_Init() interrupt 1
{
	TR0=0;
	TH0=0xFF;
	TL0=0xA4;
	if(count<=timer1)
	{
		PWM=1;
	}
	else
	{
		PWM=0;
	}
	count++;
	if(count>=200)//T=20ms清零
	{
		count=0;
	}
	TR0=1;//开启T0
}

void main()
{
	Timer0_Init();
	while(1)
	{
		
		timer1=6;//舵机0度位置
		count=0;//让定时器重新计数
		delay_ms(1000);
		timer1=19;//不知道为什么我的不能超过20不然会转圈
		count=0;
		delay_ms(1000);
			delay_ms(1000);
	}
}