返回信息流# 陀螺仪、ENC03、MPU6050、I2C等知识科普
---
## 陀螺仪:
大家都知道,陀螺仪是一种能测量角速度的器件,是姿态解算、角度测量等任务中无法缺少的工具。
单轴的陀螺仪配合单轴的加速度计,就能结算出一个姿态角。在平衡车的应用中,一维的姿态角(倾斜角)就足够了。而在飞行器中,一般需要三个轴的陀螺仪和三个轴的加速度计,解算出三个姿态角。
经常可以见到模拟陀螺仪和数字陀螺仪,实际上这仅关乎器件输出是模拟量还是数字量。
输出模拟量的陀螺仪,如ENC03。输出数字量的陀螺仪,如MPU6050、MPU9250等等。
模拟陀螺仪使用简单,仅需要在单片机中进行AD采集即可。至于数字陀螺仪,因为输出为数字量,因此都需要相应的通信协议进行通信,如I2C、SPI等。
### ENC03
ENC03 是电磁平衡组官方教程中使用的单轴模拟陀螺仪,因为是官方教程中使用的,因此使用的人很多,造成了市面上价格不菲。
ENC03 仅仅是一个陀螺仪,因此在角度解算中,还需要另一个加速度计。在官方教程中,加速度计使用的是MMA7361,二者输出都是模拟量。由于购买的人很多,**大部分淘宝店家出售的都是集成了ENC03和MMA7361的模块。**
模拟陀螺仪输出的是电压,所以使用简单,单片机AD采集即可。官方使用的这两款,由于已经是多年前的产品,性能一般。当然,用在智能车比赛中还是足够的。
### MPU6050
MPU6050是一个比较常见的“陀螺仪”,实际上它不仅包含三轴陀螺仪,还包含了三轴加速度计。如果是MPU9250,甚至还包含了一个三轴的磁力计(电子罗盘)。MPU6050是一个典型的MEMS,将六轴的东西集成到了大概3mm×3mm×1.5mm的体积之中,因此在飞控中得到广泛应用。
因此,**在平衡车的应用中,角度解算仅需要一个MPU6050就足够了。**
MPU6050使用I2C进行通信。I2C使用两条线SCL、SDA进行通信,再加上供电的两条线,使用MPU6050仅需要电源、GND、SCL、SDA即可。
其他引脚
- XCL、XDA,一般是接其他I2C器件,如磁力计等,然后通过编程,可以让MPU6050帮你读取磁力计的数据,再一起读回单片机。
- IRQ,中断引脚,可以编程设定当数据准备好时,该引脚有电平变化,触发单片机的外部中断。
## I2C
I2C是NXP制定的一种串行通信协议,该协议仅使用两条信号线(SCL、SDA),即可达到最高400K的通信频率,且可支持多个器件(有兴趣的可以再去了解一下实现方式,为什么仅需两条线即可实现多器件通信,可与SPI协议进行对比)。
SCL是时钟线,SDA是数据线。当SCL为高电平时,对SDA的电平进行采样,高电平则为1,低则为0。
因为该协议通过SCL高电平时,数据线的变化来决定传输的终止或者开始,**因此数据必须在SCL为低电平的时候改变,在SCL高电平的时候,SDA必须保持稳定。**
开始信号:SCL为高电平,SDA从高->低
终止信号:SCL为高电平,SDA从低->高
### 软件(模拟)I2C、硬件I2C
这是两种单片机的I2C协议实现方式。
现在常见的单片机都有自己的I2C外设,因此可以直接使用单片机的I2C接口,此即**硬件I2C**。
同理,有的单片机没有I2C外设,如8051单片机,或者单片机I2C引脚用作他用,可以直接控制通过其他GPIO的高低变化的时序来模拟I2C。这是**软件I2C**
两种方式相比,软件I2C较方便移植,但速率较慢。硬件I2C配置较为麻烦,但速率较高,通过配置可以知道I2C通信的确切速率。
### 几个概念
#### 主机:通信发起的一方,一般是单片机
#### 从机:被主机寻址的一方,如MPU6050
#### 从机地址:不同从机的标识符,从机仅会对自己的地址的寻址做出响应(ACK)
#### 通信时序:
1. 主机发送开始信号
2. 主机发送要寻址的从机地址(7位)
3. 主机发送写或者读标志位 (1位)
4. 从机响应(ACK)
5. 开始数据的传输
6. 主机发送结束信号
#### 以MPU6050为例的通信时序:
写或者读寄存器:
1. 主机(单片机)发送开始信号
2. 主机发送要寻址的从机地址(7位0x68)
3. 主机发送写和读标志位(1或者0)
4. MPU6050响应
5. 主机发送要写或者读的寄存器(如0x02)
6. MPU6050响应
7. MPU6050发送数据
8. 主机不响应(NACK),发送停止信号
**需要注意的是,有的单片机中,使用从机的地址是8位,实际上他是将2、3步合成一步,这种情况下,MPU6050的地址为0xD0(即0x68左移一位)**
补充:
关于MPU6050的驱动,可参考:
https://github.com/Ncerzzk/drivers_mcu/blob/master/mpu9250.c
该驱动用的是MPU9250(但实际上MPU6050与MPU9250其从机地址是一样的,仅有dev_ID不同)
这是一条镜像帖。来源:北邮人论坛 / smartcar / #299同步于 2018/3/7
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Smartcar机器人发帖
陀螺仪、ENC03、MPU6050、I2C等知识科普
Ncer
2018/3/7镜像同步1 回复
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复