单片机控制舵机

单片机控制舵机

1.简述

我这里用的是SG90舵机
总共三根线,控制好了三根线其实也就控制好了舵机
接线方法
红------------------------VCC-- 5V电压
暗棕色----------------------GND
橙色----------------------信号线

由此,我们可以知道,其实我们只要控制一根信号线就可以了

2.具体

原理:舵机内部有一个基准电压,微处理器产生的PWM信号通过信号线进入舵机产生直流偏置电压,与舵机内部的基准电压作比较,获得电压差输出。电压差的正负输出到电机驱动芯片上,从而决定正反转。当舵机开始旋转的时候,舵机内部通过级联减速齿轮带动电位器旋转,使得电压差为零,电机停止转动。
重点:作为一个单片机编写者,具体的原理,我们不必要搞清楚,我们只需知道如何控制它即可,以下将讲解如何控制舵机运转。
T为20ms
在这里插入图片描述第一步 :我们需要使用单片机产生周期为20ms,高电平t等于0.5ms-2.5ms之间的这样一个方波。定时器+中断产生这样的方波。
占空比 = t / T 相关参数如下:

t = 0.5ms——————-舵机会转动 0 °
t = 1.0ms——————-舵机会转动 45°
t = 1.5ms——————-舵机会转动 90°
t = 2.0ms——————-舵机会转动 135°
t = 2.5ms——————-舵机会转动180

第二步:简单讲一下编程思想吧,我所使用的是方法是定时器+中断,定时器每0.1ms中断一次,需要中断200次才能达到20ms。我们此时需要一个全局变量来记录中断的次数,当中断达到200次时,全局变量重新清零。当中断次数小于a时,信号线输出高电平,否则输出零。此时a的值对应关系如下(1–0度,2–45度,3–90度,4–135度,5–180度)。

第三步着重讲程序中一个语句的含义

//我定时器产生的100us
void pwm_Servomoto(void)
{  
 
    if(time_count<=set_value)//如果计数值小于设定值,就输出高电平
	       Sevro_moto_pwm=1; //Sevro_moto_pwm为接信号线的那个引脚
	else 
	       Sevro_moto_pwm=0;
	if(time_count>=200)//如果计数值大于200,就清0重新开始
			time_count=0;
		
}

附完整代码


 #include<AT89x52.H>
 #include <intrins.h>
 
 #define Sevro_moto_pwm     P2_3	   //信号线的引脚
unsigned char pwm_val_left  = 0;
unsigned char push_val_left =20;
   			
void pwm_Servomoto(void)
{  
 
    if(pwm_val_left<=push_val_left)
	       Sevro_moto_pwm=1; 
		else 
	       Sevro_moto_pwm=0;
		if(pwm_val_left>=200)
		{
			pwm_val_left=0;
		}
 
}
/***************************************************/
///*TIMER1中断服务子函数产生pwm信号*/
void time1()interrupt 3   using 2
{	
   	 TH1=(65536-100)/256;	  //100US
	 TL1=(65536-100)%256;		
	 pwm_val_left++;
	 pwm_Servomoto();
 }


void main(void)
{
	
	TMOD=0X11;
	TH1=(65536-100)/256;	  //100US
	TL1=(65536-100)%256;
	TR1= 1;
	ET1= 1;
	EA = 1;

	
  	push_val_left=20;


	while(1)		    
	{ 
		push_val_left=25-push_val_left;//使舵机来回摆动
	}
	  
    
}
发布了99 篇原创文章 · 获赞 27 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_44391957/article/details/103753098