51单片机按键控制舵机旋转

51单片机按键控制舵机旋转

---------------------------------------------------------------------------------------------------------------------------------

1.舵机的与单片机的连接

2.PWM波的简单了解

3.程序示例

4.开发程序难点

---------------------------------------------------------------------------------------------------------------------------------

1.舵机的与单片机的连接


    如图所示,舵机正极接单片机vcc,负极接gnd,signal的连接可自定义。

---------------------------------------------------------------------------------------------------------------------------------

2.PWM波的简单了解

    51单片机通过按键来控制舵机正反转,需要通过PWM波来实现,本文仅对如何使用PWM波控制舵机旋转做出解释。

    对于一般的舵机来说,所对应的PWM波的周期为200ms,即单片机信号口输出200ms为一个周期。设信号口输出‘1’的时间为 x ms,剩余时间均输出‘0’,x/200的比值即为占空比的值。单片机通过控制占空比的值来控制舵机的旋转。

    对于常见的舵机来说,占空比的值与对应的角度有以下关系:

    0.5ms/200ms = 0 度

    1.0ms/200ms = 45 度

    1.5ms/200ms = 90 度

    2.0ms/200ms = 135 度

    2.5ms/200ms = 180 度

    在51单片机中,通过定时器来计时,通过信号输出口输出‘1’或‘0’来控制舵机的旋转。

---------------------------------------------------------------------------------------------------------------------------------

3.程序示例

#include<reg52.h>  


sbit key1 = P3^2;  
sbit key2 = P3^3;
sbit pwm1 = P2^0;  


unsigned int target =12,percent = 0;  
  
void Timer0Initial();  
void initial_Timer();  
void delay(unsigned int x);  
void keyscan();  


void keyscan()  
{
delay(30);
if(key1 == 0)  
  {  
delay(10);  
    if(key1 == 0)  
    {  
if(target >= 5)  
target -= 1;   
    }    
  }  
  
  if(key2 == 0)  
  {  
delay(10);  
    if(key2 == 0)  
{  
if(target <= 25)  
target += 1;   
    }  
  }  

  
void initial()  
{  
key1 = 1;  
  key2 = 1;  
  initial_Timer();  
}  


void Timer0Initial()  
{  
  TH0 = (65536-65)/256;  
  TL0 = (65536-65)%256;  

  
void initial_Timer()  
{  
  EA = 1; 
  ET0 = 1; 
  TMOD = 0x01;
  Timer0Initial();  
  TR0 = 1;
}  
  
void delay(unsigned int x)  
{  
  unsigned int i,j;  
  for(i=x;i>0;i--)  
    for(j=110;j>0;j--); 



void main()  
{  
  initial();  
  while(1)  
  {  
    keyscan();  
  }  
}


void Timer0() interrupt 1 using 0  

percent+=1;
if(percent<=target)
pwm1=1;
else
pwm1=0;
if(percent==200)
percent=0;
  Timer0Initial();  

}

    注释:

    P3^3和P3^2为独立按键,P2^0为输出信号口。

---------------------------------------------------------------------------------------------------------------------------------

4.开发程序难点

    在实际进行操作时,常常会遇到两种情况而导致程序无法正常运行:

    1>程序运行速度与舵机转速的不匹配

        在实际操作时,由于舵机的转动与程序中target的增加并不是同步进行的,这就会导致松开按键时,由于程序运行速度远大于舵机转动速度,target的值已经到达25,但是舵机直转到90度位置,松开按键后会继续旋转。

        解决方法为,在keyscan函数中添加延时语句delay()来使程序运行速度变慢,通过多次尝试使得舵机旋转角度与target的值同步。

    2>0.5ms到2.5ms的区间并不能使得舵机从0度转到180度

        不同的舵机可能由于制作精度的区别而导致误差,可以通过调整PWM波的占空比来确定具体的角度。

        比如,我使用的舵机从0到180度实际的PWM波的ms为6ms~27ms,我室友的舵机从0到180度实际的PWM波为4~18ms。

猜你喜欢

转载自blog.csdn.net/overwatcher/article/details/80215520