OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 38394|回复: 12

JY-901模块数据解算方法

[复制链接]

44

主题

62

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
382
金钱
382
注册时间
2013-8-31
在线时间
14 小时
发表于 2016-7-20 09:07:08 | 显示全部楼层 |阅读模式
本帖最后由 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;

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

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

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2017-5-22
在线时间
27 小时
发表于 2017-5-22 15:01:15 | 显示全部楼层
大哥你用的是usart例子是吗,我用I2C的时候用提供的例子读不到数据能否帮忙一下,只能读到一个,而且还是错的
回复 支持 反对

使用道具 举报

25

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
404
金钱
404
注册时间
2016-8-23
在线时间
50 小时
发表于 2017-11-16 09:45:08 | 显示全部楼层
mangoball 发表于 2017-5-22 15:01
大哥你用的是usart例子是吗,我用I2C的时候用提供的例子读不到数据能否帮忙一下,只能读到一个,而且还是错 ...

用串口读多方便
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2017-12-18
在线时间
4 小时
发表于 2018-5-3 20:19:06 | 显示全部楼层
mangoball 发表于 2017-5-22 15:01
大哥你用的是usart例子是吗,我用I2C的时候用提供的例子读不到数据能否帮忙一下,只能读到一个,而且还是错 ...

I2c上拉电阻接了吗?
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2018-8-29
在线时间
0 小时
发表于 2018-9-26 15:14:15 | 显示全部楼层
有代码么?分享一下呗
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2018-5-21
在线时间
1 小时
发表于 2019-1-21 14:06:35 | 显示全部楼层
很好的贴子
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2019-7-17
在线时间
0 小时
发表于 2019-7-17 16:18:28 | 显示全部楼层
32代码该怎么写呢
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2020-7-30
在线时间
0 小时
发表于 2020-7-30 10:19:15 | 显示全部楼层

想问一下串口怎么读
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2020-10-31
在线时间
0 小时
发表于 2020-10-31 16:11:55 | 显示全部楼层
模块跟stm32单片机连接。现在问题是不知怎么将接收到的数据解析出来,因为接收到的数据帧头几乎都不是0x55开头的,这个解析就比较难办了,
回复 支持 反对

使用道具 举报

10

主题

129

帖子

0

精华

高级会员

Rank: 4

积分
744
金钱
744
注册时间
2020-5-11
在线时间
70 小时
发表于 2021-4-20 22:11:08 | 显示全部楼层
有人有源码吗
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2022-5-18
在线时间
1 小时
发表于 2022-5-26 00:27:22 | 显示全部楼层
为什么这个能够实现数据的转换呢?能说明一下大概原理吗??使用结构体内存拷贝的方法:  先定义一个加速度包的结构体  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;
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2022-5-18
在线时间
1 小时
发表于 2022-5-26 01:06:08 | 显示全部楼层
为什么下面这个能够处理数值的16进制呢?有人能详细说一下为什么能传递数据吗?定义一个加速度包的结构体就能

struct SAcc

{

         short a[3];

         short T;

};

再定义一个结构体对象

struct SAcc               stcAcc;

再用内存拷贝将数据从ucRxBuffer[2]的地址拷贝到结构体中即可。

memcpy(&stcAcc,&ucRxBuffer[2],8);
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2021-1-1
在线时间
1 小时
发表于 2022-7-30 20:27:11 | 显示全部楼层
请问磁传感器的范围设置寄存器地址和典型值是什么?说明书里面好像没有啊
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 09:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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