lzjnew 发表于 2008-2-22 19:25:21

如何实现多路(30路以上)舵机控制器?

请教如何实现多路舵机控制?控制要求:至少24路以上,最好能达到32路,脉宽调制可达1000级,并能实现与PC机的串行通信
我已经为这个问题困扰了半年多了,网上也查了不少资料,对硬软件做了N次修改,还是不能达到理想效果。
主要现象:多路控制时舵机发抖,多路时控制精度上不去。
主要问题:中断处理程序不能在很短的时间内完成连续中断,两次中断时间差为2微妙
主要疑惑:同样是使用mega128,市场上的产品就达到32路的精准控制而且还有附加功能,我却只能精准控制7路,低精度控制14路,21路
目前我想的最好的方案是多机协作,每机就控制7路,才能达到预先要求,但总觉得不是很爽,请教有没有更好的方案?

rabbitx2006 发表于 2008-2-22 19:56:33

采用硬件PWM,一路在20ms标准舵机周期内可以输出多个舵机控制信号,类似于比例遥控模型中的PPM信号,通常可以达到8~9个通道,然后,采用计数集成电路如CD4015, HC164, 或CD4017等, 将次信号分解为单独的多个舵机控制信号。

这样一来,实际上一个ATmega48,或ATmega8芯片的两路16bit PWM信号输出,就可以轻松完成2*8~2*9个舵机的精确控制,另外,可以留出更多的时间来处理其他事务。

如果是Mega128,具有6路 16bit精度的 PWM, 应该可以控制6*8 ~ 6*9个的舵机。

lzjnew 发表于 2008-2-22 22:49:20

不是很明白,能解释一下具体怎么实现的么?

boat030 发表于 2008-2-23 11:40:18

关注, 1楼的朋友可以具体解译下吗?

rabbitx2006 发表于 2008-2-23 13:49:51

我现在还只能实现用一路16bits的硬pwm输出,来完成8路舵机信号的输出,最小分辨1us。

芯片是ATmega88,

因为是实验,主频采用其内部8MHZRC振荡器,但经过标定数值校正。

稍后,我会上简单的电路草图,和源代码(GCC)。

frozenstar 发表于 2008-2-23 15:20:16

关注中..

rabbitx2006 发表于 2008-2-23 19:41:29

电路图和源代码来了

电路图:
1http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_218636.PNG

AVR Studio + gcc 写的代码:
点击此处下载ourdev_218637.rar(文件大小:12K)

这个电路图只能控制8舵机,如果使用CD4017,则最多可以9路。

由于采用片内部8MHZ主时钟频率,输出可能有误差,实际电路建议使用外部8MHZ晶振。

laoki8888 发表于 2008-2-23 19:58:11

这个图采用了一路硬件PWM

如果用3路硬件PWM输出,不就是3x8=24吗

或者用DSP吧,几十路硬件PWM都有

rabbitx2006 发表于 2008-2-23 20:04:52

回7楼,实际我现在的解决方法最多只能控制9路,在换CD4017的情况下。

M88只有一个16bits定时器用于产生两路非完全独立控制的硬件PWM信号。

我现在正在考虑是否可以用这样的两路非独立(主要是在CTC模式下,共用了ICR1),能够独立产生两路包含8~9个通道的PPM信号。

希望大家一起想想办法~

另外,我主要是做航空模型的遥控 + 接收部分要用到,实际上8路已经足够。

rabbitx2006 发表于 2008-2-23 20:08:58

请9楼朋友, 看源代码.

只要修改这个数组的值,就可以控制对应通道的舵机了


        data = 1520; // CH1, 1.52ms中立点
        data = 1520; // CH2, 1.52ms中立点
        data = 1000; // CH3, 1ms最低点(油门通道)
        data = 1520; // CH4, 1.52ms中立点
        data = 1520; // CH5, 1.52ms中立点
        data = 1520; // CH6, 1.52ms中立点
        data = 1520; // CH7, 1.52ms中立点
        data = 1520; // CH8, 1.52ms中立点
       
        // 帧同步
        data = SERVO_T - data - data - data - data - data - data - data - data;

chenpeng 发表于 2008-2-23 20:09:03

研究下

sunxflower 发表于 2008-2-23 21:57:43

这问题很值得研究,控制舵机机器人有一席用武之地。
有空了再整理资料上传

frozenstar 发表于 2008-2-23 22:08:29

恩,很不错的思路。。

lzjnew 发表于 2008-2-24 02:13:56

