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

本文介绍了一种通过51单片机的定时器和中断来控制SG90舵机任意角度转动的方法。代码中定义了一个函数根据角度调整定时器初值,以实现不同角度的转动。在20ms的周期内,依据计数器count和预设值co进行高电平时间的控制,达到设定角度。
摘要由CSDN通过智能技术生成

参考单片机——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单片机时总结的,由于需要控制舵机旋转任意角度,网上也找不到相关内容,所以自己摸索出来,本人知识水平有限,难免出现错误,欢迎指出。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值