查看: 104|回复: 0

[经验] 维特智能的JY901模块数据解算方法

[复制链接]

主题

好友

540

积分

举人

该用户从未签到

发表于 2019-9-3 14:35:31 |显示全部楼层

维特智能的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进制方式。如下图

如果能看到这种以55 51 或者55 52打头的数据,就说明接收到正确的数据了。

以加速度为例,加速度的数据是55 51 开头的数据包,比如上图圈选出来的数据是55 51 78 FD 4E 03 85 F8 FC 0E F3,根据厂家的说明文档,协议的规定是这样的

那么上述数据中,78 FD就是Ax的数据,4E 03就是Ay的数据,85 F8就是Az的数据 FC 0E是温度的数据, F3是校验和。以Ax的数据为例,AxL是78,AxH是FD,那么完整的16进制数据是FD78,转换我们需要使用到Windows的计算器。打开计算器以后,点击这里的标准


然后选择程序员,计算器进入程序员模式,再点击Hex,进入16进制模式。

接着就可以输入数据了,输入FD78,注意这里的WORD模式要调成WORD,这里是定义使用的字节数,如果选择错误将不能获得正确的结果



可以看到转换出来的结果是-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;

这样就获得了正确的加速度值。

同理可以获得角速度与角度数值。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐上一条 /5 下一条

手机版|电路城

GMT+8, 2019-9-18 05:37 , Processed in 0.060799 second(s), 13 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz!

返回顶部