zl程序教程

您现在的位置是:首页 >  大数据

当前栏目

51单片机SG-90系列舵机的配置原理以及源码

配置源码单片机原理 系列 以及 51 90
2023-09-11 14:19:59 时间

一、实验原理

1、舵机转动的原理(如下图所示)

请添加图片描述

1,根据上图我们可以得知,要想控制舵机转动指定的角度,必须要让它在一定的周期(20ms)中,获得一定时间(分别是0.5ms、1ms、1.5ms、2ms、2.5sm)的高电平,具体对应关系,上图中已给出。

1,现在我们要做的就是生成一个周期为20ms的PWM波,通过设定一个比较值(最大为20ms),用来控制我们的高电平时间,进而控制舵机转动指定角度。

2、生成PWM波的原理

(1)用定时来实现,设定一个初始值,使其溢出时间为500us,再设定一个计数值,控制PWM波的周期,该值最大为40(500us*40=20 000us),如此便设定了周期为20ms;计数值会一直和比较值做比较,这样就可以实现高电平时间的控制。

(2)通过上述三个值的调节,就可以实现舵机不同角度的转动。

二、关键代码

主函数:(注释紊乱是编码的问题,复制到Keil5里选择ANSI编码就没问题了)

/*
			Ä£Äâ¶æ»ú¿ØÖÆÔ­Àí£º0~180¡ã
				0.5ms-----0¶È
				1.0ms-----45¶È
				1.5ms-----90¶È
				2.0ms-----135¶È
				2.5ms-----180¶È
*/

#include <REGX52.H>
#include "timer0.h"
#include "delay.h"

sbit SG_PWM=P2^0;							 //ÐźſØÖÆÒý½Å						 ºì¡ª¡ªVCC ×Ø¡ª¡ªGND »Æ¡ª¡ªÐźÅÏß
unsigned char count=0;					     //¼Æ´Î  ¸³³õֵΪ0
unsigned char PWM_count=0;                   //0--0¶È£¬2--45¶È£¬4--90¶È£¬6--135¶È£¬8--180¶È

void main()
{
  Timer0_Init();
  while(1)
  {
			PWM_count=1;	  //¶æ»úת¶¯0¶È(0.5ms)
			Delay(1000);
			PWM_count=2;	  //¶æ»úת¶¯45¶È(1ms)
			Delay(1000);
			PWM_count=3;	  //¶æ»úת¶¯90¶È(1.5ms)
			Delay(1000);
			PWM_count=4;	  //¶æ»úת¶¯135¶È(2ms)
			Delay(1000);
			PWM_count=5;	  //¶æ»úת¶¯180¶È(2.5ms)
			Delay(1000);
   }
}

void Timer0() interrupt 1      //Ìرð×¢Òâ´Ë´¦£¬0--ÍⲿÖжÏ0£¬1--¶¨Ê±Æ÷ÖжÏ0£¬2--ÍⲿÖжÏ1£¬3--¶¨Ê±Æ÷ÖжÏ1£¬4--´®ÐпÚÖжÏ1
{

  TL0 = 0x33;		
  TH0 = 0xFE;			 	//ÖØи³¼ÆʱÆ÷³õֵΪ0.5ms

    count++;					//¼Æ´Î£¬Ã¿500us¼ÇÒ»´Î  count+1
	count%=40;				//ÿ¸öÖÜÆÚΪ20ms
	
  if(count<PWM_count)
  {									
    SG_PWM=1;
  }
  else
  {
    SG_PWM=0;
  }
}

定时器0

#include <REGX52.H>

void Timer0_Init()	
{
	TMOD &= 0xF0;		//ÉèÖö¨Ê±Æ÷ģʽ
	TMOD |= 0x01;		//ÉèÖö¨Ê±Æ÷ģʽ
	TL0 = 0x33;		    //ÉèÖö¨Ê±³õʼֵ
	TH0 = 0xFE;		    //ÉèÖö¨Ê±³õʼֵ
	ET0 = 1;            //´ò¿ª¶¨Ê±Æ÷0µÄÖжÏ
	TF0 = 0;			//Çå³ýÒç³öÖжϱê־λ
	TR0 = 1;			//¶¨Ê±Æ÷0¿ªÊ¼¼Æʱ
	EA = 1;      	    //¿ª×ÜÖжÏ
}

延时函数:

void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

注:若要实现不同角度的控制,只需要改变 PWM_count的值就好。