JY-901模块数据解算方法

2019-07-20 22:22发布

本帖最后由 supergiant 于 2016-7-20 09:21 编辑

JY-901模块数据解算方法
JY901模块是一款高精度的姿态测量模块,能够测量被测物体的姿态角度,以欧拉角或者四元素的方式输出。模块的数据采用16进制的方式进行传输,这种方式的优点是效率高,可以用很少的字节传输需要的数据,比如一个数据1.523,如果用16进制方式传送的话,2个字节就够了,而用ascii码的话,需要5个字节,在需要大量数据传输的时候就比较浪费有限的带宽了。而16进制数据的缺点呢,就是可读性不强,不像Ascii码那样,直接就能读出数据了。 16进制数据传输的原理是这样的,先要确定数据的表示范围,然后是每个数据可用的字节数。比如角度的数据,每个角度的数据范围是±180度,而2个字节16进制数的表示范围是-32767~32768之间,那么我们就把±180的数据映射到±32768之间。假设原理的数据是x,变换以后的数据是y,那么y=x/180*32768。2个字节能表示的最小精度是1/32768*180=0.0055°,这对于角度的精度来说也够用了。 下面具体讲解析的方法。 先通过串口调试助手看模块的原始数据,注意要选择好正确的波特率,并且将模块的显示模式勾选为16进制方式。如下图 1.png 如果能看到这种以55 51 或者55 52打头的数据,就说明接收到正确的数据了。以加速度为例,加速度的数据是55 51 开头的数据包,比如上图圈选出来的数据是55 51 78 FD 4E 03 85 F8 FC 0E F3,根据厂家的说明文档,协议的规定是这样的 5.png 那么上述数据中,78 FD就是Ax的数据,4E 03就是Ay的数据,85 F8就是Az的数据 FC 0E是温度的数据, F3是校验和。以Ax的数据为例,AxL是78,AxH是FD,那么完整的16进制数据是FD78,转换我们需要使用到Windows的计算器。打开计算器以后,点击这里的标准 2.png 然后选择程序员,计算器进入程序员模式,再点击Hex,进入16进制模式。 3.png 接着就可以输入数据了,输入FD78,注意这里的WORD模式要调成WORD,这里是定义使用的字节数,如果选择错误将不能获得正确的结果 4.png 可以看到转换出来的结果是-648,然后根据说明书给出的公司计算,得到Ax = -648/32768*16g=-0.316g。至此数据解析就完成了,同理可以算出Ay,Az和温度的数据。 如果使用单片机去解析数据,那么一定要注意数据的强制转换,先将高字节强制转换为有符号的short类型,然后再左移8位,然后再与低字节或,这样才能得到有正负符号的数据。 比如已经将找好包头的数据放置到ucRxBuffer这个数组里面了,然后就可以用下面的方法进行转换。Ax = (((short)ucRxBuffer[3]<<8)|ucRxBuffer[2])/32768.0*16.0; 或者使用结构体内存拷贝的方法:先定义一个加速度包的结构体struct SAcc{         short a[3];         short T;};再定义一个结构体对象struct SAcc               stcAcc;再用内存拷贝将数据从ucRxBuffer[2]的地址拷贝到结构体中即可。memcpy(&stcAcc,&ucRxBuffer[2],8);这样得到的数据是具有符号的-32767~32768之间的数据,如果还需要将数据映射到加速度的量程范围A[0]=  stcAcc.a[0]/32768.0*16.0;这样就获得了正确的加速度值。同理可以获得角速度与角度数值。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
mangoball
1楼-- · 2019-07-21 01:53
大哥你用的是usart例子是吗,我用I2C的时候用提供的例子读不到数据能否帮忙一下,只能读到一个,而且还是错的
longshengma
2楼-- · 2019-07-21 06:39
 精彩回答 2  元偷偷看……
伏羲的曦
3楼-- · 2019-07-21 08:36
 精彩回答 2  元偷偷看……
凭窗无风68686
4楼-- · 2019-07-21 09:23
有代码么?分享一下呗
GodFather
5楼-- · 2019-07-21 13:22
很好的贴子
我是你江啊
6楼-- · 2019-07-21 19:17
32代码该怎么写呢

一周热门 更多>