x1001 发表于 2011-11-4 12:32:10

小弟接了个项目,用到三轴传感器判断水平XY的运动方向,请教各位怎么做?我按文档试了多种

我现在用的是MMA7660FC,根据它的X,Y,Tilt寄存器的值单纯判断,不起作用,前后左右的运动,这些数值没什么明显的变换,如果不是水平,象翻转还是很明显,不知道是要用个什么算法还是有别的处理,请教下各位了,多谢了!

ele_eye 发表于 2011-11-4 13:16:42

MMA7660FC 斜着放!

okARM 发表于 2011-11-4 13:30:33

陀螺仪是要翻转才有变化,向一楼说的设计成斜的,水平放置的时候X指示的是翻滚,Y指示的是俯仰,那你要x指示前后,Y指示左右平移,那你就要设计安放的角度模拟水平放置的状态

okARM 发表于 2011-11-4 13:34:03

很难设计,测的是角速度,要有角度变化,也就是绕轴向做圆周运动,前后怎么移也是水平运动

okARM 发表于 2011-11-4 13:36:37

忘了,你用的是加速度计,水平运动比较快还是有变化的

x1001 发表于 2011-11-4 14:58:17

刚才照两位说的,试了一下,斜着放,前后左右运动,分量数值变化差不多。另外,运动速度快一点,也是一样。测试多次,有一次吧会是“正确”的,但不具有重复性。
问了一个飞思卡尔的FAE,说把XY的值归到象限中去判断,可前面左右运动,这个数据显示的象限,还是要么总在这个象限,要么总在那个象限,还是无法进行判断。

从原理上说,应该可以判断一个大概的方向,不知哪个高手可以传点经验啊?

htjgdw 发表于 2011-11-4 15:38:58

用数字接口的加速度传感器吧,比如SPI, IIC接口的。
那样就省事了。

hemjidn 发表于 2011-11-4 15:39:46

……
你确定是在加速时读数据?

ele_eye 发表于 2011-11-4 15:56:09

这是加速度传感器,缓慢移动加速度很小 数值只有少许变化,需要对时间进行两次积分运算,就会变换成位移 ,你的前后移动姿态想要的可能是前后的位移,而不是加速度,2次积分后数值会很大的 传感器分辨率不高的话误差会很大的

x1001 发表于 2011-11-4 21:52:06

MMA7660应该是飞思卡尔最低端的三轴加速度传感器了吧,才6位,很便宜。

这个需求也比较简单,不要求在加速时读数据与否,也不要求 求得位移,只要要求在运动开始时,或在运动结束后,需要知道它是朝哪个方向运动的,以便处理。

可就是没有个思路,把手册看了几遍,根据原始数据来处理,一直都不对。

不知道哪个大牛可以提供个思路或指点一二啊?

goodjob1 发表于 2011-11-5 00:14:35

下面是我的想法,请大家指教:
可以用一定频率扫描加速度值,然后积分出速度和运动距离。假设get_MMA7660_data()这个函数可以取得X\Y的加速度值Xa和Ya。在get_MMA7660_data()中要加入滤波程序,确保读取值尽量精确。

int XA;//初始化时的X加速度,即静止时的加速度,理想状态应该是0
int YA;//初始化时的Y加速度,即静止时的加速度,理想状态应该是0
int Xa;//get_MMA7660_data()实时测得的X加速度
int Ya;//get_MMA7660_data()实时测得的Y加速度
int VX=0;//当前的X方向速度
int VY=0;//当前的Y方向速度
int X=0;//当前所在的X坐标轴位置
int Y=0;//当前所在的Y坐标轴位置

unsigned char FLAG_X=0;//X方向移动标志
unsigned char FLAG_Y=0;//Y方向移动标志

int X_lasttime=0;//;//运动前的X坐标
int Y_lasttime=0;//运动前的Y坐标
int Xposition=0;//此次X方向移动的距离
int Yposition=0;//此次Y方向移动的距离



get_MMA7660_data();//此次是在未移动的情况下初始化系统
XA=Xa;
YA=Ya;

//使用定时器每隔固定时间(周期越小越精确)运行以下程序:
{
get_MMA7660_data();
VX=VX+Xa-XA;//计算X轴运动速度
X=X+VX;//计算X轴当前位置
VY=VY+Ya-YA;//计算Y轴运动速度
Y=Y+VY;//计算Y轴当前位置
}

主循环:
while(1)
{
//计算X轴方向移动
if(VX==0&&FLAG_X==1)//在X方向运动的状态下计算出速度降为0,视为一次运动停止
{
   Xposition=X-X_lasttime;//Xposition在此次运动中行动的距离,数值为正即为正方向移动,为负即为负方向移动
   FLAG_X=0;//表示X轴方向停止移动
   X_lasttime=X;//将停止后的坐标做为下一次运动前的坐标
}

if(VX!=0&&FLAG_X==0)
{
   FLAG_X=1;//表示X轴方向开始移动
}

//计算Y轴方向移动
if(VY==0&&FLAG_Y==1)//在Y方向运动的状态下计算出速度降为0,视为一次运动停止

{
   Yposition=Y-Y_lasttime;//Yposition在此次运动中行动的距离,数值为正即为正方向移动,为负即为负方向移动
   FLAG_Y=0;//表示Y轴方向停止移动
   Y_lasttime=Y;//将停止后的坐标做为下一次运动前的坐标
}

if(VY!=0&&FLAG_Y==0)
{
   FLAG_Y=1;//表示Y轴方向开始移动
}

}