非常感谢1楼的精彩讲解,但我还有两个问题困扰:
1、溢出中断由于保护现场会造成时间不准确,浪费的这个时间每次中断时长短一样么,能算出来么?
2、似乎市场的产品只用一片m128或m16就解决问题了,估计只是算法问题,请教有没有这方面的高手?

rabbitx2006 发表于 2008-2-24 07:23:00

对于第1个问题,实际上是不必担忧的, 因为有足够长的容忍时间可以用来设置ICR1的值.

sunxflower 发表于 2008-2-24 08:36:19

事实上舵机的摆动位置和周期是无关的,只要满足周期在一个范围内就可以,但是周期与舵机的响应速度有关。我改过一个舵机,把电位器和卡笋去掉,那样舵机就360度连续转了,然后改变脉宽就可以控制舵机速度了。
市面上有售的那种32路舵机控制器我见过,主要是一片M8 ,级联了4片74595,原理就没仔细琢磨过了。
上传几偏与舵机有关的论文,希望对大家有用。
点击此处打开ourdev_218836.pdf(文件大小:196K)
点击此处打开ourdev_218837.pdf(文件大小:220K)
点击此处打开ourdev_218838.pdf(文件大小:310K)
点击此处打开ourdev_218839.pdf(文件大小:466K)

chenpeng 发表于 2008-2-24 09:57:44

感谢楼上的奉献

lzjnew 发表于 2008-2-25 21:07:08

回去研究一下,非常感谢!

flyunlimit 发表于 2008-2-26 09:17:47

舵机的脉宽控制不需要1US的精度!模拟舵机都有死区,死区比较小,常用的FUTABA3001,也有大约6US的死区。数字舵机也有死区,只不过小些。除非是顶级的,但那一个就要500多。

    前几天写好了一个数字舵机的程序,250ns的机器周期。但实际情况是死区也只能到4US,主要是电位器和齿轮机构的性能制约了,

    再有,玩了6年航模了,我知道的,舵机的控制脉宽范围是1ms-2ms,对应角度的范围是120度.而我们实际使用时,舵机是不会全范围转动的,大约不到100度,多出的20多度,是遥控器给微调和机械机构预留的,即遥控器的输出范围总是小于1ms的。
   
    机器人我很早就想做了,但一直没有硬件条件(没机器人的架子)。文章看了不少,也不知道是哪个最早写的,非说航模舵机是0.5ms-2.5ms,180度!还要1us的精度!结果后面的文章就全跟着这么说,害人啊!

flyunlimit 发表于 2008-2-26 09:29:20

我上面说的是航模舵机。如果是机器人专用舵机(看到有买的了),貌似是0.5ms-2.5ms,180度,但是,是模拟电路做的,所以绝对会有死区,而且也不会小。
    个人建议:如果是自己做机器人,不如把舵机拆了。然后用单片机做舵机电机的控制电路,使用I2C或SPI通讯。这样控制的难度降低,通讯速度、精度、抗干扰性能、刷新率全有提高,
    比如这里的:
    http://bbs.5imx.com/bbs/viewthread.php?tid=212369&extra=page%3D1

sunxflower 发表于 2008-2-26 15:46:23

楼上的,推荐一个开源的项目:OpenServo

点击此处下载ourdev_220059.rar(文件大小:235K)
2http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_220060.jpg

sunxflower 发表于 2008-2-26 16:04:24

to【20楼】 flyunlimit

你买的什么样的舵机呀?哪买的?

flyunlimit 发表于 2008-2-26 19:40:30

我买的什么样的舵机?这个问题还真不好回答!

我就是玩航模的,舵机前前后后玩了不少,还真说不上来哪些是买的,哪些是别人的了。过去玩油机,用过的普舵,FUTABA的3001和3003是航模协会的,JR的NE-507是买遥控器带的,后来玩电动,微舵有的是以前就买好的,有的是人送的,很久没买过新的了。

不过,你到淘宝上不就能买到舵机吗?大把,大把的。质量都不错。

flyunlimit 发表于 2008-2-27 08:58:12

还有,谢谢你推荐OpenServo,不过我以前就已经知道了。不过很无奈:1、英语不过关,只能看个大概;2、我用PIC的。3、我用汇编。

再看个图,来自http://bbs.roboticfan.com/topic.aspx?topicid=4765,这才是航模舵机的真正控制情况。

写文章的人绝对是睁眼说瞎话!他自己贴的这个图,还硬说什么:
舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度伺服为例,那么对应的控制关系是这样的:
   0.5ms--------------0度;
   1.0ms------------45度;
   1.5ms------------90度;
   2.0ms-----------135度;
   2.5ms-----------180度

