MPU6500数据读取

  • 一、程序流程图
  • 二、代码详解
    • 1、SPI初始化函数
    • 2、MPU6500读写寄存器函数
    • 3、MPU6500初始化
    • 4、MPU6500数据获取

一、程序流程图

原始数据的数据读取十分简单,就是先对传感器进行一系列的初始化,然后再读取特定寄存器的值就行了。所谓的初始化,就是对传感器的配置寄存器写入特定值。单片机与传感器之间采用SPI通信,流程图如下:

根据流程图,我们只需要写四个函数就能实现读取功能:

1、SPI初始化函数
2、写MPU6500寄存器函数
3、读MPU6500寄存器函数
4、初始化MPU6500函数

二、代码详解

1、SPI初始化函数

SPI初始化函数就不多讲了,原子野火均有讲解,为了文章完整性,代码粘贴如下:

void Init_SPI5(void)
{GPIO_InitTypeDef  GPIO_InitStructure;SPI_InitTypeDef  SPI_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI5, ENABLE);GPIO_PinAFConfig(GPIOF,GPIO_PinSource7,GPIO_AF_SPI5);GPIO_PinAFConfig(GPIOF,GPIO_PinSource8,GPIO_AF_SPI5);GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_SPI5);/*SCK、MISO、MOSI*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOF, &GPIO_InitStructure);GPIO_SetBits(GPIOF,GPIO_Pin_7 | GPIO_Pin_8 |GPIO_Pin_9);/*NSS*/GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;GPIO_Init(GPIOF, &GPIO_InitStructure);GPIO_SetBits(GPIOF,GPIO_Pin_6);SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;SPI_InitStructure.SPI_Mode = SPI_Mode_Master;SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;           //10SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;         //01SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;  // !!!MSB先行SPI_InitStructure.SPI_CRCPolynomial = 7;SPI_Init(SPI5, &SPI_InitStructure);SPI_Cmd(SPI5, ENABLE);
}

2、MPU6500读写寄存器函数

SPI是双向全双工通信协议,发送和接收是同时进行的。就是说,当单片机用SPI向传感器发送一个字节,同时会收到来自传感器的一个字节数据。所以通常把读写都写在一起,在对传感器寄存器写值时可以丢弃返回的数据,而在读取寄存器值时发送一个空字节,然后接收数据就好了。

读写函数:
两个while 用于确保数据稳定发送(接收)

uint8_t SPI5_Read_Write_Byte(uint8_t TxData)
{                    uint8_t retry = 0;while (SPI_I2S_GetFlagStatus(SPI5, SPI_I2S_FLAG_TXE) == RESET){retry++;if(retry > 250)   return 0;}            SPI_I2S_SendData(SPI5, TxData);      //发送数据到DR寄存器retry = 0;while (SPI_I2S_GetFlagStatus(SPI5, SPI_I2S_FLAG_RXNE) == RESET){retry++;if(retry > 250) return 0;}                             return SPI_I2S_ReceiveData(SPI5);    //从DR寄存器接收数据
}

写一个字节:

uint8_t MPU_Write_Byte(uint8_t reg,uint8_t data)
{uint8_t status;MPU_NSS_LOW;delay_200ns(1);status = SPI5_Read_Write_Byte(reg); SPI5_Read_Write_Byte(data);MPU_NSS_HIGH;delay_200ns(1);return status;
}

读一个字节:

/*mpu6500 SPI读取寄存器时候,需要在寄存器地址最高 置1*/
uint8_t MPU_Read_Byte(uint8_t reg)
{uint8_t reg_val;        //寄存器值MPU_NSS_LOW;            //片选拉低delay_200ns(1);         SPI5_Read_Write_Byte(reg|0x80);     //写入寄存器地址,地址最高位置1reg_val=SPI5_Read_Write_Byte(0xff);  //主机发送一个空字节获取寄存器值MPU_NSS_HIGH;     //片选拉高delay_200ns(1);return(reg_val);
}

这里读者也许会对reg|0x80有疑问,查询MPU6500产品说明书英文版第34页可知:

所以在SPI初始化时一定要配置为MSB先行,这是要求!

3、MPU6500初始化

初始化就是对寄存器写值!

