5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)

标题: 大家齐动手,跟我来做头部运动传感器。终于成功了,感谢Gale兄的辛苦! [打印本页]

作者: xunicheng    时间: 2008-5-7 16:58
标题: 大家齐动手,跟我来做头部运动传感器。终于成功了,感谢Gale兄的辛苦!
前几天淘了几片松下的角速度传感器,5V供电,静态输出2.5V。

打算用两轴来检测头部的转动和俯仰运动。

由于角速度传感器只有在运动的时候才有输出,没有运动的时候处于中立点,用于位置检测必须有一个中点初始化的过程,和一个位置记忆的过程。

比如,传感器检测到一个正向的信号,根据转动速度的大小,会输出一个2.5V-4.7V的电压量,根据电压持续的时间计算舵量偏转的大小,当转动结束,传感器输出中点电压2.5V,这时候,舵量必须保持当前的值,一直到有反向转动信号,舵量才向反向移动。

说起来好像挺复杂。

另外还要做的是,把控输出的PPM信号送入单片机分析,取出第5、6通道,在5、6通道的基础上叠加头部位置。这样可以用5、6通道的电位器来调节中立点。











焊好的板子:









传感器:




作者: xunicheng    时间: 2008-5-7 16:59
gale兄的建议:

PB0做输入,用中断来分析PPM信号,PB3做输出。好在PCB不用改,嗬嗬!
作者: xunicheng    时间: 2008-5-7 17:01
先计算一下直接成本:

PCB   4块

单片机  4块

传感器  10块*2=20块

贴片阻容件  1块

直接成本  约30块
作者: zhanglin592    时间: 2008-5-7 17:24
迷糊
作者: 连过五人    时间: 2008-5-7 17:41
楼主开发这个产品出来~
造福模友啊
作者: yhybear    时间: 2008-5-7 18:47
先顶一下!
作者: 七根稻草    时间: 2008-5-7 19:21
对电路一向是不太感冒的。
作者: 峰回路转    时间: 2008-5-7 19:22
恩。不错。。。
做好了吗?关键是信号叠加合成部分。。s82真是好东西。便宜好用。
估计过段时间就不好买了。嘿嘿
作者: ziyoudj    时间: 2008-5-7 19:42
高手玩的东西 没基础做不了啊
作者: xunicheng    时间: 2008-5-7 21:22
原帖由 峰回路转 于 2008-5-7 19:22 发表
恩。不错。。。
做好了吗?关键是信号叠加合成部分。。s82真是好东西。便宜好用。
估计过段时间就不好买了。嘿嘿

硬件做好了,程序嘛,Gale哥们正琢磨呢!!

那个那个,s82过段时间真的会不好买吗??赶紧再定几个去…………
作者: xunicheng    时间: 2008-5-7 21:23
原帖由 连过五人 于 2008-5-7 17:41 发表
楼主开发这个产品出来~
造福模友啊

产品俺可做不了,DIY而已……
作者: starmoon    时间: 2008-5-8 08:57
可以做个简易三轴平衡仪
作者: ravenfire    时间: 2008-5-8 15:33
哇哈哈,就等这东东了
作者: yhybear    时间: 2008-5-8 20:42
过来顶一下
作者: zhengxuan    时间: 2008-5-8 21:24
哪里有卖这种二手的角速度传感器。
作者: xunicheng    时间: 2008-5-8 21:28
原帖由 zhengxuan 于 2008-5-8 21:24 发表
哪里有卖这种二手的角速度传感器。

淘宝上搜一下,有几家卖的。是全新的。
作者: amazontan    时间: 2008-5-9 09:25
如果搞的不错我打算重金收,要能叠加到6EX方口最好
作者: xunicheng    时间: 2008-5-9 16:07
关于信号问题

必须改控,把编码到高频的线断开,接到插口上,再通过插口输入调制好的PPM到高频。

电路分析控送来的5.6通道信号,叠加运动信号以后再调制回去。

