热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

三轴加速度传感器BMA250解读

BMA250凭借其超小的封装,低功耗越来越多的产品在这个芯片作为辅助,比如GPS定位时防止静止时定位信息漂移,可以借助其判断物体是静止还是运动。还有实现计步功能、角度测试等………………经过几天对BMA

BMA250凭借其超小的封装,低功耗越来越多的产品在这个芯片作为辅助,比如GPS定位时防止静止时定位信息漂移,可以借助其判断物体是静止还是运动。还有实现计步功能、角度测试等………………

经过几天对BMA250资料的搜集和测试,先做以下小的总结:

1、   其测量可以测试±2g、±4g、±8g、±16g。因为芯片内部集成了AD转换,转换精度是10位的,所以当我们接受数据时可以先分析其数值接受的范围是0-1023。在这里要了解一个名词就是LSB(最小有效位,为数字输出方式)在芯片手册里我们会发现:


通过配置寄存器g-range地址是0x0f选择加速度的范围。程序中我们选择了±2g,即配置寄存器为0x03。当我们接受到数值以后将接受的数值*3.9就是当前某个轴的加速度。这里在回忆一下高中学习的知识,物体静止时有1g的重力加速度。三轴加速度也是一样,查看芯片手册里面有一个芯片的摆放以及各个方向的重力加速度,这个可以作为测试用。

2、   分别读取X、Y、Z三轴的数值,看手册会发现其寄存器是0x02、0x03、0x04、0x05、0x06、0x07,其中xyz的MSB分别在0x03、0x05、0x07,LSB中是0x02、0x04、0x06,所以在读取寄存器的值的时候合并时是16位的数据,但是低六位是没有的所以要右移六位去掉无效数据,剩下的十位数据就是我们要的结果。收集到收据以后我们就可以进行数据的处理。本程序因为只测试是运动还是静止没有必要分析是哪个方位运动所以讲正负加速度都处理成加速度没有方向。这里我们通过一个加速度的信号幅度向量SVM(Support Vector Machine)来做一个总的处理。程序是:(我们定义的是无符号整形,因为做简单处理)

SVM=(u16)(sqrt(temp_x*temp_x+temp_y*temp_y+temp_z*temp_z));

3、   该芯片有SPI和IIC两种通信方式,我们采用的是IIC通信方式,这里主要就是通过手册我们查找其地址,看手册我们发现当SDO接GNG或者float时,芯片地址是0x18(即写地址是0x30读地址是0x31),当SDO接VDDIO时芯片地址是0x19(即写地址是0x32读地址是0x33)。

4、   芯片的配置还有就是器传输的带宽我们可以参考器手册:程序中选择了7.81HZ。


5、   如果没有使用中断我们通过配置寄存器0x09将其设置为0x00。

附录程序:

#include"bma250.h"

 

u16AccelX;

u16AccelY;

u16AccelZ;

externu16 SVM;

 

//写寄存器函数

staticvoid bma250_write_reg(u8 addr,u8 val)

{

    I2C_Start();

  I2C_Send_Byte(slaveaddress)   ;    //发送写器件指令  

    I2C_Wait_Ack();  

  I2C_Send_Byte(addr);              //发送寄存器地址

    I2C_Wait_Ack();                                                        

    I2C_Send_Byte(val);             //发送值                      

    I2C_Wait_Ack();                    

  I2C_Stop();                       //产生一个停止条件    

}

 

 

//传感器初始化

voidbma250_init()

{

    bma250_write_reg(0x0F,0x03);      //加速度范围为+-2g

     bma250_write_reg(0x10,0x08);     //传输带宽为7.81HZ,64MS

     bma250_write_reg(0x09,0x00);     //无中断

}

 

 

//读寄存器函数

u8bma250_read_reg(u8 addr)

{

    u8 temp=0;     

    I2C_Start();                

    I2C_Send_Byte(slaveaddress);    //发送写器件指令   

    temp=I2C_Wait_Ack();      

  I2C_Send_Byte(addr);          //发送寄存器地址

    temp=I2C_Wait_Ack();                                                       

    I2C_Start();               //重新启动

    I2C_Send_Byte(regaddress);  //发送读器件指令   

    temp=I2C_Wait_Ack();      

  temp=I2C_Read_Byte(0);        //读取一个字节,不继续再读,发送NAK              

  I2C_Stop();                   //产生一个停止条件     

    return temp;

}

 

 

//读取数据函数

u16bma250_read_data(void)