uint8_t Mpu_Init(void)
{delay_ms(100);id                               = MPU_Read_Byte(MPU6500_WHO_AM_I);uint8_t i                        = 0;uint8_t MPU6500_Init_Data[10][2] = {{ MPU6500_PWR_MGMT_1, 0x80 },     /* Reset Device */ { MPU6500_PWR_MGMT_1, 0x03 },     /* Clock Source - Gyro-Z */ { MPU6500_PWR_MGMT_2, 0x00 },     /* Enable Acc & Gyro */ { MPU6500_CONFIG, 0x04 },         /* LPF 41Hz */ { MPU6500_GYRO_CONFIG, 0x18 },    /* +-2000dps */ { MPU6500_ACCEL_CONFIG, 0x10 },   /* +-8G */ { MPU6500_ACCEL_CONFIG_2, 0x02 }, /* enable LowPassFilter  Set Acc LPF */ { MPU6500_USER_CTRL, 0x20 },};    /* Enable AUX */ for (i = 0; i < 10; i++){MPU_Write_Byte(MPU6500_Init_Data[i][0], MPU6500_Init_Data[i][1]);delay_ms(1);}Ist8310_Init(); //这是磁力计的初始化,可以忽略,有空再改天讲return 0;
}

4、MPU6500数据获取

获取数据就是读取寄存器值!
当然这里的代码还有优化空间,就交给优秀的读者们吧!

void Get_MPU6500_Data(void)
{//加速度数据mpu_data.ax = Get_16Bit_Data(MPU6500_ACCEL_XOUT_H,MPU6500_ACCEL_XOUT_L);mpu_data.ay = Get_16Bit_Data(MPU6500_ACCEL_YOUT_H,MPU6500_ACCEL_YOUT_L);mpu_data.az = Get_16Bit_Data(MPU6500_ACCEL_ZOUT_H,MPU6500_ACCEL_ZOUT_L);/* 陀螺仪温度数据  2000dps -> °/s */mpu_data.gx = Get_16Bit_Data(MPU6500_GYRO_XOUT_H,MPU6500_GYRO_XOUT_L) / 16.384f;mpu_data.gy = Get_16Bit_Data(MPU6500_GYRO_YOUT_H,MPU6500_GYRO_YOUT_L) / 16.384f;mpu_data.gz = Get_16Bit_Data(MPU6500_GYRO_YOUT_H,MPU6500_GYRO_YOUT_L) / 16.384f;mpu_data.temp = Get_16Bit_Data(MPU6500_TEMP_OUT_H,MPU6500_TEMP_OUT_L)/333.87f +21;/*磁力计数据  转换成 uT*/mpu_data.mx = 0.3f*Get_16Bit_Data(MPU6500_EXT_SENS_DATA_00,MPU6500_EXT_SENS_DATA_01);mpu_data.my = 0.3f*Get_16Bit_Data(MPU6500_EXT_SENS_DATA_02,MPU6500_EXT_SENS_DATA_03);mpu_data.mz = 0.3f*Get_16Bit_Data(MPU6500_EXT_SENS_DATA_04,MPU6500_EXT_SENS_DATA_05);
}
//将两个字节数据处理成字
float Get_16Bit_Data(uint8_t addr_h, uint8_t addr_l)
{static uint8_t buf[2];static short data;buf[0] = MPU_Read_Byte(addr_l);buf[1] = MPU_Read_Byte(addr_h);data = (buf[1]<<8)|buf[0];return data;
}

运行程序,在仿真界面可查看到数据已成功读取