控上面至少要加一个切换开关。

我打算加个立体声耳机插座,不插的时候直通。
作者: gale    时间: 2008-5-9 16:07
原帖由 xunicheng 于 2008-5-7 21:22 发表

硬件做好了,程序嘛,Gale哥们正琢磨呢!!

那个那个,s82过段时间真的会不好买吗??赶紧再定几个去…………


谁说我正在琢磨啊?这个程序有啥子好琢磨的?赶紧发过来给我调试吧。我担心TINY不够用。。。
作者: xunicheng    时间: 2008-5-9 19:46
晕,哥们你倒是早说啊,明天把板子给你发过去。
作者: 爬墙头等红杏    时间: 2008-5-9 20:08
这玩意,干吗用?~很感兴趣~
作者: ravenfire    时间: 2008-5-9 23:43
我晕,程序都出来了阿

gale快放出来,我液晶眼镜都到了
作者: xunicheng    时间: 2008-5-10 13:26
别着急别着急,我的板子还没寄出去呢,总得调试调试吧!
作者: ooss    时间: 2008-5-10 14:53
标题: 这个传感器的输出电压线性如何啊?
以前买过一种传感器
线性不是太好
表现就是控制舵角左大右小      不对称啊
作者: yhybear    时间: 2008-5-10 16:02
原帖由 gale 于 2008-5-9 16:07 发表


谁说我正在琢磨啊?这个程序有啥子好琢磨的?赶紧发过来给我调试吧。我担心TINY不够用。。。


效率高啊,支持一下!!!!:em15:
作者: ATF    时间: 2008-5-10 17:25
似乎:em22: 这个东西很早以前海豹就做过了。还有视频的。在MOVFILE上面
作者: 110351538    时间: 2008-5-10 18:22
要不停地动头吗?
作者: xunicheng    时间: 2008-5-11 09:49
原帖由 ATF 于 2008-5-10 17:25 发表
似乎:em22: 这个东西很早以前海豹就做过了。还有视频的。在MOVFILE上面

能否给个链接??
作者: xunicheng    时间: 2008-5-11 10:03
原帖由 110351538 于 2008-5-10 18:22 发表
要不停地动头吗?

:em15: :em15: :em15:
作者: gale    时间: 2008-5-11 22:20
原帖由 xunicheng 于 2008-5-11 09:49 发表

能否给个链接??

是啊,有人做过我就不做了,偶喜欢创新,不喜欢跟风。。。:em05:
作者: xunicheng    时间: 2008-5-12 10:57
原帖由 gale 于 2008-5-11 22:20 发表

是啊,有人做过我就不做了,偶喜欢创新,不喜欢跟风。。。:em05:

别啊,有人做过了,可没人发出来分享啊,造福模友的事情,坚持啊!你调好了,我就开送板子,嗬嗬!
作者: gale    时间: 2008-5-12 11:23
原帖由 xunicheng 于 2008-5-12 10:57 发表

别啊,有人做过了,可没人发出来分享啊,造福模友的事情,坚持啊!你调好了,我就开送板子,嗬嗬!

你有条件开板,不如搞一些这个东西造福大家?
http://bbs.mx3g.com/viewthread.php?tid=18443
作者: xunicheng    时间: 2008-5-12 14:12
原帖由 gale 于 2008-5-12 11:23 发表

你有条件开板,不如搞一些这个东西造福大家?
http://bbs.mx3g.com/viewthread.php?tid=18443

不搞,不上你的当,万一N多不懂电子的哥们搞了去,我岂不是要被搞死啊。

FPV这个东东做做还可以,线路简单,需要的又不多,基本还能搞定:em15:
作者: gale    时间: 2008-5-13 19:41
LZ,东西收到了!
作者: yhybear    时间: 2008-5-13 21:04
关注,顶一下,gale和lz加油啊
作者: gale    时间: 2008-5-13 21:30
终于搞定了ISP,NND,一根线焊错了,查了好久。接着开始写程序,刚开头。。。晕,LZ把电压接到6脚了,这个脚可没有ADC功能啊,又要割线飞线了。。。


