陀螺仪:
大家都知道,陀螺仪是一种能测量角速度的器件,是姿态解算、角度测量等任务中无法缺少的工具。
单轴的陀螺仪配合单轴的加速度计,就能结算出一个姿态角。在平衡车的应用中,一维的姿态角(倾斜角)就足够了。而在飞行器中,一般需要三个轴的陀螺仪和三个轴的加速度计,解算出三个姿态角。
经常可以见到模拟陀螺仪和数字陀螺仪,实际上这仅关乎器件输出是模拟量还是数字量。
输出模拟量的陀螺仪,如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)
通信时序:
- 主机发送开始信号
- 主机发送要寻址的从机地址(7位)
- 主机发送写或者读标志位 (1位)
- 从机响应(ACK)
- 开始数据的传输
- 主机发送结束信号
以MPU6050为例的通信时序:
写或者读寄存器:
- 主机(单片机)发送开始信号
- 主机发送要寻址的从机地址(7位0x68)
- 主机发送写和读标志位(1或者0)
- MPU6050响应
- 主机发送要写或者读的寄存器(如0x02)
- MPU6050响应
- MPU6050发送数据
- 主机不响应(NACK),发送停止信号
需要注意的是,有的单片机中,使用从机的地址是8位,实际上他是将2、3步合成一步,这种情况下,MPU6050的地址为0xD0(即0x68左移一位)