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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

这位博主做的代码,在此基础上进行简单修改成可以用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单片机时总结的,由于需要控制舵机旋转任意角度,网上也找不到相关内容,所以自己摸索出来,本人知识水平有限,难免出现错误,欢迎指出。

控制舵机任意角度,可以使用51单片机的PWM输出功能。具体实现方法如下: 1. 首先需要确定你使用的舵机的工作电压和控制信号的频率。一般来说,舵机的工作电压为4.8V-6V,控制信号的频率为50Hz。 2. 然后需要根据舵机的工作原理,将控制信号的占空比转换为舵机的角度。一般来说,舵机的角度范围是0度到180度,对应的控制信号的占空比范围是0.5ms到2.5ms。 3. 接着,可以使用51单片机的PWM输出功能,将控制信号的占空比输出到舵机上,从而控制舵机的角度。 下面是一个简单的51单片机控制舵机任意角度的代码示例: ```c #include <reg52.h> #define SERVO_PIN P1_0 void delay(unsigned int t) { while (t--); } void servo_set_angle(unsigned char angle) { unsigned int pulse_width; pulse_width = (unsigned int)(angle * 11.11 + 500); // 将角度转换为占空比 SERVO_PIN = 1; // 输出高电平 delay(pulse_width); // 延时占空比对应的时间 SERVO_PIN = 0; // 输出低电平 delay(20000 - pulse_width); // 延时剩余的时间 } void main() { while (1) { servo_set_angle(0); // 控制舵机到0度 delay(10000); // 延时一段时间 servo_set_angle(90); // 控制舵机90度 delay(10000); // 延时一段时间 servo_set_angle(180); // 控制舵机到180度 delay(10000); // 延时一段时间 } } ``` 这个代码示例中,我们使用P1_0口作为舵机控制信号输出口,通过调用`servo_set_angle()`函数来控制舵机的角度。在`servo_set_angle()`函数中,我们将角度转换为对应的占空比,并使用延时函数控制舵机的运动。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值