[ 本帖最后由 gale 于 2008-5-13 21:42 编辑 ]
作者: xunicheng    时间: 2008-5-13 22:18
嘿嘿嘿,不好意思,布板的时候随手一画…………
作者: gale    时间: 2008-5-13 22:32
写了一段小程序,基本原理验证过了,现在LED的闪烁占空比跟着Vs1走,转动传感器可以看到LED亮度在变化。
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
typedef unsigned char BYTE;
typedef unsigned int  WORD;
typedef unsigned long DWORD;
#define LEDON()  (PORTB&=~0X10)
#define LEDOFF() (PORTB|=0X10)
#define VS1   1  //ADC1
#define VS2   3  //ADC3
/////////////////////////////////
//延时c个10ms
//如在延时期间有按键按下,则立刻返回1
//否则到时间返回0
void Delay10ms(WORD c)
{
while(c--)
{
  BYTE i,j;
  for(i=0;i<140;i++)
   for(j=0;j<6;j++);
}
}
void Delay1ms(WORD c)
{
while(c--)
{
  BYTE i,j;
  for(i=0;i<14;i++)
   for(j=0;j<6;j++);
}
}
void Delay(WORD c)
{
while(c--)
{
  BYTE i,j;
  for(i=0;i<10;i++);
}
}
int main(void)
{
WORD Vs1,Vs1N;
//关闭中断
cli();
//设置端口
DDRB=0x010;   //端口B 管脚3输出,其他都是输入
//打开ADC
//ADMUX bit6=0->Vref=Vcc bit6=1->Vref=1.1
ADCSRA=(1<<ADEN)|0x06; //使能ADC,时钟64分频      
ADMUX=VS1;     //切换到通道1
ADCSRA|=(1<<ADSC);  //启动第一次AD转换
while(1)
{
  if(ADCSRA&(1<<ADIF)) //如果一次转换结束
  {
   ADCSRA|=(1<<ADIF); //写1清除标志位
   Vs1=ADC;   //读取结果
   Vs1N=1024-Vs1;
   ADCSRA|=(1<<ADSC); //启动下一次AD转换
  }
  LEDON();
  Delay(Vs1>>4);
  LEDOFF();
  Delay(Vs1N>>4);
}
}
作者: gale    时间: 2008-5-13 22:38
顺便说一句,严重怀疑TINY13能够装下整个程序,现在用了最大尺寸优化已占166字节空间,还有角度加速度计算(乘法啊!),PPM分析与重构。。。

建议LZ赶紧用MEGA8重新做板吧。。。
作者: xunicheng    时间: 2008-5-13 23:05
gale兄,先试试吧!!tiny13管脚少啊,实在不行再搞mega8,你画图我布板做PCB。呵呵。
作者: yhybear    时间: 2008-5-14 00:15
加油
作者: gale    时间: 2008-5-14 08:50
把空闲的管脚焊上LED用作指示


插上芯片的样子


反面的ISP插针飞线,不包括后来交换管脚的飞线,照完照片写程序才发现的。

作者: xunicheng    时间: 2008-5-14 20:27
加油!!如果字节数超的不多,拿汇编捋一遍是不是会小些??
作者: gale    时间: 2008-5-14 21:07
原帖由 xunicheng 于 2008-5-14 20:27 发表
加油!!如果字节数超的不多,拿汇编捋一遍是不是会小些??