MPU6500原始数据读取相关推荐

  1. MPU9250配置及原始数据读取

    MPU9250配置及原始数据读取 1.  初始化: (1)对部分寄存器进行了解: #define SMPLRT_DIV                 0X19 //陀螺仪采样率典型值为0X07 10 ...

  2. ubuntu查看edid_ubuntu下的EDID原始数据读取和解析

    参考文档: http://manpages.ubuntu.com/manpages/wily/man1/get-edid.1.html 原文: Name Synopsis Description Au ...

  3. 使用QMI8658六轴原始数据融合输出欧拉角笔记

    关于四元素和三维旋转的知识,推荐看一下https://github.com/Krasjet/quaternion. qmi8658六轴姿态传感器的原始数据读取函数如下.需要注意的是,陀螺仪数据的格式. ...

  4. 【AI参赛经验】深度学习入门指南:从零开始TinyMind汉字书法识别——by:Link

    各位人工智能爱好者,大家好! 由TinyMind发起的#第一届汉字书法识别挑战赛#正在火热进行中,比赛才开始3周,已有数只黑马冲进榜单.目前TOP54全部为90分以上!可谓竞争激烈,高手如林.不是比赛 ...

  5. 特征工程(四)HashingVectorizer

    ''' 将原始数据的word特征数字化为hash特征,并将结果保存到本地article特征可做类似处理''' import pandas as pd from sklearn.feature_extr ...

  6. 智能车竞赛技术报告 | 节能信标组 - 太原工业学院 - 晋速-天槊星

    简 介: 本文结合了太原工业学院晋速天槊星队的队员们在准备第十六届智能车大赛中的研究成果.车模为自制车模,核心处理器采用TC264处理器,软件平台为ADS开发环境.本文主要介绍智能小车的机械结构,软硬 ...

  7. dev 点击子控件触发panelcontrol事件_LINUX IIO子系统分析之二 IIO子系统数据结构分析...

    上一章我们简要说明了IIO子系统的架构,本章我们通过数据结构的定义,分析IIO子系统的设计实现,本章的主要内容如下: 一.IIO子系统各数据结构说明 二.数据结构间的关联说明 一.IIO子系统各数据结 ...

  8. 如何清除aspx网页中的flash缓存

    使用以下的方法,使SWF文件强制不从浏览器读本地的缓存.或强制其SWF文件每次都去 读取最新的媒体文件 确保每次都读取最新的SWF文件. 1:使用"Expires"标头 这是在HT ...

  9. 利用函数wavread对语音信号进行采样_语音识别第4讲:语音特征参数MFCC

    一.MFCC概述[1] 在语音识别(SpeechRecognition)和话者识别(SpeakerRecognition)方面,最常用到的语音特征就是梅尔倒谱系数(Mel-scaleFrequency ...

  10. Flash 缓存问题的解决(转)

    Flash 缓存问题的解决 作者:wangwaizi 时间: 2003-12-27 文档类型:翻译 来自:蓝色理想 原文是Flash支持中心的两篇文章. 解决Flash缓存问题 | 解决载入变量缓存问 ...

最新文章

  1. Linux下多线程同步方式之互斥量,信号量,条件变量
  2. [转]蓝牙基带数据传输机理分析
  3. Lync Server 2010迁移至Lync Server 2013部署系列 Part3:部署后端备用服务器
  4. linux c用open打开(创建)一个文件
  5. 使用ObjectDataSource 显示数据
  6. linux的arp指令
  7. 虚拟机 ubuntu10.04 安装 Mercury MW150U 无线网卡(AR9271芯片组)
  8. 开源编译工具和编译软件
  9. CryoSat-2数据下载
  10. 一些python书=待买
  11. 注册csdn博客步骤
  12. 怎样任意裁剪图片?如何快速改变图片形状?
  13. uni-app开发的APP项目上线后,登录后自动检测更新,点击下载并安装,可手动检测版本更新,实现扫码下载功能
  14. oracle 帮助文件,oracle chm帮助文件下载
  15. 几款有意思的html游戏推荐(在线云玩+源码)
  16. 设计一个自我介绍简单页面
  17. 轻量级的layui框架后台模板
  18. 机器学习算法基础之使用python代码
  19. Android源码下载教程
  20. 历代iOS设备屏幕分辨率

热门文章

  1. 项目管理之项目风险应对
  2. 黑马程序员_面向对象简介
  3. 推荐25个值得收藏的前端开源Awesome项目
  4. could not get batchedbridge, make sure your bundle is packaged correctly
  5. UA MATH523A 实分析3 积分理论17 Fubini-Tonelli定理
  6. php元换成万元,万元单位换算器(元换算成万元换算器)
  7. 服务器位置异常饿了么,饿了么定位失败怎么办 饿了么无法定位解决办法
  8. python可视化数据分析交互作用_测试设计功能交互分析
  9. 2022谷粒商城学习笔记(二十五)支付宝沙箱模拟支付
  10. springboot 图片大小压缩