完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
舵机的控制一般需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度舵机为例,那么对应的控制关系是这样的:
0.5ms--------------0度; 1.0ms------------45度; 1.5ms------------90度; 2.0ms-----------135度; 2.5ms-----------180度; 请看下形象描述吧: 舵机的工作电压和电流: 每一款舵机都有自己的参数,如TR213舵机的工作电压是4.8-7.2V,TR205舵机的工作电压是4.8-6V,电压不能超过这个范围,否则会很容易烧坏舵机,在不清楚舵机工作电压范围的情况下,建议使用5V给舵机供电。 舵机的工作电流是根据舵机的实际情况而定的,如TR213舵机,在空载的时候电流几乎为0,而在正常负载的情况下,电流在0.5A左右,视实际情况而定。六足机器人需要18个TR213金属舵机,需要提高的电流大概在8A左右,如果电源功率不够会影响舵机的性能,最常见的现象是,当一个舵机负载的时候,其他舵机会出现混乱,无规律的乱摆。 舵机的接线如下图: 市场上90%的舵机中间那根线都是正级。 基础知识介绍的差不多了,具体可以去百度看看舵机手册。 下面我们来说说在树莓派中,如何用wiringPi库去驱动舵机随心所欲的转。为什么要用wiringPi库呢,因为博主不怎么喜欢写Python,博主喜欢写c/c++代码。废话不多说,开始。 第一:首先,我已经知道了舵机的pwm周期为20ms,然后是这样的 0.5ms--------------0度; 1.0ms------------45度; 1.5ms------------90度; 2.0ms-----------135度; 2.5ms-----------180度; 也就是说给它1.5ms的高电平,19.5ms的低电平转向0度位置。这里需要注意,是0度位置,不是舵机转0度,当然如果舵机怎么正好处于0度位置,当然也不转。这里可能就有人要问了,那啥位置算是0度位置呢?根据我对舵机的理解(180度的舵机),就是你向一个方向用手转动舵机,到一个你无法转动的地方,这个位置不是0度位置,就是180度位置。然后你用下面的代码运行一下就知道了。 while(1)//turn to 0 { digitalWrite(15,HIGH); delayMicroseconds(500); digitalWrite(15,LOW); delayMicroseconds(19500); } 我这里就这样来模仿pwm的。这个代码一运行,舵机就自动到了0度位置。 同理,想转到45度位置,90度位置,135度位置,180度位置的代码如下: while(1) //turn to 45 { digitalWrite(15,HIGH); delayMicroseconds(1000); digitalWrite(15,LOW); delayMicroseconds(19000); } while(1) //turn to 90 { digitalWrite(15,HIGH); delayMicroseconds(1500); digitalWrite(15,LOW); delayMicroseconds(18500); } while(1) //turn to 135 { digitalWrite(15,HIGH); delayMicroseconds(2000); digitalWrite(15,LOW); delayMicroseconds(18000); } while(1) //turn to 180 { digitalWrite(15,HIGH); delayMicroseconds(2500); digitalWrite(15,LOW); delayMicroseconds(17500); } 这里可能有人要说为啥不用delay()函数呢,因为delay函数精确到毫秒,当我传1.5给它的时候,和传1给它的时候,你会发现舵机都是转向45度位置,因为delay(int x),当1.5传过去的时候精度丢失了。(我一开始就犯了这个错误,尴尬啊) 到这里我想你应该已经知道怎么旋转45度,90度,等等了吧。然后你可能发现舵机旋转的太快,可能不受自己的控制了。这里我就要给你提供一种思路,怎么去解决这个问题。 当然,本人能力有限,写的难免有错误,希望指正。 下面我给一个很不错的链接,想深入研究的可以去看看(他用的是单片机) http://www.njliaohua.com/lhd_5xtsq7jr1e0088t3wpu3_1.html 我是这样认为的。0.5ms转向0度,1ms转向45度,那个这其中是不是经历了0.5ms,而且转了45度,所以我就用0.5=500us,500us/45度。然后得出约为11.11us/度。 接下来我的代码是这样写的。 int angle=0; scanf(“%d”,&angle);//从键盘输入要转的角度。 while(1) { x=11.11*i; digitalWrite(15,HIGH); delayMicroseconds(500+x); digitalWrite(15,LOW); delayMicroseconds(19500-x); if(i==angle) break; i++; } 这样一来速度确实是降了下来,但是每次舵机都要先转向0度位置,然后才能转向我们输入的个角度位置,这其中道理我想你们应该懂吧。 到这里你应该可以降低舵机的速度了吧,我就给你这么多思路,下面的路,让你自己走吧。 这里我给个demo吧。 #include #include void init(); int main() { init(); int angle=0; scanf("%d",&angle); int i=0; float x=0; int k=180;//180次循环的时间够了 while(k--) { x=11.11*i; digitalWrite(15,HIGH); delayMicroseconds(500+x); digitalWrite(15,LOW); delayMicroseconds(19500-x); if(i==angle) break; i++; } return 0; } void init() { wiringPiSetup(); pinMode(15,OUTPUT); } |
|
|
|
只有小组成员才能发言,加入小组>>
2444 浏览 0 评论
9143 浏览 4 评论
36825 浏览 19 评论
5036 浏览 0 评论
24808 浏览 34 评论
1549浏览 2评论
1770浏览 1评论
2219浏览 1评论
1574浏览 0评论
547浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 19:10 , Processed in 1.364354 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号