我可没动力用汇编写啊,业余制作,芯片贵一点也无所谓啊,不是工厂为了降成本。今天没法干了,有其他事情。
作者: gale    时间: 2008-5-14 21:37
分析了一下PPM波形,是以400us的脉冲系列构成一个数据帧,脉冲和脉冲之间的间隔(位置,所以叫做PPM:PLUS POSITION MODULATE)决定比例,我用LAMA控做试验:
副翼1通道:500us~1600us 代表-100% ~ +100%
升降2通道:500us~1600us 代表-100% ~ +100%
油门3通道:600us~1500us 代表-100% ~ +100%
方向4通道:600us~1500us 代表-100% ~ +100%
又测量了TDF9,发现也是差不多。那么单片机就是要捕获每个上升沿,找出间隔时间就可以了,这个算法还不是很复杂,应该1个小时可以搞定,不过今晚要收摊啦
作者: xunicheng    时间: 2008-5-14 21:45
呵呵,标准PPM编码就是1ms正负0.5ms,也就是0.5ms-1.5ms之间。
作者: gale    时间: 2008-5-15 08:44
原帖由 xunicheng 于 2008-5-14 21:45 发表
呵呵,标准PPM编码就是1ms正负0.5ms,也就是0.5ms-1.5ms之间。

这下麻烦了,准备动手写程序,发现TINY13只有一个8位定时器,而这个FPV传感器最好是PPM分析用一个定时器,PPM重构用一个定时器,主循环做AD以及运算。现在只有1个定时器,还是8位的,需要合并定时器,对精度有影响。。。
作者: xunicheng    时间: 2008-5-15 08:59
嗬嗬,这才是你等高手考虑的问题啊!!
作者: xunicheng    时间: 2008-5-15 09:04
前面四个通道脉冲可以直接移到输出端吧?只需构建5、6通道,这两个通道的精度不需要很高。6通以后直接舍弃。
作者: xunicheng    时间: 2008-5-15 09:07
gale兄,太麻烦的话,就不用tiny13,直接画个mega8的图给我吧,我来做板子……唉!!!二十几片废板……
作者: yhybear    时间: 2008-5-15 09:15
进展很快嘛!真羡慕gale,还有时间琢磨这个,光上班就快把我累死!
作者: gale    时间: 2008-5-15 10:03
这个东西原理是很简单的,但是要想做好(精度做高)不太容易,它是用500us来表达100%,也就是1%=5us,这对于主频在M级的芯片来说不太容易。不过实际上很多接收机也不会做得那么精细。

我先把框架搭好,再优化精度了。

已经写好了PPM分析和重构的代码,虽然没有调试OK,但可以估计出大致的代码量,目前是:378字节。现在就差最复杂的传感器分析运算了。。。不知道能不能装得下:em17:

简单写了一遍传感器分析,现在代码750字节。

先由电压得到角加速度,然后由角加速度得到角速度改变量,计算出角速度,接着由角速度计算出角度改变量,并计算出当前角度。这就是陀螺仪锁尾算法,当然现在的很粗糙,如果用强劲的CPU来计算,配合好的感应器,就是一个好的陀螺仪了,呵呵。


  a=GetAD(VS1)-Vc1; //求角加速度a
  v1+=a*t;   //a.t=角速度改变量
  Angel1+=v1*t;  //v.t=角度改变量
  Channel[4]+=Angel1;//叠加到PPM信号上


[ 本帖最后由 gale 于 2008-5-15 13:10 编辑 ]
作者: yhybear    时间: 2008-5-15 13:22
原帖由 gale 于 2008-5-15 10:03 发表
这个东西原理是很简单的,但是要想做好(精度做高)不太容易,它是用500us来表达100%,也就是1%=5us,这对于主频在M级的芯片来说不太容易。不过实际上很多接收机也不会做得那么精细。

我先把框架搭好,再优化 ...

:em26:
作者: xunicheng    时间: 2008-5-15 14:19
:em26: :em26: :em26: :em26:

越来越期待了…………:em24:
作者: ravenfire    时间: 2008-5-15 17:57
加油阿,就看你的了,我现在眼镜还没动过呢
作者: gale    时间: 2008-5-15 20:13
调了一会,这个板子基本宣告失败,因为TINY13主频只有9.6/8=1.2M,没有足够的效能执行PPM分析、重构、传感器运算的工作。

我接下来就分别试验一下各个模块,合起来是不行了——CPU算不过来。

