STM32 IO口模拟I2C+驱动MPU6050

一年前写的博客,没有把驱动代码分享出来是我疏忽了,可以到网盘下载驱动代码
链接: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.55%、 3.05%、 3.35%; VLOGIC 可低至 1.85%
⑪ 陀螺仪工作电流: 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(
  • 35
    点赞
  • 143
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值