5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
楼主: xunicheng
打印 上一主题 下一主题

大家齐动手,跟我来做头部运动传感器。终于成功了,感谢Gale兄的辛苦!

[复制链接]
81
发表于 2008-5-16 21:49 | 只看该作者
原帖由 xunicheng 于 2008-5-16 21:29 发表
传感器饱和似乎没什么办法解决,慢点转,呵呵。

郁闷啊,就这么简单的程序,其输出脉冲还是不稳定,舵机颤抖个不停,开始我还以外是驱动信号电压5V的原因,加电阻分压到3.4V以后还是一样。似乎在这个1.2M主频的东西上还是有麻烦啊。。。找了一段文章:
在机器人机电控制系统中,舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口。
   舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型;遥控机器人中已经使用得比较普遍。舵机是一种俗称,其实是一种伺服马达。
舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度伺服为例,那么对应的控制关系是这样的:
   0.5ms--------------0度;
   1.0ms------------45度;
   1.5ms------------90度;
   2.0ms-----------135度;
   2.5ms-----------180度;
请看下形象描述吧:



这只是一种参考数值,具体的参数,请参见舵机的技术参数。
   小型舵机的工作电压一般为4.8V或6V,转速也不是很快,一般为0.22/60度或0.18/60度,所以假如你更改角度控制脉冲的宽度太快时,舵机可能反应不过来。如果需要更快速的反应,就需要更高的转速了。
要精确的控制舵机,其实没有那么容易,很多舵机的位置等级有1024个,那么,如果舵机的有效角度范围为180度的话,其控制的角度精度是可以达到180/1024度约0.18度了,从时间上看其实要求的脉宽控制精度为2000/1024us约2us。如果你拿了个舵机,连控制精度为1度都达不到的话,而且还看到舵机在发抖。在这种情况下,只要舵机的电压没有抖动,那抖动的就是你的控制脉冲了。而这个脉冲为什么会抖动呢?当然和你选用的脉冲发生器有关了。一些前辈喜欢用555来调舵机的驱动脉冲,如果只是控制几个点位置伺服好像是可以这么做的,可以多用几个开关引些电阻出来调占空比,这么做简单吗,应该不会啦,调试应该是非常麻烦而且运行也不一定可靠的。其实主要还是他那个年代,单片机这东西不流行呀,哪里会哟!
使用传统单片机控制舵机的方案也有很多,多是利用定时器和中断的方式来完成控制的,这样的方式控制1个舵机还是相当有效的,但是随着舵机数量的增加,也许控制起来就没有那么方便而且可以达到约2微秒的脉宽控制精度了。听说AVR也有控制32个舵机的试验板,不过精度能不能达到2微秒可能还是要泰克才知道了。其实测试起来很简单,你只需要将其控制信号与示波器连接,然后让试验板输出的舵机控制信号以2微秒的宽度递增。

欢迎继续阅读楼主其他信息

82
发表于 2008-5-16 22:26 | 只看该作者
郁闷啊,写了一段最简单的延时生成波形(如下),舵机在某些值上还是狂抖,看来输出的信号步进要严格遵循要求,否则打在舵机的某些点上,就会让舵机识别不清。。。

void Wave(BYTE v)
{
        BYTE i,j;

        PWM1H();
        for(i=0;i<200;i++)        Delay5us();                //延时1ms
        for(i=0;i<v;i++)        Delay5us();                //根据舵机比例延时
        PWM1L();
        for(j=v;j<200;j++)        Delay5us();                //补充延时至1ms

        for(j=0;j<20;j++)        //延时完剩下的20ms
        {
                for(i=0;i<200;i++)        Delay5us();
        }

}
83
 楼主| 发表于 2008-5-16 22:30 | 只看该作者
脉冲不稳定是不是传感器抖动引起的??静态的时候是有正负2.5mv的抖动的。
84
 楼主| 发表于 2008-5-16 22:33 | 只看该作者
晕,也许最古老的模拟电路的舵机反倒兼容性会最好。数字化处理,一旦存在精度差异,就晕菜了。
85
 楼主| 发表于 2008-5-16 22:37 | 只看该作者
