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。

  • 49
    点赞
  • 208
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
以下是一个简单的51单片机按键控制舵机的代码: ```c #include <reg52.h> sbit KEY = P1^0; // 定义按键输入口 sbit SERVO = P2^0; // 定义舵机控制口 void delay(unsigned int t) { // 延时函数 unsigned int i; while (t--) { for (i = 0; i < 500; i++); } } void main() { unsigned char cnt = 0; // 定义计数器,用于计算按键按下次数 unsigned char flag = 0; // 定义标志位,用于标记舵机当前状态 while (1) { if (KEY == 0) { // 检测按键是否按下 delay(5); // 消抖延时 if (KEY == 0) { cnt++; // 计数器加1 if (cnt == 10) cnt = 0; // 计数器满10清零 } while (!KEY); // 等待按键释放 } switch (cnt) { // 根据计数器的值控制舵机 case 0: if (flag == 0) break; // 如果舵机已经在该位置,直接跳过 SERVO = 0; // 控制舵机旋转到0度位置 delay(20); // 延时等待舵机旋转到位 SERVO = 1; // 停止控制舵机 flag = 0; // 标志位更新为0 break; case 5: if (flag == 1) break; // 如果舵机已经在该位置,直接跳过 SERVO = 0; // 控制舵机旋转到90度位置 delay(20); // 延时等待舵机旋转到位 SERVO = 1; // 停止控制舵机 flag = 1; // 标志位更新为1 break; case 9: if (flag == 2) break; // 如果舵机已经在该位置,直接跳过 SERVO = 0; // 控制舵机旋转到180度位置 delay(20); // 延时等待舵机旋转到位 SERVO = 1; // 停止控制舵机 flag = 2; // 标志位更新为2 break; default: break; } } } ``` 此代码中使用一个计数器来记录按键按下的次数,根据计数器的值来控制舵机旋转到不同的位置。同时使用一个标志位来标记当前舵机的位置,避免重复控制舵机。需要注意的是,舵机的控制方式可能因舵机型号而异,需根据具体型号的控制方式进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值