补充一下:光是低主频还可以想技巧解决,可是只有1个定时器,本身就需要用软件模拟出2~3个定时器,这样效率就很差了。

另外,还要抱歉一下,我看错了,TINY13 5脚是PCINT0,不是INT0,所以5还是做输出 6做输入。。。

又发现一个问题,PPM信号的幅度只有1.2V左右,不能触发5V供电的TINY13中断,解决方法是加一级驱动,或者用1.8V供电。

[ 本帖最后由 gale 于 2008-5-15 20:53 编辑 ]
作者: xunicheng    时间: 2008-5-15 20:41
:em25: :em25: :em25: :em25: :em25: :em25:
作者: xunicheng    时间: 2008-5-15 20:45
gale兄,辛苦了…………

这个板子,改成不进行PPM分析,直接输出两路PPM信号,就像接收机的输出,行不行?



要不,

换芯片吧……
作者: gale    时间: 2008-5-15 20:55
原帖由 xunicheng 于 2008-5-15 20:45 发表
gale兄,辛苦了…………

这个板子,改成不进行PPM分析,直接输出两路PPM信号,就像接收机的输出,行不行?



要不,

换芯片吧……


我明白你的意思,直接输出驱动舵机的PWM信号,这个应该没有问题,我就打算先这么试验了。

另外,刚才编辑了楼上的帖子,关于PPM1.2V驱动不了TINY13中断的问题,重新画板时,记得放一个三极管反向哦
作者: xunicheng    时间: 2008-5-15 21:12
原帖由 gale 于 2008-5-15 20:55 发表


我明白你的意思,直接输出驱动舵机的PWM信号,这个应该没有问题,我就打算先这么试验了。

另外,刚才编辑了楼上的帖子,关于PPM1.2V驱动不了TINY13中断的问题,重新画板时,记得放一个三极管反向哦



这个我记下了。

呵呵,理论和实际还是相差很远啊,纸上谈兵,有很多问题是想不到的,做过以后才知道。

前两天调332的充电板,比较器的指示电路死活调不出来,然后才发现原理图有错误,管脚接错了,继续调试,又发现,电路实现的方法根本就是错的,板子废掉一半。只有另一面的332控制电路可以用。

这次打板,时间赶得很急,没仔细设计,做了4种电路,废掉了两种,失败失败……
作者: gale    时间: 2008-5-15 21:55
原帖由 xunicheng 于 2008-5-15 21:12 发表



这个我记下了。

呵呵,理论和实际还是相差很远啊,纸上谈兵,有很多问题是想不到的,做过以后才知道。

前两天调332的充电板,比较器的指示电路死活调不出来,然后才发现原理图有错误,管脚接错了, ...


悲惨的消息:舵机信号是周期22ms的PWM信号,1ms脉冲代表-100% 2ms脉冲代表+100%,也就是说,2ms-1ms=1ms的时间需要分为200份(假如精度有1%的话),这就意味着要精确控制舵机,需要做到5us的精确PWM,以TINY13的能力,全速做还差不多,中间要穿插传感器分析,这个。。。:em17:
作者: xunicheng    时间: 2008-5-15 22:09
原帖由 gale 于 2008-5-15 21:55 发表


悲惨的消息:舵机信号是周期22ms的PWM信号,1ms脉冲代表-100% 2ms脉冲代表+100%,也就是说,2ms-1ms=1ms的时间需要分为200份(假如精度有1%的话),这就意味着要精确控制舵机,需要做到5us的精确PWM,以TIN ...

是这样吗??:em22: :em22: :em22:
作者: gale    时间: 2008-5-15 22:35
你是问“舵机信号是这样吗?” 还是问“实现5us很困难吗?”
如果是前者,我只能说:是,示波器图见http://bbs.mx3g.com/thread-16917-1-1.html
为了保险,我刚才又用T9+蓝箭微接测量了一次,确实是这样,而且步进很细微,可以做到4us

