一年前写的博客,没有把驱动代码分享出来是我疏忽了,可以到网盘下载驱动代码
链接:https://pan.baidu.com/s/1SDVQfyoOoycCY_6eSXamlQ 密码:ipj7
之后运用MPU6050做了一个平衡小车,可以通过蓝牙控制,下载链接:
diy平衡小车
一、MPU6050
1. MPU6050介绍
MPU6050 是 InvenSense 公司推出的全球首款整合性 6 轴运动处理组件,相较于多组件
方案,免除了组合陀螺仪与加速器时之轴间差的问题,减少了安装空间。
MPU6050 内部整合了 3 轴陀螺仪和 3 轴加速度传感器,并且含有一个第二 IIC 接口,
可用于连接外部磁力传感器,并利用自带的数字运动处理器( DMP: Digital Motion Processor)
硬件加速引擎,通过主 IIC 接口,向应用端输出完整的 9 轴融合演算数据。有了 DMP,我
们可以使用 InvenSense 公司提供的运动处理资料库,非常方便的实现姿态解算,降低了运
动处理运算对操作系统的负荷,同时大大降低了开发难度。
2. MPU6050特点
MPU6050 的特点包括:
① 以数字形式输出 6 轴或 9 轴(需外接磁传感器)的旋转矩阵、四元数(quaternion)、
欧拉角格式(Euler Angle forma)的融合演算数据(需 DMP 支持)
② 具有 131 LSBs/° /sec 敏感度与全格感测范围为±250、±500、±1000 与±2000°
/sec 的 3 轴角速度感测器(陀螺仪)
③ 集成可程序控制,范围为±2g、±4g、±8g 和±16g 的 3 轴加速度传感器
④ 移除加速器与陀螺仪轴间敏感度,降低设定给予的影响与感测器的飘移
⑤ 自带数字运动处理(DMP: Digital Motion Processing)引擎可减少 MCU 复杂的融合演
算数据、感测器同步化、姿势感应等的负荷
⑥ 内建运作时间偏差与磁力感测器校正演算技术,免除了客户须另外进行校正的需求
⑦ 自带一个数字温度传感器
⑧ 带数字输入同步引脚(Sync pin)支持视频电子影相稳定技术与 GPS
⑨ 可程序控制的中断(interrupt),支持姿势识别、摇摄、画面放大缩小、滚动、快速
下降中断、 high-G 中断、零动作感应、触击感应、摇动感应功能
⑩ VDD 供电电压为 2.5V±5%、 3.0V±5%、 3.3V±5%; VLOGIC 可低至 1.8V± 5%
⑪ 陀螺仪工作电流: 5mA,陀螺仪待机电流: 5uA;加速器工作电流: 500uA,加速
器省电模式电流: 40uA@10Hz
⑫ 自带 1024 字节 FIFO,有助于降低系统功耗
⑬ 高达 400Khz 的 IIC 通信接口
⑭ 超小封装尺寸: 4x4x0.9mm( QFN)
3.MPU6050原理图
3.1 MPU6050引脚图
3.2 MPU6050 的内部框图
SCL 和 SDA 是连接 MCU 的 IIC 接口, MCU 通过这个 IIC 接口来控制 MPU6050,
另外还有一个 IIC 接口: AUX_CL 和 AUX_DA,这个接口可用来连接外部从设备,比如磁
传感器,这样就可以组成一个九轴传感器。
VLOGIC 是 IO 口电压,该引脚最低可以到 1.8V,
我们一般直接接 VDD 即可。
AD0 是从 IIC 接口(接 MCU)的地址控制引脚,该引脚控制
IIC 地址的最低位。如果接 GND,则 MPU6050 的 IIC 地址是: 0X68,如果接 VDD,则是
0X69,注意:这里的地址是不包含数据传输的最低位的(最低位用来表示读写)!!
3.3 MPU6050 传感器的检测轴及方向
二、I2C
1. I2C简介
IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接
微控制器及其外围设备。它是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据。
在 CPU 与被控 IC 之间、 IC 与 IC 之间进行双向传送, 高速 IIC 总线一般可达 400kbps 以上。
I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答
信号。
开始信号: SCL 为高电平时, SDA 由高电平向低电平跳变,开始传送数据。
结束信号: SCL 为高电平时, SDA 由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,
表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,判断为受控单元出现故障。
这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要.
重要理解:只有当SCL为高时,IIC电路才会对SDA线上的电平采样,当SCL为低时,SDA线可以任意0、1变化
2.I2C驱动
2.1 开始信号
SCL为高,SDA由高—->低,IIC通信的开始信号。
void IIC_Strart(void)
{
SDA_OUT();
IIC_SDA=1;
IIC_SCL=1;
delay_us(2);
IIC_SDA=0;
delay_us(2);
IIC_SCL=0;
}
最后拉低SCL目的是为了钳住总线,防止IIC对SDA线进行采样,SDA可以0、1变化传送数据
2.2 结束信号
SCL为高,SDA由低—->高,IIC通信的结束信号。
void IIC_Stop(void)
{
SDA_OUT();
IIC_SCL=0;
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
IIC_SDA=1;
delay_us(2);
}
先将SCL拉低目的是允许SDA进行变化,把SDA拉低(为拉高做准备)
2.3 应答信号
接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,
表示已收到数据。。若未收到应答信号,判断为受控单元出现故障。
//产生ACK应答信号
void IIC_Ack(