使用51单片机实现SG90舵机任意角度转动

参考单片机——SG90舵机工作原理_掏一淘哆啦A梦的奇妙口袋的博客-CSDN博客​​​​​​

这位博主做的代码,在此基础上进行简单修改成可以用51单片机的定时器和中断实现SG90舵机任意角度转动

完整代码如下:

#include <REGX52.H>
 
sbit PWM=P0^0;      //对应舵机的PWM引脚,自己修改
int count=0;        //全局变量count用于定时器计数
int c=0;	        //这个值为高低电平的临界值,可以改变,
                    //这里初始化为0表示开始让舵机复位到0度位置(输出0.5ms的高电平)

int th;
int tl;
int co;

			
void angle_Init(int angle)    //这里定义一个函数,根据不同角度进行定时器初值的修改
{
	th=(65536-(11.0592/12)*(500+angle/0.09));
	tl=(65536-(11.0592/12)*(500+angle/0.09));
	co=((20000*11.0592/12)/(500+angle/0.09));
}



void Timer_Init()
{
  TMOD=0X01;      
  TH0=th/256;
  TL0=tl%256;       
  ET0=1;          
  TR0=1;          
  EA=1;           
}


void main()
{
	angle_Init(0);
	Timer_Init();
	
	while(1);
}


void Timer() interrupt 1     
{
  TH0=th/256;
  TL0=tl%256;       
  
  if(count<=c)	
  {
    PWM=1;		
  }
  else
  {
    PWM=0;
  }
  count++;
	
  if(count>=co)		
  {
    count=0;
  }
}

 这里对主要的内容进行解释。

	th=(65536-(11.0592/12)*(500+angle/0.09));
	tl=(65536-(11.0592/12)*(500+angle/0.09));

根据51单片机定时器计数初值的计算方法,这里采用模式1,最大计数为2^16,晶振为11.0592MHz,所以计数初值为

t=65536-(11.0592/12)*time

注意这里计时时间单位应该为us。按照所参考的SG90舵机的资料,我们可以得到高电平时间和转角之间的关系

time=500+angle/0.09

代入上式即可。

co=((20000*11.0592/12)/(500+angle/0.09));

 这里主要是考虑一个周期20ms时要清零进行下一周期。主要就是根据count参数,当count大于co时进行清零。所以co的计算就是在20ms内count++了几次。20ms共需要计数20000*11.0592/12次,除以一次定时计数次数(500+angle/0.09)。

本文章是在自己学习51单片机时总结的,由于需要控制舵机旋转任意角度,网上也找不到相关内容,所以自己摸索出来,本人知识水平有限,难免出现错误,欢迎指出。

物联沃分享整理
物联沃-IOTWORD物联网 » 使用51单片机实现SG90舵机任意角度转动

发表评论