用51单片机怎么玩SG90舵机?

什么是舵机?

这是来自百度的解释:舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。

百度上还有很大一部分解释,但我觉得那都是放屁,看再多解释不如一张实物图来的实在。

怎么驱动这个东西?

PWM信号

什么是PWM信号?

PWM ,英文名 Pulse Width Modulation ,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进
行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通
过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的
时间占据整个信号周期的百分比,例如方波的占空比就是 50%.
使用PWM来控制舵机,理解占空比是关键。

 

如何实现PWM信号输出?

有一些芯片上是集成了PWM的,这可以在芯片手册和原理图上看出来。在这里,因为我使用的51芯片并没有PWM的管脚,所以我是用的软件来实现信号输出。当然,这种输出方式肯定是没有硬件PWM那么好,软件会存在一定的误差。

怎么控制舵机?

向黄色信号线“灌入”PWM信号

怎么让舵机转动多少度这个问题,其实很简单。我的解决方法是,直接用现成的数据不就好了吗。

 0.5ms-------------0度; 2.5% 对应函数中占空比为250

1.0ms------------45度; 5.0% 对应函数中占空比为500

1.5ms------------90 度; 7.5% 对应函数中占空比为 750
2.0ms-----------135 度; 10.0% 对应函数中占空比为 1000
2.5ms-----------180 度; 12.5% 对应函数中占空比为 1250

编程实现

用51单片机使舵机运动起来,其实也挺简单的。用一个小实验来看看怎么让舵机动起来。这个小实验要让舵机每隔两秒转动一次。除了要用到PWM,还要用到定时器和中断。

先来配置定时器

void Time0Init()
{
    //定时器模式选择
    TMOD = 0X01;
    //给定初始值  我们先定一个0.5ms
    TL0 = 0X33;
    TH0 = 0XFE;
    //开启定时器
    TF0 = 0;
    TR0 = 1;
}

定时器开启了,但这还没完。我们还需要用到中断,因为定时器每到0.5ms的时候就会溢出,需要CPU响应中断才可以将溢出标志位清0。刚好定时器0就有中断寄存器,可以实现中断响应。

所以完整的定时器配置应该是这样的:

void Time0Init()
{
    TMOD = 0X01;
    TL0 = 0X33;
    TH0 = 0XFE;
    TR0 = 1;
    TF0 = 0;
    //开启定时器0中断
    ET0 = 1;
    //开启总中断
    EA = 1; 
}

有中断了,那自然就要有中断处理函数吧。定时器爆表的时间是0.5ms,上面说的占空比和让舵机转动角度的数据就派上用场了:

占空比:

就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比

 0.5ms-------------0度; 2.5% 对应函数中占空比为250

1.0ms------------45度; 5.0% 对应函数中占空比为500

1.5ms------------90 度; 7.5% 对应函数中占空比为 750
2.0ms-----------135 度; 10.0% 对应函数中占空比为 1000
2.5ms-----------180 度; 12.5% 对应函数中占空比为 1250
中断处理函数
void Time0Handler() interrupt 1
{
    cnt++;  //统计爆表次数
    //重新给初值:因为CPU响应中断之后,中断处理函数才会被执行,这个时候TL0和TH0都需要重新赋值
    TL0 = 0X33;
    TH0 = 0XFE;
    if(cnt < jd)   //jd  角度
    {
        sg90_con = 1;  //给舵机高电平
    }else{
        sg90_con = 0;  //给舵机低电平
    }

    if(cnt == 40)   //一个周期20ms   0.5*40
    {
        cnt = 0;
    }
}

主函数

void main()
{
    jd = 1;
    Time0Init();  //定时器初始化
    sg90_con = 1; //舵机初始状态是高电平
    
    while(1)
    { 
        jd = 3;    //转动90度
        cnt = 0;
        Delay2000ms();
        jd = 1;
        cnt = 0;
        Delay2000ms();
    }
    
}

全部代码:

#include "reg52.h"

sbit sg90_con = P1^1;

int jd;
int cnt = 0;

void Delay2000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	
	i = 15;
	j = 2;
	k = 235;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void Delay300ms()		//@11.0592MHz
{
	unsigned char i, j, k;


	i = 3;
	j = 26;
	k = 223;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void Time0Init()
{
	
	TMOD = 0X01;
	
	TH0 = 0XFE;
	TL0 = 0X33;
	
	TR0 = 1;
	TF0 = 0;
	
	ET0 = 1;
	
	EA = 1;
	
}
void main()
{
	1
	jd = 1;  
	Time0Init();  
	sg90_con = 1;  
	
	while(1)
	{
		jd = 3; 
		cnt = 0;
		Delay2000ms();
		jd = 1; 
		cnt = 0;
		Delay2000ms();
	}
}

void Time0Handler() interrupt 1
{
	cnt++;  
	
	TH0 = 0XFE;
	TL0 = 0X33;
	if(cnt < jd)   
	{
		sg90_con = 1; 
	}else{
		sg90_con = 0;		
	}
	
	if(cnt == 40)   
	{
		cnt = 0;
		sg90_con = 1;
	}
}

  • 44
    点赞
  • 203
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要实现51单片机控制sg90舵机360旋转后停止,我们需要使用PWM(脉宽调制)信号来控制舵机的角。 首先,我们需要连接舵机单片机。将舵机的地线(GND)连接到单片机的地线(GND),然后将舵机的电源线(VCC)连接到单片机的电源线(5V)。最后,将舵机的控制线(信号线)连接到单片机的某个IO口上。 接下来,我们需要编写51单片机的程序来控制舵机旋转。我们可以使用定时器中断来生成PWM信号。 首先,我们需要配置定时器的工作模式为PWM输出模式,并设置定时器的周期,周期的计算公式为PWM周期=(定时器的值/定时器的分频系数)*单片机的主频。 然后,我们需要设置比较寄存器的值来控制舵机的角舵机的角通常通过控制PWM信号的占空比来实现,PWM信号的占空比与舵机之间有一定的对应关系。我们可以根据舵机的规格手册来确定具体的对应关系。比如,舵机的第0对应的占空比为最小值,第180对应的占空比为最大值。 对于360旋转,我们可以设置连续的PWM信号,并在每个PWM信号周期内逐渐增加或减小占空比,以模拟舵机的连续旋转。当舵机旋转到360时,我们可以停止发送PWM信号,从而停止舵机旋转。 最后,我们需要将编写好的程序烧录到51单片机上,并将单片机连接到舵机,以实现控制舵机360旋转后停止的功能。 总结一下,通过配置定时器的PWM输出模式和设置比较寄存器的值,我们可以使用51单片机控制sg90舵机360旋转后停止的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值