最近接触到一款加速度传感器(MMA8451Q),自己在此之前也接触过其他的(MPU605,7455)等,其实关于其的读值问题,还是难为了我一阵子,因为上次接触到最近,间隔的时间太久了,而且这之间还有很多其他的事情,所以就在此和大家分享一下我的一下心得

首先,自己现在官网上下载一系列的资料

地址为:https://www.nxp.com/products/sensors/motion-sensors/accelerometers-for-iot/2g-4g-8g-low-g-14-bit-digital-accelerometer:MMA8451Q?fpsp=1&tab=Documentation_Tab

步骤1:编写IIC时序
步骤2:MMA8451Q初始化
步骤3:读取X,Y,Z相应的寄存器
步骤4:对读出的值进行处理
步骤5:串口打印

步骤1:编写IIC时序
IIC读写MMA8451Q设备时序图
上述要写的程序分别为:

void IIC_start(void);  //开始信号
void IIC_stop(void);   //停止
void IIC_Ack(void);     //应答
unsigned char IIC_read_byte(void);      //读一个字节
void IIC_write_byte(unsigned char date);    //写一个字节
unsigned char IIC_Wait_Ack(void);  //等待应答
void IIC_NAck(void);            //不应答

下面的就是写传感器的读写函数:

  • 1 、 读(单字节读)
//函数名: MMA8451_single_Read
//函数功能: 从传感器设备读一个字节
//参数: REG_Address -- 寄存器地址
//返回值: 读回的数据
unsigned char MMA8451_single_Read(unsigned char REG_Address)
{   unsigned char dat;IIC_start();  IIC_write_byte(eSlaveAddress);  //设备地址 IIC_Wait_Ack();  IIC_write_byte(REG_Address);    //寄存器地址IIC_Wait_Ack();IIC_start();                      //SRIIC_write_byte(eSlaveAddress+1);   //设备地址 + read 方向IIC_Wait_Ack();dat = IIC_read_byte();         IIC_NAck();IIC_stop();return dat;
}

2、 读多个字节

//函数名: MMA8451_Multiple_Read
//函数功能: 从传感器设备读多个字节
//参数: REG_Address -- 寄存器地址
//      num -- 要读的字节数
//      *data_buf -- 存放读回数据的缓冲区
//返回值: 无
void MMA8451_Multiple_Read(unsigned char REG_Address, unsigned char num, unsigned char *data_buf)
{   unsigned char i;num += 1;IIC_start();  IIC_write_byte(eSlaveAddress);     //设备地址 IIC_Wait_Ack();  IIC_write_byte(REG_Address);    //寄存器地址IIC_Wait_Ack();IIC_start();                      //SRIIC_write_byte(eSlaveAddress+1);   //设备地址 + read 方向IIC_Wait_Ack();for(i=0;i<num-1;i++){*(data_buf+i) = IIC_read_byte();   if(i == num-1)IIC_NAck();elseIIC_Ack();}IIC_stop();
}

3、 写一个字节

