基于51单片机让SG90舵机动起来

外观:

接线方法:

  • 棕色----------------GND
  • 红色----------------VCC
  • 橙色----------------信号线

 原理:

舵机内部有一个基准电压,微处理器产生的PWM信号通过信号线进入舵机产生直流偏置电压,与舵机内部的基准电压作比较,获得电压差输出。电压差的正负输出到电机驱动芯片上,从而决定正反转。当舵机开始旋转的时候,舵机内部通过级联减速齿轮带动电位器旋转,使得电压差为零,电机停止转动。

怎么样才能让舵机动起来呢?                                                                                                           既然舵机是靠脉冲驱动的,那我们给舵机一定的脉冲就能够让它动起来。                                    有一个时间周期(20ms),如果高电平占1ms,低电平占19ms,那么占空比就是5%,这里有舵机旋转所需的占比(以180°舵机为例):

0.5ms
  
  0度
  
  1ms
  
  45度
  
  1.5ms
  
  90度
  
  2ms
  
  135度
  
  2.5ms
  
  180度

由次可以知道,高电平占空比越大,舵机旋转角度越大,记住舵机有最大角度限制,占空比最大不能大过可旋转角度所需占空比,不然舵机转不过去,卡在那里,对舵机的寿命也有一定影响。

软件设计:

我们知道想让舵机转动,必须给舵机一个脉冲,脉冲说白了就是高低电平,高低电平的占比不同,转的角度也就不同。
这里使用51的定时器,每过0.1ms计时一次,20ms为一个周期,同时定义一个变量,一个常量,将二者进行比较即可。

程序:

//实际上想让舵机转到指定角度,是需要自己实验的,每个舵机都不一样,原理是参考的。
#include <reg52.h>
 
sbit SEV_PWM = P1^7;       						//设定PWM输出的I/O端口,有个引脚输出

unsigned char count = 0;							//比较值
unsigned char SEV_conut=9; 						//pwm控制值

/*延时程序*/
void Delay(unsigned int s)
{
	unsigned int i;
	for(i=0; i<s; i++);
	for(i=0; i<s; i++);
}
 
/*定时器T0初始化*/
void Com_Init()           
{
    TMOD |= 0x01;               		  //定时器T0设置成方式1
    TH0 = 0xff;                		    //定时常数 0.1ms 晶振为11.0592MHz
    TL0 = 0xa4;
    ET0 = 1; 													//中断标志    
    TR0 = 1; 													//定时器开关
    EA=1;   												  //总开关
}
	
/*T0中断初始化*/
void Time0_Init() interrupt 1 
{
			TR0 = 0; 												//定时器开关
			TH0 = 0xff;                  		//重装时间常数 0.1ms
			TL0 = 0xa4;
	        count++;                       //比较值,很关键
			if(count <= SEV_conut)        	//5==0° 10==90°
			{ 
						SEV_PWM = 1;          	  //高电平
			}
			else 
			{ 
						SEV_PWM = 0;             //低电平
			}
		  
			if (count >= 200)              //T = 20ms清零  20ms为周期,重新开始
			{ 
						count = 0; 
			}
			TR0 = 1;                       //开启T0
}

void main()
{
		Com_Init();							//中断初始化,打开定时器
		while(1)
		{	
			SEV_conut=9;  
			count=0;                         //重新赋值,重新比较
			Delay(50000);                    //延时是为了留一些时间给舵机反映。
			SEV_conut=2;
			count=0;
			Delay(50000);
			SEV_conut=17;
			count=0;
			Delay(50000);
		}
}

总结:

控制舵机其实就是控制输出PWM,而PWM的输出就需要配置51单片机的定时器,总的来说还是要对51单片机的定时器熟悉。

  • 3
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值