关于Arduino 用Servo库控制舵机出现抖动的问题

   这几天练习用Arduino通过Servo库控制舵机转动,在中loop中先有几秒让舵机停在0度,然后转到另外一个角度,就在这等待的几秒钟内,舵机不淡定了,不规则地抖动,等到让它转到指定角度时,它也能转过去。我推测这一定是控制程序的问题。在网上查找资料,发现下面的一段话说的靠谱:
     在Arduino中,servo是一个库,可以简单的操作舵机。但从servo库的底层代码上来看,它使用了定时器中断,如果你调用了servo库,同时还使用串口通信的功能,那么,恭喜你,对于部分Arduino的板卡来说,一定会抖动。原因很简单,因为串口通信和servo都要使用定时器,所以就不正常了。
    就像我一直在教学Arduino的过程中所强调的那样,库是别人写好你来用的,核心的东西你不知道,没准什么时候就有问题就冲突了,要想学好学精,还是要自己通过代码来实现各种功能,不仅性能好,而且还锻炼了你自己的综合能力。
    提示你一点关于舵机的知识。驱动舵机,需要产生PWM信号,普通模拟舵机能识别50HZ的PWM信号,其中每个信号周期内,高电平的持续时间代表舵机的驱动角度。500uS为最小舵量,1500为中立舵量,2500为最大舵量,你可以使用micros()这个函数来精确控制高电平的持续时间。
       既然这样,那就重写一段好了:
       void servopulse(int angle)//定义一个脉冲函数
     {
 
         int pulsewidth=(angle*11)+500;  //将角度转化为500-2480的脉宽值,每多转1度,对应高电平多11us
 
         digitalWrite(servopin,HIGH);    //将舵机接口电平至高
 
         delayMicroseconds(pulsewidth);  //延时脉宽值的微秒数
 
         digitalWrite(servopin,LOW);     //将舵机接口电平至低
 
         delayMicroseconds(20000-pulsewidth);   
 
     }    
在setup里设置    pinMode(servopin,OUTPUT);//设定舵机接口为输出接口
在Loop里这样调用:
   for(int i=0;i<50;i++)  //发送50个脉冲   //为什么是50个?
  {
       servopulse(angle);   //引用脉冲函数
  }

关于舵机的扭矩和角度周期示意图如下:
关于Arduino 用Servo库控制舵机出现抖动的问题_第1张图片

你可能感兴趣的:(关于Arduino 用Servo库控制舵机出现抖动的问题)