MPU9250对初始数据的读取

1.mpu9250介绍
MPU 9250是一款9轴运动跟踪装置, 他在小小的3X3X 1mm的封装中融合了 3轴加速度、3轴陀螺仪、3轴磁力计以及数字运动处理器(DMP) 并且兼容MPU 6515。其完美的I2C方案,可直接输出9轴的全部数据。因此它也是四轴姿态解算的基础, 所以正确获取MPU 9250 的原始数据显得尤为重要。
注意:
1.但是磁力计在小四轴中不用也行,在小四轴中由于四轴较小,电机的转动产生的磁场会干扰,数据融合后效果反而不好,需要教好的算法,
2.数字运动处理器(DMP),可以通过加速度和陀螺仪直接计算出四轴的姿态,但是一般不用,学习四轴还是重在学习,之后我们通过加速度和陀螺仪自己计算出四轴的姿态
2.单片机与mpu9250的通讯
1.我们用IO口模拟IIC和MPU9250进行通讯(模拟IIC通信可以看代码文件夹里有)


2.I2C 是一个双线通信方案,它有 SDA 和 SCL 两根线分别传输数据和时钟信号。通常这 2 个 接口是双向的开漏极接口。在连接设备的时候可以做主机或者从机。从机在通讯时,通过 地址即可匹配。 MPU-9250 通常和控制芯片连接时作为从机,SDA 和 SCL 通常需要上拉电阻到 VDD,最快 通信速度达到 400KHz。 MPU-9250 作为从机时的地址为 7 位 110100X(B)。这个地址的 LSB 位由 AD0 引脚的电平 确定,这样就使得一个系统中可以同时连接 2 个 MPU-9250 了。(AD0 为低电平时 X 为 0, 高电平 X 则为 1)。

此时mpu9250的地址为1101001D即为0x69H,这一点在代码(分块代码MPU9250)中可以看到
为什么这么连可以参考mpu9250的应用手册,里面有解释还有例子
就是ncn接高电平是为什么,ncn与iic中通信无关,和spi通信有关CS线为片选,为低时选中,为高时不选。因为代码中没用用到spi通信所以就置高了
3.通信的函数

/*****************************************************************************
*函  数:uint8_t MPU9250_WriteByte(uint8_t addr,uint8_t reg,uint8_t data)
*功  能:写一个字节数据到 MPU9250 寄存器
*参  数:reg: 寄存器地址data: 要写入的数据
*返回值:0成功 1失败
*备  注:MPU9250代码移植只需把I2C驱动修改成自己的即可
*****************************************************************************/
uint8_t MPU9250_WriteByte(uint8_t reg,uint8_t data)
{if(IIC_WriteByteToSlave(MPU9250Addr,reg,data))return 1;elsereturn 0;
}

