搜索
bottom↓
回复: 6

使用加速度计MMA8451Q中遇到的疑问(已解决)

[复制链接]

出0入0汤圆

发表于 2014-2-19 23:09:18 | 显示全部楼层 |阅读模式
本帖最后由 FSL_TICS_ZP 于 2014-3-4 11:02 编辑

阅读手册得知8451为14/8位精度的数字加速度计。在学习如何切换两种精度的时候在手册上读到了以下信息:
拿X轴为例,OUT_X_MSB寄存器中7:0存储采集值的13-6位,OUT_X_LSB中7:2存储采集值的5-0位,就是说把两个寄存器组合在一起这个14位数是左对齐的。如果想采集12位精度,就采集两个寄存器中的值再组合,如果想采集8位精度,就置位CTRL_REG1寄存器中的F_READ位,然后只采集OUT_X_MSB,忽略OUT_X_LSB就可以了。
在实践中问题来了:
实际采集过程中,发现数据并没有按照手册中说明的方式存储,测试后发现实际上是OUT_X_MSB中5:0存储的13-8位,OUT_X_MSB中7:0存储的7-0位,右对齐。如果按他给出的方式去采集8位精度实际上采集回来的是6位精度。
请问是我理解错了吗?问题出现在了哪里?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-2-20 17:44:12 | 显示全部楼层
存储方式是按照OUT_X_MSB寄存器中7:0存储采集值的13-6位,OUT_X_LSB中7:2存储采集值的5-0位的,我们官方例程有这么操作,结果是正确的。
另外我们有一篇中文的文档,你可以参考下:
http://www.amobbs.com/thread-5557145-1-1.html

出0入0汤圆

发表于 2014-4-25 12:29:29 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-2-20 17:44
存储方式是按照OUT_X_MSB寄存器中7:0存储采集值的13-6位,OUT_X_LSB中7:2存储采集值的5-0位的,我们官方例 ...

if (regValue & DATA_STATUS_ZYXDR_MASK)
        {
            //读取三轴加速度计值
            MMA845xReadMultiRegisters(OUT_X_MSB_REG, buffer, 6);
            
            ax = (buffer[0] << 8) | buffer[1];
            ay = (buffer[2] << 8) | buffer[3];
            az = (buffer[4] << 8) | buffer[5];
            
            //32位符号扩展
            if (ax & 0x8000)
            {
                ax |= (~(unsigned int)0) << 16;
            }
            if (ay & 0x8000)
            {
                ay |= (~(unsigned int)0) << 16;
            }
            if (az & 0x8000)
            {
                az |= (~(unsigned int)0) << 16;
            }
            
            //有符号数右移(正数高位补0,负数高位补1)
            ax >>= offset;
            ay >>= offset;
            az >>= offset;
            
            //处理一下,以方便格式化输出
            ax1 = (unsigned int)ax & 0xFFFF;
            ay1 = (unsigned int)ay & 0xFFFF;
            az1 = (unsigned int)az & 0xFFFF;
            
            //以十六进制方式输出三轴加速度计的值(原始值)
            printf("ax=0x%04x, ay=0x%04x, az=0x%04x\n", ax1, ay1, az1);
            
            //以十进制方式输出三轴加速度计的值
            printf("ax=%6d, ay=%6d, az=%6d\n", ax, ay, az);
        }
你好,可以详细解释一下该段程序为什对数据这样操作吗?

出0入0汤圆

发表于 2014-4-25 12:58:25 | 显示全部楼层
小小工大 发表于 2014-4-25 12:29
if (regValue & DATA_STATUS_ZYXDR_MASK)
        {
            //读取三轴加速度计值

这些就是为了转换成串口输出时的16进制、10进制形式才做的数据处理。
如果只是芯片内部处理,不需要那么复杂地去转。

出0入0汤圆

发表于 2014-4-25 13:03:56 | 显示全部楼层
FSL_TICS_Robin 发表于 2014-4-25 12:58
这些就是为了转换成串口输出时的16进制、10进制形式才做的数据处理。
如果只是芯片内部处理,不需要那么 ...

比如芯片猜得数据是0x8A,为了让串口能够以16进制形式输出,需要转换成ASCII码0x38 0x41,这样子电脑端串口助手以字符才能看到8A.
同样的,为了让串口能够以10进制形式输出,需要将0x8A(138)转换成0x31 0x33 0x38,这样....138

出0入0汤圆

发表于 2014-4-25 15:33:15 | 显示全部楼层
FSL_TICS_Robin 发表于 2014-4-25 13:03
比如芯片猜得数据是0x8A,为了让串口能够以16进制形式输出,需要转换成ASCII码0x38 0x41,这样子电脑端串 ...

谢谢你的回答。

出0入0汤圆

发表于 2014-4-25 15:39:57 | 显示全部楼层

不用客气
以后有啥问题欢迎在论坛里发帖讨论
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 06:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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