1http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_220456.gif

   晚上查了一下,最早说什么0.5ms~2.5ms的时候,根本还没有什么机器人舵机,用的就是航模舵机。只是后来做机器人的人多了,才开始有人推出能转180的舵机,买的还比航模的贵

sunxflower 发表于 2008-2-27 10:41:21

我做机器人用的舵机就是普通模型用舵机。网上买的,振华958。超级便宜,振华938更是便宜。
也有看到科大的朋友用995舵机的(金属齿)。这种舵机我曾试验过,很耗电,所以供电稍不稳定就抖起来了。
可惜我的机器人还没开工,所以也未知958这种舵机具体的性能如何。如果控制精度或稳定性不行,我会试试看像OPENSERVO这样改,这个开源项目的优点确实很吸引人,但时间和RMB方面考虑成本太高了。
另外,会用PIC的话上手AVR因该很容易的,我原本用51,后来用AVR的时候看手册就基本可以了。

flyunlimit 发表于 2008-2-27 23:18:58

振华!!!!!
航模爱好者心中的痛,这个舵机用的如何?没试试定位精度和死区吗?

sunxflower 发表于 2008-2-28 07:47:50

还没有具体地测试过,改造过的两个在同步性上还是可以的。

lzjnew 发表于 2008-2-29 19:00:14

这么说MG995的抖动是正常的了?

flyunlimit 发表于 2008-3-2 20:27:37

晕啊!你们就不能用点好的吗?一个振华,一个辉胜,航模都不用它们的舵机啊!——辉胜的微舵还行。

zhanjay 发表于 2008-3-2 23:14:35

航模的舵机个数能和机器人上比么?
一个机器人少也得十几个舵机吧,都买Futaba谁烧得起?

flyunlimit 发表于 2008-3-5 19:56:11

楼上的寡闻了。不管是机器人还是航模。
    航模上用10几个舵机的有的是,而机器人只用三个舵机的也很常见。
    不管是哪用,都要求舵机有好的精度和稳定性。振华,辉胜固然便宜,但时不时的抖下下舵、或回中不对,而你还以为是程序的问题,最后把程序全查N边,也解决不了,然后彻底绝望。你说这钱省的值吗?

zhanjay 发表于 2008-3-5 20:13:38

就按我所见到的说吧

KONDO机器人的舵机不错吧,日本原装的,要几百块一个吧,怎么样,照样抖的厉害。

而用国内几十块钱一个的舵机,用了几十个,从来没有抖。

航模飞机用十个以上舵机当然是有,但是一般的玩很少有十个以上的。

lzjnew 发表于 2008-3-7 23:23:16

是啊,问题就在这,机器人经常二十几个舵机,要是进口的得多少钱啊?不过话说回来,国产辉胜的大功率舵机的确抖,据厂家说是串扰,只有多个舵机在一起用时才会出现这种状况,不知有高人研究过没有这个问题,怎么解决?

lzjnew 发表于 2009-4-24 17:33:48

最近辉盛舵机改用AVRmega8做控制了,抖动小了很多,但旋转角度<180,有点让人失望

sunen1983 发表于 2011-3-19 22:08:44

mark

javabone.net 发表于 2011-4-6 14:07:46

我写过一个at89c51通过io直接控制24路舵机。
原理是:先计算出占空比,然后从小到大排序,再用它们之间的"差"作定时器,逐一拉底io。

从理论上讲这种思路下,用1T的单片机,1K Ram,再加n多595控制100个舵机是没有问题的

javabone.net 发表于 2011-4-6 14:14:33

回复【36楼】javabone.net
-----------------------------------------------------------------------

补充一下,用595比io直接控制效果好些,多位数据是一次输入的,通过定时器生效,这样更精准,逻辑也更简单

diziaihaozhe 发表于 2011-5-30 17:48:40

mark

kim5257 发表于 2011-5-30 20:09:22

1楼的想法让我长见识了

eszeta 发表于 2011-7-7 00:38:31

mark

haoye 发表于 2011-7-11 21:40:39

正在学习,谢谢楼主资料。。。

czchc 发表于 2011-8-10 16:29:35

mark

0x02 发表于 2012-1-12 03:35:17

学习

hpm88 发表于 2012-12-26 11:48:56

javabone.net 发表于 2011-4-6 14:07 static/image/common/back.gif
我写过一个at89c51通过io直接控制24路舵机。
原理是:先计算出占空比,然后从小到大排序,再用它们之间的" ...

可不可以把你的51控制24路舵机程序公布给大家研究下,我能理解你说的原理,不知精度和稳定性怎样,高手?{:lol:}
页: [1]
查看完整版本: 如何实现多路(30路以上)舵机控制器?