```c
/*****************************************************************************
*函  数:uint8_t MPU9250_ReadByte(uint8_t reg,uint8_t *buf)
*功  能:从指定MPU9250寄存器读取一个字节数据
*参  数:reg: 寄存器地址buf:  读取数据存放的地址
*返回值:1失败 0成功
*备  注:MPU9250代码移植只需把I2C驱动修改成自己的即可
*****************************************************************************/
uint8_t MPU9250_ReadByte(uint8_t reg,uint8_t *buf)
{if(IIC_ReadByteFromSlave(MPU9250Addr,reg,buf))return 1;elsereturn 0;
}
/*****************************************************************************
*函  数:uint8_t MPU9250_WriteMultBytes(uint8_t reg,uint8_t len,uint8_t *buf)
*功  能:从指定寄存器写入指定长度数据
*参  数:reg:寄存器地址len:写入数据长度 buf: 写入数据存放的地址
*返回值:0成功 1失败
*备  注:MPU9250代码移植只需把I2C驱动修改成自己的即可
*****************************************************************************/
uint8_t MPU9250_WriteMultBytes(uint8_t reg,uint8_t len,uint8_t *buf)
{if(IIC_WriteMultByteToSlave(MPU9250Addr,reg,len,buf))return 1;elsereturn 0;
}
/*****************************************************************************
*函  数:uint8_t MPU9250_ReadMultBytes(uint8_t reg,uint8_t len,uint8_t *buf)
*功  能:从指定寄存器读取指定长度数据
*参  数:reg:寄存器地址len:读取数据长度 buf: 读取数据存放的地址
*返回值:0成功 0失败
*备  注:MPU9250代码移植只需把I2C驱动修改成自己的即可
*****************************************************************************/
uint8_t MPU9250_ReadMultBytes(uint8_t reg,uint8_t len,uint8_t *buf)
{if(IIC_ReadMultByteFromSlave(MPU9250Addr,reg,len,buf))return 1;elsereturn 0;
}

对于通信函数的几点声明:
在mpu9250中有这样一段话,ACK 响应后,数据可以继续输入,除非没有产生停止位。芯片内部自带的递增 寄存器可以自动将数据写入相应寄存。所以如果要连读或者连写mpu9250中的数据在一次读取之后就不用寄存器地址+1.这个过程是自动的,这点和AT24C02是不一样的
3.mpu9250的初始配置

void MPU9250_Init(void)
{MPU9250_Check(); //检查MPU9250是否连接MPU9250_WriteByte(MPU9250_RA_PWR_MGMT_1, 0x80); //复位MPU9250delay_ms(100);MPU9250_WriteByte(MPU9250_RA_PWR_MGMT_1, 0x01); //唤醒MPU9250,并选择陀螺仪x轴PLL为时钟源MPU9250_WriteByte(MPU9250_RA_INT_ENABLE, 0x00); //禁止中断MPU9250_WriteByte(MPU9250_RA_ACCEL_CONFIG_2,0x03); //MPU9250_WriteByte(MPU9250_RA_SMPLRT_DIV, 0x00); //采样分频  (采样频率 = 陀螺仪输出频率 / (1+DIV),采样频率1000hz)MPU9250_WriteByte(MPU9250_RA_INT_PIN_CFG, 0x02);//MPU 可直接访问MPU9250辅助I2CMPU9250_WriteByte(MPU9250_RA_CONFIG, MPU9250_DLPF_BW_20);//设置陀螺的输出为1kHZ,DLPF=20Hz  MPU9250_WriteByte(MPU9250_RA_GYRO_CONFIG, 0x18); //陀螺仪满量程+-2000度/秒     (最低分辨率 = 2^15/2000 = 16.4LSB/度/秒 MPU9250_WriteByte(MPU9250_RA_ACCEL_CONFIG, 0x08); //加速度满量程+-4g            (最低分辨率 = 2^15/4g = 8196LSB/g )
}

对配置的说明:
1.首先这段配置来源于小马哥的四轴
2.总的来说配置的步骤就是
MPU 9250的初始化流程:
1检查MCU与MPU 9250是否通信成功。
2设置MPU 9250为复位状态+100ms复位延时
3唤醒MPU 9250, 选择PLL为时钟源
4配置六轴数据(3轴加速度+3轴陀螺仪)全输出
(复位后默认全输出就不用配置了)
5禁止所有中断
6设置MPU 9250内部采样频率
7设置陀螺仪和加速度的满量程范围
8设置陀螺仪和加速度输出低通滤波

3.配置的具体方法就是查阅Mpu9250d的寄存器手册,文件里有中文版的,通过IIC通信修改对应的寄存器,在mpu9250.h中已经用宏定义的方法将mpu9250每个地址都表示出来了
4具体的配置原理看我在文件里的获取mpu9250 Pdf ,里面都有讲到我就讲一下不好懂得地方和需要注意的
5.采样频率的设置最好为姿态结算的两倍

4.mpu9250加速度,角速度,温度的读取
/******************************************************************************

*函  数:void MPU9250_AccRead(int16_t *accData)
*功  能:读取加速度的原始数据
*参  数:*accData 原始数据的指针
*返回值:无
*备  注:无
*******************************************************************************/
void MPU9250_AccRead(int16_t *accData)
{uint8_t buf[6];MPU9250_ReadMultBytes(MPU9250_RA_ACCEL_XOUT_H,6,buf);accData[0] = (int16_t)((buf[0] << 8) | buf[1]);accData[1] = (int16_t)((buf[2] << 8) | buf[3]);accData[2] = (int16_t)((buf[4] << 8) | buf[5]);
}
/******************************************************************************
*函  数:void MPU9250_GyroRead(int16_t *gyroData)
*功  能:读取陀螺仪的原始数据
*参  数:*gyroData 原始数据的指针
*返回值:无
*备  注:无
*******************************************************************************/
void MPU9250_GyroRead(int16_t *gyroData)
{uint8_t buf[6];MPU9250_ReadMultBytes(MPU9250_RA_GYRO_XOUT_H, 6, buf);gyroData[0] = (int16_t)((buf[0] << 8) | buf[1]) ;gyroData[1] = (int16_t)((buf[2] << 8) | buf[3]) ;gyroData[2] = (int16_t)((buf[4] << 8) | buf[5]) ;
}
/******************************************************************************
*函  数:void MPU9250_TempRead(float *tempdata)
*功  能:温度值读取
*参  数:*tempdata 温度数据的指针
*返回值:无
*备  注:无
*******************************************************************************/
void MPU9250_TempRead(float *tempdata)
{uint8_t buf[2];short data;MPU9250_ReadMultBytes(MPU9250_RA_TEMP_OUT_H, 2, buf);data = (int16_t)((buf[0] << 8) | buf[1]) ;*tempdata =21.00f + ((float)data/333.87f);
}

*******************************************************************************/
说明:前三个是分别读加速度温度角速度的寄存器,然后存到数组里,注意Mpu9250都是8位的,所以用两个8位寄存器表示16位的加速度温度角速度

*******************************************************************************/void MPU9250_Read(void)
{MPU9250_ReadMultBytes(MPU9250_RA_ACCEL_XOUT_H, 14, MPU9250_buff);// 查询法读取MPU9250的原始数据
}
*******************************************************************************/

说明:这个函数是直接把加速度,温度,角速度都放在MPU9250_buff中,一开始定义了
static uint8_t MPU9250_buff[14]; //加速度 陀螺仪 温度 原始数据

具体代码看Mpu9250(1)
作用就是读出MOPU9250的原始AD值

MPU9250对初始数据的读取相关推荐

  1. RStudio启动后修改文件(数据)读取默认目录

    RStudio启动后修改文件(数据)读取默认目录 # 初始的路径是C盘下的用户目录: # 将路径修改到我们需要加载的数据所在的路径下: # 参考:Rstudio

  2. asyncdata 获取参数_载入页面初始数据(asyncData)《 Nuxt.js:异步数据 》

    载入页面组件之前,会调用 asyncData 这个方法,你可以在这个方法里请求页面的初始数据.比如在 posts/index.vue 这个组件里面 .. 先添加一组 script .. 在默认导出的东 ...

  3. java读取欧姆龙plc_欧姆龙CJ2M系列PLC与PLC之间的数据相互读取设定

    分享一下欧姆龙CJ2M系列的plc与PLC之间的数据相互读取设定,因为CJ2M系列PLC自带EIP协议,所以硬件连接只需要将多个PLC通过网线用交换机连起来,并将所有的PLC的IP地址设置在同一个网段 ...

  4. 随机从mysql中读取_如何实现MySQL表数据随机读取?从mysql表中读取随机数据

    文章转自 http://blog.efbase.org/2006/10/16/244/ 如何实现MySQL表数据随机读取?从mysql表中读取随机数据?以前在群里讨论过这个问题,比较的有意思.mysq ...

  5. python读取txt数据-python读取文本文件数据

    本文要点刚要: (一)读文本文件格式的数据函数:read_csv,read_table 1.读不同分隔符的文本文件,用参数sep 2.读无字段名(表头)的文本文件 ,用参数names 3.为文本文件制 ...

  6. 【python图像处理】txt文件数据的读取与写入

    在使用python进行数据和图像处理的过程中,经常会遇到从txt文件中读取数据.已经将处理过程中的矩阵数据写入到txt文件的情形,如在伪彩映射中读取颜色映射表. 下面介绍几种我平时常用的txt文件数据 ...

  7. python读取html文件中的表格数据_Python 读取各类文件格式的文本信息 | doc,excel,html,mht...

    原标题:Python 读取各类文件格式的文本信息 | doc,excel,html,mht 众所周知,python最强大的地方在于,python社区汇总拥有丰富的第三方库,开源的特性,使得有越来越多的 ...

  8. python读取表格数据_Python读取Excel数据并根据列名取值

    一直想将自己接触到的东西梳理一遍,可就是迈不出第一步,希望从这篇总结开始不要再做行动的矮人了. 最近测试过程中需要用到python读取excel用例数据,于是去了解和学习了下xlrd库,这里只记录使用 ...

  9. Android 蓝牙4.0(BLE)开发实现对蓝牙的写入数据和读取数据

    由于最近学校组织了一个移动APP(安卓)设计大赛,自己也学习安卓有一段时间了,就跟同学商量一起去参加试试,一拍即合,然后我们就开始想idea,因为最近可穿戴设备比较火,我们也就想试试.经过商量,我负责 ...

最新文章

  1. 【经验】对一个合格C++高级工程师(音视频方向)的要求
  2. python 绘制折线图-怎样用python绘制折线图
  3. iOS 代理设计模式
  4. string包含某个字符串_Tcl字符串操作基础2
  5. Hadoop应用实战100讲(二)-Hadoop常用命令汇总
  6. thinkphp图片加载_标题栏ico展示
  7. 计算机网络中的语法 语义 时序的概念,网络iso协议及语义语法时序详解
  8. c java python go 哪种编程语言接近编程的本质_一图看懂编程语言迁移模式:终点站是Python、Go、JS...
  9. Go实现 爬虫v0.1
  10. [ASP.net]URL重写续篇
  11. 实战 Nginx 与 PHP(FastCGI)的安装、配置与优化
  12. STM32F4 OLED详解
  13. 2021各厂免费云服务器申请攻略(阿里云/腾讯云/华为云)
  14. Alien Skin Exposure X5 Bundle Mac(PS/LR照片胶片滤镜插件)
  15. Codefrces 869C. The Intriguing Obsession
  16. OSPF prefix-suppression Test
  17. 软件架构师的能力与特
  18. 机器学习中的数学——距离定义(九):测地距离(Geodesic Distance)
  19. uniapp - 微信小程序端引入 Echarts 图表及使用详细教程,简单快速的解决方案(拒绝复杂的过程,附带详细的使用示例保姆级教程)
  20. 以太网(802.3)帧结构 (转)

热门文章

  1. html+css+js制作美团界面
  2. PC电脑装机知识分享
  3. 关于Oralce OAM/OIM及与P6/Unifier 集成SSO的想法
  4. 从“地球漫游计划”看城市,如何利用视频监控让城市直播更简单?
  5. 【转载】21世纪中国计算神经科学展望
  6. 常见六大Web安全攻防解析
  7. HTML5 直播协议之 WebSocket 和 MSE
  8. 一个注解解决ShardingJdbc不支持复杂SQL
  9. 计算相似度评价值体系:欧几里德距离和皮尔逊相关度
  10. coffeeScript demo