舵机处理是10位的??似乎很多电调,混控之类的东东都是8位精度。

gale你试试别按正负100%来算,按正负128来算,256级。也许就和舵机对上了。
86
 楼主| 发表于 2008-5-16 22:44 | 只看该作者
关于传感器灵敏度的问题。

刚又搜了半天,这个传感器和正宗的ews82还是有区别的,正品是5脚的,一个空脚,这个有7只管脚,而且从拆解的图片上看,7只管脚全都接到电路中,多出来的两只管脚是做什么用的??现在是把它们直接悬空了。有没有可能这多出来的两只管脚能够调整灵敏度??  传感器内部使用的芯片是AN6731,没找到相关资料,不知道是什么东东。
87
发表于 2008-5-18 21:44 | 只看该作者
今天终于腾出点时间,折腾了一下M8,先驱动舵机,发现原来舵机颤抖问题不是信号发生的问题,是舵机的问题(舵机接到接收机上某些位置也抖),不过我好几个辉盛都这德行,看来辉盛舵机质量下降了。手头有几个高级的DS13MG舵机,拿来测试,我靠,精准!稳定!本来打算卖的,现在不卖了。

这个舵机测试值啊,呵呵
88
 楼主| 发表于 2008-5-19 08:57 | 只看该作者
嗬嗬,辉盛的东东俺就没见好过…………
89
发表于 2008-5-19 12:26 | 只看该作者
很感兴趣。这个帖子应该发在航拍版。
90
 楼主| 发表于 2008-5-19 14:51 | 只看该作者
原帖由 jtltt 于 2008-5-19 12:26 发表
很感兴趣。这个帖子应该发在航拍版。

发在航拍版根本没人会看。

那边的米人基本不屑DIY。
91
发表于 2008-5-19 16:08 | 只看该作者
我也做了一个 计划使用两个比较器  积分弄不来,这里就用了个比较器A
目前来说用用可以, 精度保证不了。。
基本思路是 陀螺信号进来的是 数值176 (至少我这个是这样的,使用的是M16 内部2.56V的比较电源)
之后乘上9 就差不多是1580 舵机的中立点。
然后消除抖动,故所以大于1700或小于1450时候比较器才会加上或减去数值。我不知道上面的算不算消抖动,反正现在这个陀螺放在桌上舵机不乱斗了。
精度很差,转动陀螺的时候幅度不能太大。不能可能转不到 你想要让他转到的角度。



                                 $regfile = "m16def.dat"
  Config Portd = Output

Config Adc = Single , Prescaler = Auto , Reference = Internal

Enable Adc
Enable Interrupts
Enable Compare1a
Compare1a = 1500

Dim W As Word , Channe1 As Byte
Dim A As Byte

Dim G As Single
Dim D As Word
Dim E As Word                                               '与ADC转换相关变量
Dim F As Word
Dim H As Word
Dim Z As Word

  Cls
  Cursor Off

     Channe1 = 1

     Z = 1500
     Start Adc
Do

     H = Compare1a
   D = Getadc(channe1)
   E = D * 9
   If E > 1700 Then
   Compare1a = Compare1a + 30
   Elseif Compare1a > 2400 Then
    Compare1a = 2400
   Elseif E < 1450 Then
   Compare1a = Compare1a - 30
   Elseif Compare1a < 600 Then
    Compare1a = 600

   End If


Locate 2 , 1
Lcd "H=" ; H ; " ms" ;
  Locate 1 , 1
Lcd "E=" ; E ; " ms" ;
  Locate 2 , 10
Lcd "G=" ; G ;
   Locate 1 , 10
Lcd "D=" ; Compare1a ;