如果是后者,我也只能说:确实很困难,1.2M主频的AVR CPU,为了方便计算,就当1M好了,差不多1us一个指令,也就是说,如果没有硬件的帮助,要实现5us步进的准确PWM,需要能够在5条指令中完成PWM的基本控制,这几乎要耗尽CPU的资源,其他什么事情也不能干了。如果用硬件PWM的话,又存在一个问题,那就是舵机的PWM只是在5% 10%这样极小的占空比之间变化,而AVR的硬件PWM是0%~100%,8位的PWM摊到5%的范围上只有很差的步进量。。。


另,这个传感器太灵敏了,我放在桌面上,轻微的桌面变形都会引发传感器的动作,几乎成为一个报警器了。我想正规的陀螺仪应该会使用两个传感器,一个高灵敏的用于轻微的运动,一个低灵敏的用于剧烈运动。
作者: xunicheng    时间: 2008-5-15 22:41
不错,这个传感器的确太灵敏,商品的陀螺也是用一个传感器的,但是可以测量的角速度比较大,或者说比较迟钝。

舵机没必要一定要送20ms的脉冲,你试试送一个方波,它也能正常工作。
作者: xunicheng    时间: 2008-5-15 22:47
还有,用定时器中断来做,会很省资源。

不过13只有1个定时器,头疼。

[ 本帖最后由 xunicheng 于 2008-5-15 22:52 编辑 ]
作者: gale    时间: 2008-5-15 22:59
原帖由 xunicheng 于 2008-5-15 22:47 发表
还有,用定时器中断来做,会很省资源。

不过13只有1个定时器,头疼。

我全部都是用中断完成的,不过CPU太慢,中断也不灵啊,举例来说,我简单试验了一下,用中断产生方波,效果很好,然后打开外部中断接收PPM信号,由于外部中断要处理PPM信号,CPU主频低执行的比较慢,所以一旦遥控器开机,PPM出现,定时器中断的方波就不成样子了。

这个传感器做简单的方向性判断还是不错的,要定量分析就很痛苦,稍微动一下就饱和了。。。

今晚收摊了!东西要不要发还给你?
作者: xunicheng    时间: 2008-5-15 23:05
原帖由 gale 于 2008-5-15 22:59 发表

我全部都是用中断完成的,不过CPU太慢,中断也不灵啊,举例来说,我简单试验了一下,用中断产生方波,效果很好,然后打开外部中断接收PPM信号,由于外部中断要处理PPM信号,CPU主频低执行的比较慢,所以一旦遥 ...


不用,你留着研究吧。

mega8的电路图,有空发给我。

还有,源程序能否发来我学习学习??

[ 本帖最后由 xunicheng 于 2008-5-15 23:07 编辑 ]
作者: xunicheng    时间: 2008-5-15 23:35
总觉得不太对。舵机信号是500微秒-1500微秒,用定时器来做,每个周期至少有500微妙的时间来做其它的事情。即使要做到1微妙的精度,也只需要设置定时器定时501微秒就行啊。而且每个周期是20ms,至少有几万个机器周期来用。

我是根据用汇编玩51时候的经验来说的啊,AVR不懂,也许是乱说。

gale看看这篇文章:http://www.mcu123.com/news/Article/uc/uc8051/200608/173.html


忙过着一阵,试着拿汇编爬一下。

[ 本帖最后由 xunicheng 于 2008-5-15 23:39 编辑 ]
作者: gale    时间: 2008-5-16 11:38
原帖由 xunicheng 于 2008-5-15 23:35 发表
总觉得不太对。舵机信号是500微秒-1500微秒,用定时器来做,每个周期至少有500微妙的时间来做其它的事情。即使要做到1微妙的精度,也只需要设置定时器定时501微秒就行啊。而且每个周期是20ms,至少有几万个机器 ...


看过了,单独搞定舵机驱动还是没问题的,我昨晚不知遇到了什么问题,用TINY13定时器全速产生方波只能有40us周期,再低就不行了,今晚再试试看。