{

    u8 buf[6];

    float temp_x,temp_y,temp_z;  

    u8 i;

    I2C_Start();                

    I2C_Send_Byte(slaveaddress);    //发送写器件指令   

    I2C_Wait_Ack();   

  I2C_Send_Byte(0x02);          //发送寄存器地址(数据缓存的起始地址为0X32)

    I2C_Wait_Ack();                                                        

 

    I2C_Start();                //重新启动

    I2C_Send_Byte(regaddress);  //发送读器件指令

    I2C_Wait_Ack();

    for(i=0;i<6;i++)

    {

        if(i==5)

            buf[i]=I2C_Read_Byte(0);//读取一个字节,不继续再读,发送NACK 

        else

            buf[i]=I2C_Read_Byte(1);    //读取一个字节,继续读,发送ACK

    }                 

   I2C_Stop();                  //产生一个停止条件

   

    AccelX = buf[1] <<8;

        AccelX |= buf[0];

     AccelX >>=6;

     if(AccelX>512)

        {

             AccelX <<=6;

             AccelX=~AccelX;

             AccelX=AccelX+1;

             AccelX >>=6;

         }

    temp_x=(float)AccelX*3.9;  //计算数据和显示

     

   

     AccelY = buf[3] <<8;

        AccelY |= buf[2];

     AccelY >>=6;

       if(AccelY>512)

        {

            AccelY <<=6;

            AccelY=~AccelY;

            AccelY=AccelY+1;

            AccelY >>=6;

         }

    temp_y=(float)AccelY*3.9;  //计算数据和显示

   

     AccelZ = buf[5] <<8;

        AccelZ |= buf[4];

        AccelZ >>=6;

         if(AccelZ>512)

        {

             AccelZ <<=6;

       AccelZ=~AccelZ;

             AccelZ=AccelZ+1;

             AccelZ >>=6;

         }

    temp_z=(float)AccelZ*3.9;  //计算数据和显示

   

     SVM=(u16)(sqrt(temp_x*temp_x+temp_y*temp_y+temp_z*temp_z));

           

        return SVM;

}

 

#ifndef_BMA250_H

#define_BMA250_H

 

 

#define slaveaddress  0x30   //看BMA250手册当SDO接GND或者float是地址是//0x18(即写地址是0x30,读地址是0x31)当SDO接VDDIO时

                              //地址是0x19(即写地址是0x32,读地址是0x33)

 

 

#defineregaddress 0X31              //read

 

#defineDEVICE_ID 0X00

 

 

//传感器初始化

voidbma250_init();

//读寄存器函数

u8bma250_read_reg(u8 addr);

//读取数据函数

u16bma250_read_data(void);

 

#endif

 


推荐阅读
  • 为什么需要有应用层缓冲区?muduo网络库使用IO复用,并且文件描述符使用非阻塞模式,如果使用阻塞模式那么read、write就会阻塞在 ... [详细]
  • TLB 缓存延迟刷新漏洞 CVE201818281 解析 ... [详细]
  • 下面是一个用openssl实现获取https网页内容的demo,整个流程比较简单,主要封装的API如下staticinthttps_init(http ... [详细]
  • Shiro 简单了解
    Shiro简单了解简单用过SpringSecurity安全框架后,再试试另一个安全框架——Shiro。1.Shiro简介ApacheShiro是一个强大且易用的Java安全框架:S ... [详细]
  • 技术点:1、通过已知的网页路径获得流2、把流转换成字节数组3、把字节数组转换成String字符串显示在TextView控件中一、获得流publicstaticSt ... [详细]
  • socket8 [命名管道]
    ::命名管道不但能实现同一台机器上两个进程通信,还能在网络中不同机器上的两个进程之间的通信机制。与邮槽不同,命名管道是采用基于连接并且可靠的传输方式,所以命名管道传输数据只能一对一 ... [详细]
  • mysql join 算法_【MySQL】之join算法详解
    在阿里巴巴的java开发手册有这么一条强制规定:超过三个表禁止join,须要join的字段,数据类型保持绝对一致,多表关联查 ... [详细]
  • 【go密码学】对称加密算法
    对称加密对称加密算法是相对于非对称加密算法而言,两者的区别在于,对称加密和加密和解密时使用相同的秘钥,而非对称加密在加密和解密时使用不同的秘钥(公钥和私钥)。常见的对称加密算法:D ... [详细]
  • 【JVM技术专题】深入分析CG管理和原理查缺补漏「番外篇」
    前提概要本文主要针对HotspotVM中“CMSParNew”组合的一些使用场景进行总结。自Sun发布Java语言以来,开始使用GC技术来进行内存自动管理࿰ ... [详细]
  • RabbitMQ之队列与消息持久化
    队列持久化在之前的例子中,我们所用的队列都是临时队列,当服务重启后之前创建的队列就都没有了。队列的持久化是在定义队列时的第二个参数决定的(false为队列不用持久化)channel.queueDecl ... [详细]
  • cp.php这四个,那么我们如何根据你访问的URL判断涉及到那些PHP文件和模板文件,方便您的进一步修改!好了,现在我们以最 ... [详细]
  • LwIP系列内存管理(堆内存)详解
    一、目的小型嵌入式系统中的内存资源(SRAM)一般都比较有限,LwIP的运行平台一般都是资源受限的MCU。为了能够更加高效的运行ÿ ... [详细]
  • 一、腐烂的橘子1、题目描 ... [详细]
  • 什么是“传递优化缓存”“传递优化”是微软为了加快Windows更新和MicrosoftStore应用更新的下载速度,而在Windows10中引入的一种“自组织分布式本地化缓存”设计,可以在用户 ... [详细]
  • 本文是《开发你的WordPress主题框架》专题的第10篇,共10篇:为你的WordPress主题框架添加动作挂钩WordPress主题框架是如何工作的决定如何开发你的WordPress主题框架为你的WordPress主题框架建立起始文件为你的Wo ... [详细]
author-avatar
上帝的爱神_413_645
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有