版权归如下公司,禁止非授权转载:
- 北京西普阳光教育科技股份有限公司(https://www.simpleware.com.cn)
- 维周机器人科技有限公司(http://www.vejoe.com)
文章目录
【实验目的】
- 掌握I2C协议的内容,了解I2C接口的特点。
- 了解陀螺仪MPU6050的用途及数据采集过程。
- 熟悉STM32F10xx系列微控制器的I2C配置,完成通过I2C读取陀螺仪MPU6050数据的实验。
【实验原理】
I2C (Inter-Integrated Circuit)协议是由Phiilps公司开发的,由于它具引脚少,硬件实现简单,可扩展性强,不需要如USART、CAN的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。
一、I2C总线协议:
I2C总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。
- 开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
- 结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
- 应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。
这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。
二、I2C接口特性
- STM32的中等容量和大容量型号的芯片均有多达2个的I2C总线接口。
- 能够工作于多主模式或从模式,分别为主接收器,主发送器,从接收器及从发。
- 支持标准模式100Kbit/s和快速模式400Kbit/s,不支持高速模式。
- 支持7位或10位寻址。
- 内置了硬件CRC发生器/校验器。
- I2C的接收和发送都可以使用DMA操作。
- 支持系统管理总线(SMBus)总线2.0版。
三、MPU6050相关
MPU-6050为9轴运动处理传感器。它集成了3轴陀螺仪,3轴加速度计,以及一个可扩展的数字运动处理器DMP(Digital Motion Processor),可用I2C接口连接一个第三方的数字传感器,比如磁力计。MPU-6050对陀螺仪和加速度计分别用了三个16位的ADC,将其测量的模拟量转化为可输出的数字量。MPU-6050上所有设备寄存器之间的通信采用400kHz的I2C接口。另外,片上还内嵌了一个温度传感器和在工作环境下仅有±1%变动的振荡器。
四、硬件连接和库函数介绍
图1 硬件连接示意图
本实验中使用的库函数主要有unsigned char I2C_ReadOneByte(unsigned char I2C_Addr,unsigned char addr),其功能为读取指定设备,指定寄存器的一个值,其参数分别为:
I2C_Addr:目标设备地址,在我们的实验中为陀螺仪和加速度计的地址。
Addr:寄存器地址,即存放陀螺仪信息和加速度计信息的寄存器地址
五、软件流程图
本实验项目需要包涵oled.c显示屏库函数、MPU6050.c运动传感器库函数、delay.c延时库函数,本实验的实验流程图如图2所示:
图2 实验流程示意图
【实验环境】
硬件设备
双轮自平衡机器人。如图3所示,平衡车所搭载的电路板上已经搭载MPU6050芯片。
ST-Link下载器(包含USB线与下载线)。如图4所示。
操作系统
Windows7/8/10,32bit/64bit
图3 双轮自平衡机器人
图4 ST-Link下载器与下载线
软件环境
Keil 5
实验场地:
无
【实验步骤】
第一步 配置工程环境
打开已经建立好的工程模板,在新建立的工程模板中已经添加五个文件夹,分别命名为USER、HARDWARE、SYSTEM、CORE、FWLib文件夹,如图5所示。其中USER文件夹存放的是主函数,HARDWARE文件夹存放的是本实验对应的硬件设备函数,SYSTEM存放的是本课程所有实验通用的函数,CORE文件夹存放的是启动文件,FWLib文件夹存放的是底层驱动函数。
图5工程模板对应的文件夹
在HARDWARE文件夹下右键导入已存在文件IOI2C.c和IOI2C.h文件,这两个文件保存在工程目录下MiniBalance_HARDWARE文件夹中IIC文件夹内,如图6所示。
图6 在HARDWARE文件夹下导入IOI2C.c和IOI2C.h文件
第二步 编写IIC实现函数
打开刚刚导入程序中的IOI2C.h文件,可以发现文件里已经预定义了许多函数。
/*----------------------------------IIC的操作函数---------------------------------*/
void IIC_Init(void); //初始化IIC的IO口 int IIC_Start(void); //发送IIC 开始信号
void IIC_Stop(void); //发送IIC停止信号
void IIC_Send_Byte(u8 txd); //IIC发送一个字节
u8 IIC_Read_Byte(unsigned char ack); //IIC读取一个字节
int IIC_Wait_Ack(void); //IIC等待ACK信号
void IIC_Ack(void); //IIC发送ACK信号
void IIC_NAck(void); //IIC不发送ACK信号
void IIC_Write_One_Byte