//函数名: MMA8451_single_Write
//函数功能: 向传感器设备写一个字节的数据
//参数: REG_Address -- 寄存器地址   REG_data -- 要写的数据
//返回值: 无
void MMA8451_single_Write(unsigned char REG_Address,unsigned char REG_data)
{   IIC_start();  IIC_write_byte(eSlaveAddress);  //设备地址 + write 方向IIC_Wait_Ack();                 //等待应答IIC_write_byte(REG_Address);      //寄存器地址IIC_Wait_Ack();  IIC_write_byte(REG_data);       //数据IIC_Wait_Ack();IIC_stop();}

步骤2:MMA8451Q初始化
MMA8451_single_Write(CTRL_REG1,0x01); //唤醒传感器

步骤3:读取X,Y,Z三轴的加速度值
即读下面六个寄存器的值在读之前,需要判断一下数据是否已准备好
Bit 3 = 1:XYZ新数据已准备好
Bit 3 = 0:XYZ新数据未准备好
默认为0.

MMA8451_Multiple_Read(OUT_X_MSB,6,uc_mmA8451q_buf);

步骤4:对读出的值进行处理

根据需要修改

RegisterFlag_ZYXDR = (MMA8451_single_Read(STATUS_F_STATUS) & 0x08); //查询数据是否okif(RegisterFlag_ZYXDR == 0x08){MMA8451_Multiple_Read(OUT_X_MSB,6,uc_mmA8451q_buf);}X=uc_mmA8451q_buf[0];X=(X<<8) | uc_mmA8451q_buf[1];Y=uc_mmA8451q_buf[2];Y=(Y<<8) | uc_mmA8451q_buf[3];Z=uc_mmA8451q_buf[4];Z=( Z<<8) | uc_mmA8451q_buf[5];//*************************************************************************
//*****************************X轴
//*************************************************************************if(uc_mmA8451q_buf[0] > 0x7f){BUF[0]='-';X= ~X + 1;}else{BUF[0]='+';}a=(unsigned char)((X>>2) / 1000);r=(X>>2) % 1000;b=(unsigned char)(r / 100);r %= 100;c=(unsigned char)(r / 10);d=(unsigned char)(r % 10);//a  b  c  dnum=(int)((a*1000) + (b*100) + (c*10) + (d*1));//num = num + Offset_X; //数据初始校准if(num<0){num = (-1)*num; }uc_read_x = num;        //X轴的值

步骤5:通过串口发送 uc_read_x , uc_read_y , uc_read_z

MMA8451Q传感器读值相关推荐

  1. android传感器学习之获取传感器的值

    在上一篇中,讲到了怎么获取手机的传感器http://blog.csdn.net/nainai007/article/details/7615364,在这里是获取传感器的值. 要获取传感器的值,首先要为 ...

  2. 获取加速传感器的值 APK

    文章目录 1.加速传感器方向 2.功能显示 3.xml文件 4.功能代码 1.加速传感器方向 手机加速传感器检测: 可以想想中间位置有一个空气球, 1.手机上部抬起时,气球上移,Y变大. 2.手机右部 ...

  3. 使用Arduino读取噪声传感器分贝值

    之前一直试图用树莓派读取噪声传感器的数据,然而我用的传感器只有模拟输出和电平输出,也就是说要是想检测噪声具体分贝值就只能使用AD转换模块,但是由于对AD转换模块的认识不深,所以遇到了一些困难,虽然那个 ...

  4. Vue.js 极简小例:读值、样式调用、if判断、a 标签、点击事件、管道

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. 写法: <template><div id="app"& ...

  5. 研华板卡1742U--瞬时读值 用 instantAiCtrl1 控件

    private void btnInit_Click(object sender, EventArgs e) { DeviceInformation myDevice = new DeviceInfo ...

  6. 土壤水势传感器测量值与土壤情况参考介绍

    1.测量值在-10-0kPa范围内:表示潮湿,对多数作物湿度过高. 2.测量值在-30--10kPa范围内:表示湿润,适宜多数作物生长. 3.测量值在-50--30kPa范围内:表示干爽,喜湿作物已需 ...

  7. 从数据库里读值往TEXT文本里写

    /// <summary>   /// 把预定内容导入到Text文档   /// </summary>   private void ChangeDbToText() {    ...

  8. 从Text文本中读值插入到数据库中

    /// <summary>   /// 转换数据,从Text文本中导入到数据库中   /// </summary>   private void ChangeTextToDb( ...

  9. C语言malloc()的使用解释和报错以及读值错误分析

    最近,本大王利用C语言做数据结构时,遇到了许多与malloc相关的问题,特写此一篇来加深记忆并提醒广大初级coder. 前言:为什么使用malloc? 使用malloc()的作用: C语言的数据结构实 ...

最新文章

  1. 如何避免Java中的回调“地狱”
  2. python写一个表白程序-用Python写一个表白神器让你脱单
  3. 为利用 QT 制作的项目设置图标
  4. 北斗云计算机怎么样,北斗定位2.0版服务平台来了
  5. OSPF——多区域概念及配置、ABR简介、ASBR简介、路由重分发
  6. 字节跳动最爱考的前端面试题:计算机网络基础
  7. 【Flink】kafka INVALID_PRODUCER_EPO send data to Kafka old epoch newer producer same transactionalId
  8. Struts2框架学习笔记1
  9. 一份值得收藏的ACL 2020参会笔记:重要论文与NLP领域的发展趋势解读
  10. MikroTik RouterOS安装chr授权到阿里云虚拟机(转)
  11. 前端截取视频第一帧作为封面
  12. Mockito + JUnit 单元测试实例
  13. Java弹球游戏,刚学Java时做的
  14. 联想笔记本连不上手机热点_联想笔记本连不上无线_联想笔记本连不上热点
  15. Scrapy实例__链家租房爬虫
  16. python 批量更改扩展名
  17. 拉线传感器的数显仪表在测量中起到多大的作用
  18. 使用matplotlib绘制xkcd动漫风格的图表(解决中文字体问题)
  19. matlab井函数,用MATLAB函数解承压含水层完整井非稳定流问题
  20. OneTab插件的替代产品-OneTab Pro

热门文章

  1. 银行数字化的两难:安全还是效率?
  2. 一个有用的Win32消息处理宏HANDLE_MSG
  3. python-求无理数e的近似值
  4. 书到用时方恨少? 整理了一份初中、高中数学教材pdf 百度云
  5. CSS子元素撑满父元素(height: 100%无效)
  6. Vue 使用three.js实现简单全景图
  7. Android使用SharedPreferences存储数据
  8. ae制作小球轨迹运动_AE教程AE特效:教你如何用AE创建一个弹跳运动的小球特效...
  9. 彻底搞懂Python一切皆对象!!!
  10. Java客户关系管理CRM源码带小程序