AVR的指令周期比51更短,效率更高,如果也是12M主频,完全没有问题。
作者: yhybear    时间: 2008-5-16 14:41
这种事情,汇编是首选。否则只能用更强的cpu了,gale不要放弃啊。
作者: gale    时间: 2008-5-16 14:57
原帖由 yhybear 于 2008-5-16 14:41 发表
这种事情,汇编是首选。否则只能用更强的cpu了,gale不要放弃啊。


十年前也是从51汇编爬过来的,现在已经基本放弃汇编了,开发成本高啊,放弃久了也就生疏了。其实用了AVR以后,用C基本没有遇到过啥子麻烦,这次主要是TINY13的主频太低了。。。

另,这个东西我调了几个工作时了,有如下心得:
1、传感器太灵敏,这不是好事是坏事,非常容易饱和,不容易精确反映动作情况,需要有办法减弱其灵敏度
2、CPU主频太低,PPM解码分析什么的都是小事,很容易搞定,可要想达到“锁尾”,需要有一些比较复杂的计算
3、供电部分建议二级稳压,比如7806来一个 1117再来一个,因为太灵敏了,要减少其他因素带来的扰动
4、强烈建议用高主频大空间单片机,要想效果好,早晚用大宝,还有一些滤波、容错算法需要占用RAM和ROM啊
5、PPM信号输入要加三极管整形
6、如果要做头部感应,是否可以用红外方式???

另外,昨天我一直在想,这个东西还能做什么有趣的东西呢?
作者: ravenfire    时间: 2008-5-16 15:10
gale,先把这个做出来阿
其他好玩的我帮你想哈
作者: 飞行无极限    时间: 2008-5-16 15:30
听说要角速度的处理要用卡尔曼滤波。
作者: xunicheng    时间: 2008-5-16 15:59
gale兄,你画个mega8的电路,我打板,早动手早出东东。
作者: gale    时间: 2008-5-16 16:01
原帖由 xunicheng 于 2008-5-16 15:59 发表
gale兄,你画个mega8的电路,我打板,早动手早出东东。


不用着急,电路简单,我先面包板上搞搞。说实话,早日出东西是不指望了,楼上的卡X曼滤波已经着实吓了我一跳了,也诚征其他高手参加,不过我估计难,能把这个搞出来,就是一个锁尾陀螺仪,还是二维的,呵呵:em15:
作者: yhybear    时间: 2008-5-16 16:25
原帖由 gale 于 2008-5-16 14:57 发表


十年前也是从51汇编爬过来的,现在已经基本放弃汇编了,开发成本高啊,放弃久了也就生疏了。其实用了AVR以后,用C基本没有遇到过啥子麻烦,这次主要是TINY13的主频太低了。。。

另,这个东西我调了几个工 ...


说的很对:em26:
这个东西用在自平衡机器人,固定翼的自动平衡,飞机自动油门自动补偿中都可以试试啊,都满好玩的啊。:em19:
其实讨论一下这些东西也不错,过过干瘾,练练脑子。:em15:
作者: xunicheng    时间: 2008-5-16 16:44
原帖由 gale 于 2008-5-16 16:01 发表


不用着急,电路简单,我先面包板上搞搞。说实话,早日出东西是不指望了,楼上的卡X曼滤波已经着实吓了我一跳了,也诚征其他高手参加,不过我估计难,能把这个搞出来,就是一个锁尾陀螺仪,还是二维的,呵呵 ...

