舵机速度的控制其实都是让舵机从初始位置到目标的位置不是直接到达,而是划分成很多细微的小过程逐步让他到达。比如说让舵机的初始位置是0度让他跑到90度,直接送入90度的数据的话由于舵机的响应速度还是比较快的,几乎就一下子跑到90度的位置。如果我们在他到达90度的过程中给他制造很多缓冲,就是让他从0度到1度到2度3度……..的逐步过渡过到90度,那么出现的效果就是舵机以比较慢的速度到达目标位置,就达到我们控速的目的。而每个间距切换的时间加以控制既可以得到我们想要的具体旋转速度,因为划分的过程很多,所以舵机的旋转看上去是流畅的一个速度的旋转。
虽然理论上是那么回事,不过要通过程序表达还是要经过一些变换,在这里假设舵机初始位置的值是x,舵机要运行到目标位置y,在设置个变量a让他初始时0,x+(y-x)*a/100就是我们要送入的舵机位置信息,开始的时候a是0所以送入的数据是x,舵机还在初始位置,这时候我们每隔固定的时间就对a+1,随着a的变化舵机位置逐步从初始位置向目标位置靠近,到a=100的时候完全到达目标位置停止a的自加。但是由于x+(y-x)*a/100的公式中大量的引入了x,你会发现写程序还是不是那么好控制,我的最终的速度控制程序又对这个公式进行了变换y-(y-x)*(100-a)/100这个公式也是随着a的自加会使得送入的信息逐步到达目标位置。两个公式都可以实现,但是相比较第二个程序到时候会相对简单。
在写程序的时候有时候我们不光要考虑程序语句的正确性,有时候还要考虑单片机的处理能力,比方说a=(0x01<<16)>>16这个语句没有错误,理论上a应该最后还是等于1但是把他下载到51单片机当中就不是那么回事了,因为在向右移动16位的过程中,51没有16位的高位来储存数据,所需信息会有打失,最后的结果会是a=0,我也是在写程序的时候发现了这个问题,只是想说明在涉及运算的时候要考虑单片机处理能力。x+(y-x)*a/100就是对舵机在初始位置到目标位置的转化过程进行了100微分,本来还想进行1000微分的了,但是发现100微分就已经完全足够了,而且100的时候程序计算过程设计的不合理就会出现超出运算能力而出错的情况。
有朋友问我我的舵机控制速度程序是什么原理,所以写篇小文章介绍下,大家互相交流学习 呵呵
下面是舵机的单片机程序:
http://www.51hei.com/mcu/2542.html
http://www.51hei.com/mcu/2543.html
http://www.51hei.com/mcu/2544.html
http://www.51hei.com/mcu/2545.html
http://www.51hei.com/mcu/2546.html
http://www.51hei.com/mcu/2547.html
http://www.51hei.com/mcu/2554.html