Pulseout Portd , 0 , H
Loop
End
92
发表于 2008-5-19 20:32 | 只看该作者
楼上的这个仅仅是振荡算法,不是锁尾算法吧?
93
发表于 2008-5-19 20:37 | 只看该作者
经过昨天的试验,熟悉了舵机的特性,即平时可以不送信号给舵机,只有在需要改变舵机位置的时候,送一系列脉冲给舵机即可(比如10个脉冲),这样的话可以大大降低CPU的负担,也不用定时器来驱动舵机了。理论上看,TINY13应该也能撑的住(但是PPM解析重构还是需要定时器的。。。),今晚继续尝试。
94
 楼主| 发表于 2008-5-19 21:10 | 只看该作者
呵呵,加油!!
95
发表于 2008-5-19 22:12 | 只看该作者
晚上的试验很成功,现在已经达到了陀螺仪的非锁尾状态了,用的是一片MEGA8,12M晶振,运算速度嗖嗖的!再干半个小时睡觉
96
 楼主| 发表于 2008-5-19 22:28 | 只看该作者
太好了太好了。我订的贴片Mega8芯片也到了,好小啊!做成PCB也许比上次那块板子的面积还会小。板子上应该预留一组下载线的插口吧。
97
发表于 2008-5-19 22:34 | 只看该作者
不是锁尾的 我不知道公式。。。
98
发表于 2008-5-19 22:36 | 只看该作者
还有 用我这种 IF THEN 方法不好,
刚刚接两个舵机 接连个传感器。运行起来就表现的很迟钝了。。。
看来我要靠你了。 我是搞不定了
99
发表于 2008-5-19 23:01 | 只看该作者
1、先不要着急布板啊
2、锁尾公式的数学理论很简单,但实现起来就难了,道理如下:

为说明方便,下面的加速度、速度等都是指角加速度、角速度
a.传感器可以得到当前加速度a(用电压表征)
b.定时获取加速度,比如隔时间t取一次,用加速度a乘以时间t可以得到速度v
c.用速度v乘以t即可得到偏转角度angel
d.根据当前的偏转角度决定用多大的尾螺距去推动飞机尾巴

LZ要做的头部传感器只需要a b c 三步,因此比较简单,上面的方法在t足够小时是比较精确的,这也是微分或者说离散化的原理,要想更精确,可以用两次的加速度a1 a2复合计算,这样 angel=1/2*(a1+a2)*t,所有这些都是中学物理知识。

但是这个理论要想实践有几个难点:
1、电压V和加速度a的关系未必是线性关系,怎样得到?
2、间隔时间t是否足够小?这决定于CPU是不是够快
3、由于单片机使用大量的整数运算,在如此多次的乘除运算中有大量的截断误差,如何消除截断误差的积累?

不过事物总是辩证的,看着有难点,但落到工程上总是有办法的,事实上,真正的陀螺仪才不管那么多,凑活着能够锁尾也就卖了。GY401贵就贵在软件,硬件呢?比低档陀螺仪确实好那么一些,但毕竟不完全是决定性的。

我所要做的效果就是把传感器和舵机固定在一起,当舵机转动时,其摇臂始终指着一个方向(锁尾),这样就可以实现LZ FPV头部控制的愿望了。

这个试验决定成败的关键是软件效能和CPU的运算速度的乘积,如果有90MHz的ARM或者更高的速度,采用浮点运算那么我想随便写写软件锁尾精度都会非常高。

最后说个奇怪的事情,传感器我认为是输出VCC的一半作为中立点,于是刚开始试验我就用3.3V左右供电,结果也很理想,他输出1.7V,但是调了几次以后,它就输出2.2V了,奇怪,最后我只好改用5V供电了。。。

这里上图很麻烦,而且只能100k,我就上到三国上了
http://bbs.mx3g.com/viewthread.php?tid=19061&extra=page%3D1&frombbs=1
100
发表于 2008-5-20 07:21 | 只看该作者
顶起!gale 加油!!看起来很有意思啊,传感器没有规格书吗?怎么电压是不定的呢?

找到规格书了,
http://www.isbox.cn/xxxxxx/071022/EWTS82.pdf

[ 本帖最后由 yhybear 于 2008-5-20 09:52 编辑 ]
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /2 下一条

快速回复 返回顶部 返回列表