:em26: :em26: :em26: :em26:
作者: gale    时间: 2008-5-16 20:27
标题: 我现在发愁就是传感器的饱和
刚才快速搞定了两个舵机的驱动——定时器只做一件事情是很轻松的。见下:Servo1 2可取值0~200,100是中立点
//////////////////////////////////////////////////////////////////
//设置定时器0
//9.6M振荡器下主频为1.2M
//1.2M主频下 256分频=213.333us计1个数
BYTE Servo1;
BYTE Servo2;
void ServoInit(void)
{
        TCCR0A = 0;                                //不作为PWM使用
        TCCR0B = 0b00000100;        //定时器/计数器0控制寄存器bit7~3保留,bit2~0时钟选择
                                                        //000定时器计数器停止
                                                        //001=CK 010=CK/8 011=CK/64 100=CK/256 101=CK/1024
                                                        //110=外部T0脚,下降沿
                                                        //111=外部T0脚,上升沿
        TIMSK0 = 0b00000010;        //允许定时器0溢出中断
        Servo1=0;
        Servo2=0;
}

/////////////////////////////////////////////////
//定时器中断服务程序
//20ms中断一次
//舵机信号是20~22ms周期,-100%~+100% 对应1ms~2ms的脉宽

#define Delay5us() {BYTE j;for(j=0;j<2;j++) asm ("nop;");}//延时5us

SIGNAL (SIG_OVERFLOW0)
{
        BYTE i;
        
        TCNT0=256-94;

        //拉高两个舵机输出
        PWMH();        

        //延时1ms
        for(i=0;i<200;i++)
        {
                Delay5us();
        }

        //根据舵机比例在合适时机拉低舵机输出
        for(i=0;i<200;i++)
        {               
                if(i>Servo1)        PWM1L();
                if(i>Servo2)        PWM2L();
                Delay5us();
        }
}
作者: xunicheng    时间: 2008-5-16 21:29
传感器饱和似乎没什么办法解决,慢点转,呵呵。
作者: gale    时间: 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微秒的宽度递增。
作者: gale    时间: 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();
        }

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

gale你试试别按正负100%来算,按正负128来算,256级。也许就和舵机对上了。
作者: xunicheng    时间: 2008-5-16 22:44
关于传感器灵敏度的问题。

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

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

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

那边的米人基本不屑DIY。
作者: tt-01    时间: 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
作者: gale    时间: 2008-5-19 20:32
楼上的这个仅仅是振荡算法,不是锁尾算法吧?
作者: gale    时间: 2008-5-19 20:37
经过昨天的试验,熟悉了舵机的特性,即平时可以不送信号给舵机,只有在需要改变舵机位置的时候,送一系列脉冲给舵机即可(比如10个脉冲),这样的话可以大大降低CPU的负担,也不用定时器来驱动舵机了。理论上看,TINY13应该也能撑的住(但是PPM解析重构还是需要定时器的。。。),今晚继续尝试。
作者: xunicheng    时间: 2008-5-19 21:10
呵呵,加油!!
作者: gale    时间: 2008-5-19 22:12
晚上的试验很成功,现在已经达到了陀螺仪的非锁尾状态了,用的是一片MEGA8,12M晶振,运算速度嗖嗖的!再干半个小时睡觉
作者: xunicheng    时间: 2008-5-19 22:28
太好了太好了。我订的贴片Mega8芯片也到了,好小啊!做成PCB也许比上次那块板子的面积还会小。板子上应该预留一组下载线的插口吧。
作者: tt-01    时间: 2008-5-19 22:34
不是锁尾的 我不知道公式。。。
作者: tt-01    时间: 2008-5-19 22:36
还有 用我这种 IF THEN 方法不好,
刚刚接两个舵机 接连个传感器。运行起来就表现的很迟钝了。。。
看来我要靠你了。 我是搞不定了
作者: gale    时间: 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
作者: yhybear    时间: 2008-5-20 07:21
顶起!gale 加油!!看起来很有意思啊,传感器没有规格书吗?怎么电压是不定的呢?

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

[ 本帖最后由 yhybear 于 2008-5-20 09:52 编辑 ]
作者: benladn911    时间: 2008-5-20 11:05
角速度传感器 那么便宜? 玩玩是可以。

没想到楼主也会AVR单片机,我是每天都在www.ouravr.com 上乱逛。




欢迎光临 5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年) (http://bbs.5imx.com/) Powered by Discuz! X3.3