//建议根据实际工况设置一定时器,当速度低于某个值一段时间后,视为运动已停止。这是为了避免积分误差导致速度无法归0。楼主要求只要取得方向,对运动距离精度没要求,我觉得上面的计算应该可以实现。初学单片机,写的程序乱,请大家见谅

编辑原因:整理和修正代码

x1001 发表于 2011-11-5 10:51:45

谢谢goodjob1,:)
我照你这个思路试一下啊,:)

x1001 发表于 2011-11-5 22:03:54

根据goodjob1兄弟提供的思路试了下,它这里是把运动分时间段,计算每段的位移,再来相减。而测试时,就一直前行的话,得出来就不对,并且,这样的误差也有点大。

liguole 发表于 2011-11-5 22:57:14

http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_692273AKRJRQ.jpg
加速度传感器自身摆放不同状态时各轴输出值 (原文件名:加速度计.jpg)

http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_692274HLDT7R.jpg
每个芯片手册上都会有的传感器 XYZ三个轴及方向,根据你得到值的方向判断运动加速度方向,加速度计对水平感应比重力敏感多了 (原文件名:加速度计图.jpg)

x1001 发表于 2011-11-6 01:28:59

又把它改成只计算速度,打印出来速度的值,全部是正值,不管是不是正反方向运动,想一想,也是的:每次由静止到运动,加速度是正的了,加速度变为负只有运动过程 ,反向施力的那一即时的事,但速度都是正的。

x1001 发表于 2011-11-6 01:35:28

谢谢 liguole 李国乐,这个图,MMA7660中也有,也是差不多是那样的,但那个摆放不是水平方向的摆放的,只有x=y=0,z=1g才是水平状态的摆放。
所以,要判断运动方向,还得别的考虑了?

liguole 发表于 2011-11-6 20:04:46

芯片水平放置 水平晃动传感器;XY各输出对应轴的加速度值,加速度是有方向性的,应该可以满足你的要求!倾斜测量是0~1G 但是运动加速度可就不止1G了 所以测运动加速度范围比测量倾大角多了


你需要判断运动方向的运动加速度变化快吗?

goodjob1 发表于 2011-11-6 21:22:45

如果你的芯片可以测出负加速度就可以算出负速度啊,如果得不到负速度是算法不对哦。这里的正负只是指方向啊,比如你的系统在静止状态朝负方向运动,那你的加速度计得到的是个负加速度,积分得到的速度就是负的啊。另外其实我觉得测量运动状态用加速度计本来就很难达到高精度,因为加速度计只能靠积分计算速度来测算运动状态。但是测量精度受芯片精度和测量频率影响,频率太低就没办法保证精度。所以我觉得最好是用类似光电鼠标的方式来测量运动状态。

asha 发表于 2011-11-7 08:26:38

回复【楼主位】x1001
-----------------------------------------------------------------------

请注意这个传感器的分辨率,你用手动的加速度可能很小。 而且运动起来基本是个匀速,这不是算法能够解决的。换传感器吧。哥们,你的是什么项目?有合作的可能的话,加qq1487494416.

x1001 发表于 2011-11-7 10:09:28

谢谢liguole 李国乐,我需要判断速度的方向也不是很频繁,1、2秒钟判断一次就可以了。

加速度是有方向的,但是在实际上,给一个方向的力,它有加速度了,是正的,但它停下来时,因为摩擦力给了它负的加速度的,整个距离但还是正向的,好象照前面那样简单考虑,计算出来的有问题。

x1001 发表于 2011-11-7 10:11:31

【17楼】 goodjob1 如果你的芯片可以测出负加速度就可以算出负速度啊,如果得不到负速度是算法不对哦。

-----
谢谢 goodjob1 ,应该是算法不对的,我也是想怎么做才好。

x1001 发表于 2011-11-7 10:21:31

【18楼】 asha
----
谢谢,运动中到不是用手来测试的,是在一个平台上上,拖动的,有加速度的,我是想,因为我只需要简单的方向判断,可能也够,如果算法弄好应该可以吧,如果换了个高精度传感器,不需要算法,那也可以考虑啊,不过,我想应该也是要算法的了吧?

asha 发表于 2011-11-7 15:46:54

回复【21楼】x1001
-----------------------------------------------------------------------

也可能够,也可能不够。不过一般不会有多大的加速度。

lisn3188 发表于 2011-11-7 17:33:41

首先,判断目标物件是否是在加速状态,条件是
如果,三个轴的加速度合为1G 那么视为物件静止的或者是匀速直线运动
如果,三个轴加速度不为1G,判断X Y 轴上的加速值,运算可以得到正在加速的方向,与物件原来是的运动方向熔合可以估算正在运动的方向。

这个会有累计误差,建议加一个磁航向,直接定位物件的机头指向

x1001 发表于 2011-11-7 18:05:51

谢谢 lisn3188 龙南 ,就是原来的方向,也是不能够都是确定的,不能够判断出来,也得通过加速度来计算出来,:)

司马朝阳 发表于 2013-5-28 18:43:39

顶                              学习了         

labi40 发表于 2013-6-7 22:44:26

应该好好学习!

tenx 发表于 2013-6-7 22:58:09

怎么不用电子指南针模块
页: [1]
查看完整版本: 小弟接了个项目,用到三轴传感器判断水平XY的运动方向,请教各位怎么做?我按文档试了多种