资讯详情

嵌入式课程 之 陀螺仪传感器实验

版权属于以下公司,禁止非授权转载:

  • 北京西普阳光教育科技有限公司(https://www.simpleware.com.cn)
  • 维周机器人科技有限公司(http://www.vejoe.com)

文章目录

    • 实验目的
    • 【实验原理】
      • 一、陀螺仪简介
      • 二、MPU6050简介
    • 【实验环境】
      • 硬件设备:
      • 软件环境:
    • 【实验步骤】
      • 第一步 工程环境的配置
      • 第二步 陀螺仪寄存器读取函数和初始函数
      • 第三步 编写main.c文件
      • 第四步 编译下载,观察实验现象
    • 【思考题】
      • 1、选择题
      • 2、简答题


【实验目的】

熟悉陀螺仪的工作原理,了解不同类型陀螺仪的差异; 熟悉MPU6050输出形式,熟悉MPU6050通信方式; 掌握STM32F10xx陀螺仪在系列微控制器上的接口配置和数据采集过程;

【实验原理】

一、陀螺仪简介

陀螺仪(gyroscope)它是一种角运动检测装置,传统陀螺仪是一种或两个角运动装置,通过检测高速旋转体的动量矩敏感壳体的相对惯性空间。一般来说,旋转物体的旋转轴所指的方向不受外力影响。人们根据这个道理,用它来保持方向。然后读取轴指示的方向,并自动将数据信号传输到控制系统。由其他原理制成的角运动检测装置也称陀螺仪。

传统陀螺仪是机械陀螺仪,但机械陀螺仪制造工艺要求高,精度低,体积大。因此,人们开始寻找更好的方法,利用物理进步,开发激光陀螺仪、光纤陀螺仪和微机电陀螺仪(MEMS)。虽然这些东西也叫陀螺仪,但它们的原理与传统的机械陀螺仪完全不同。目前,传统的机械陀螺仪正在被淘汰。激光陀螺仪用于高精度需求,微机电陀螺仪用于普及。

二、MPU6050简介

本实验采用MPU6050运动传感器是集成3轴的集成6轴运动传感器MEMS陀螺仪,3轴MEMS加速度计和可扩展的数字运动处理器DMP(Digital Motion Processor)。MPU6050传输最高可达400kHz的IIC也可以通过通信I2C接口连接其他非惯性的数字传感器。IIC通信协议要求每个装载在总线上的设备都有一个独特的7位设备地址来区分信号传输对象。MPU6050设备地址的前六已由厂家决定(1101000B),而MPU6050提供一个AD如果0引脚用于确定第7位电平,AD0接地,设备地址为0x68H(1101000B),再加上第八个读写方向,构成了IIC传输设备地址0xD0(11010000B)。

硬件连接图和库函数介绍 在这里插入图片描述 图1.1 硬件连接示意图 本实验中使用的库函数包括IICwriteBits函数的参数含义如下:

  1. dev,这里是设备地址MPU6050设备地址(mpu6050.h给出宏定义);
  2. reg,这里指的是目标寄存器地址PWR电池管理寄存器地址0x6B;
  3. bitStart,由于配置时钟源的标志位为寄存器上的[2:0]位,因此寄存器上的功能标志位起始地址为2;
  4. length,由于配置时钟源的标志位为寄存器上的[2:0]位,长度为3,因此这里的值为3;
  5. data,存储在寄存器标志位的值由函数入口的时钟源参数给出。

I2C_ReadOneByte函数的参数含义如下:

  1. I2C_Addr ,这里是目标设备地址MPU6050设备地址(mpu6050.h给出宏定义);
  2. addr,寄存器地址 四、软件流程图 由于MPU6050通过IIC通信,所以可以通过IIC访问数据寄存器对应的地址,获取陀螺仪加速度计信息。各功能寄存器的寄存器地址已经存在mpu6050.h程序中预先给出的库函数包括:oled.c显示屏库函数,delay.c延迟库函数,IOI2C模拟IIC库函数等,程序流程简要说明图如图1所示.2所示:

图1.2 程序流程示意图

【实验环境】

硬件设备:

双轮自平衡机器人。.3.在平衡车的电路板上集成MPU6050模块。 ST-Link下载器(包括USB线路和下载线.4所示。 操作系统: Windows7/8/10,32bit/64bit

图1.3 双轮自平衡机器人 图1.4 ST-Link下载器和下载线

软件环境:

Keil 5

【实验步骤】

第一步 工程环境的配置

打开已建立的工程模板,在新建的工程模板中加入五个文件夹,分别命名为USER、HARDWARE、SYSTEM、CORE、FWLib如图1所示,文件夹.5所示。其中USER主函数存储在文件夹中,HARDWARE本实验对应的硬件设备函数存储在文件夹中,SYSTEM存储本课程所有实验通用函数,CORE启动文件存储在文件夹中,FWLib底层驱动函数存储在文件夹中。 图1.5 工程模板对应的文件夹 在HARDWARE文件夹下新建的文件命名为mpu6050.c,并在工程目录下加载准备好的并加载HARDWARE文件夹里的MPU6050文件夹内的MPU6050.h文件,文件存储MPU相应数据位的宏定义已经定义了6050寄存器地址。mpu6050.c则存放MPU6050的配置文件,如图1.6所示。 图1.6 在HARDWARE建立文件夹mpu6050.c与mpu6050.h文件

第二步 陀螺仪寄存器读取函数和初始函数

在程序中打开mpu6050.c文件,先将mpu6050.h和IOI2C.h文件包含在内。其次,编写。MPU时钟源配置函数6050MPU6050_setClockSource。

#include "MPU6050.h" #include "IOI2C.h"  /**************************************************************** 函数功能:设置MPU6050的时钟源 入口参数:时钟源参数: 返回值:无 ****************************************************************/ void MPU6050_setClockSource(uint8_t source) { 
         IICwriteBits(devAddr, MPU6050_RA_PWR_MGMT_1,  MPU6050_PWR1_CLKSEL_BIT, MPU6050_PWR1_CLKSEL_LENGTH
       
        , source
        )
        ; 
        } 
       

同理,编写陀螺仪加速度计量程设置函数、睡眠唤醒函数、主从机设置函数

/**************************************************************** 函数功能:设置MPU6050的陀螺仪最大量程 入口参数:陀螺仪最大量程参数 返回值:无 ****************************************************************/
void MPU6050_setFullScaleGyroRange(uint8_t range) 
{ 
        
IICwriteBits(devAddr, MPU6050_RA_GYRO_CONFIG, 	MPU6050_GCONFIG_FS_SEL_BIT,MPU6050_GCONFIG_FS_SEL_LENGTH, range);
}
/**************************************************************** 函数功能:设置MPU6050的加速度计最大量程 入口参数:加速度计最大量程参数 返回值:无 ****************************************************************/
void MPU6050_setFullScaleAccelRange(uint8_t range) 
{ 
        
IICwriteBits(devAddr, MPU6050_RA_ACCEL_CONFIG, 	MPU6050_ACONFIG_AFS_SEL_BIT,MPU6050_ACONFIG_AFS_SEL_LENGTH, range);
}
/**************************************************************** 函数功能:设置MPU6050是否进入睡眠模式 入口参数:0否 1是 返回值:无 ****************************************************************/
void MPU6050_setSleepEnabled(uint8_t enabled) 
{ 
        
IICwriteBit(devAddr, MPU6050_RA_PWR_MGMT_1, 										MPU6050_PWR1_SLEEP_BIT, enabled);
}
/**************************************************************** 函数功能:设置MPU6050是否为主机模式 入口参数:0否 1是 返回值:无 ****************************************************************/
void MPU6050_setI2CMasterModeEnabled(uint8_t enabled) 
{ 
        
IICwriteBit(devAddr, MPU6050_RA_USER_CTRL, 									MPU6050_USERCTRL_I2C_MST_EN_BIT, enabled);
}
/**************************************************************** 函数功能:设置MPU6050是否允许IIC通信 入口参数:0否 1是 返回值:无 ****************************************************************/
void MPU6050_setI2CBypassEnabled(uint8_t enabled) 
{ 
        
IICwriteBit(devAddr, MPU6050_RA_INT_PIN_CFG, 										MPU6050_INTCFG_I2C_BYPASS_EN_BIT, enabled);
}

编写MPU6050初始化函数,在初始化函数中调用以上定义的函数完成初始化。

/************************************************************* 函数功能:初始化MPU6050以进入可用状态 入口参数:无 返回值:无 ************************************************************/
void MPU6050_initialize(void) 
{ 
        
	//设置时钟
	MPU6050_setClockSource(MPU6050_CLOCK_PLL_YGYRO);
	//陀螺仪最大量程+-1000度每秒
	MPU6050_setFullScaleGyroRange(MPU6050_GYRO_FS_2000);
	//加速度计最大量程+-2G
	MPU6050_setFullScaleAccelRange(MPU6050_ACCEL_FS_2);	
	//进入工作状态
	MPU6050_setSleepEnabled(0);
	//不让MPU6050控制AUX IIC
	MPU6050_setI2CMasterModeEnabled(0);
	//主控制器的IIC与MPU6050的AUX IIC 直通
	MPU6050_setI2CBypassEnabled(0);
}

打开encoder.h,设置MPU6050设备地址宏定义。

#ifndef __MPU6050_H
#define __MPU6050_H

#include "sys.h"
#define devAddr 0xD0
……

第三步 编写main.c文件

将工程编译需要用到的头文件包含进来,并预定义显示函数和全局变量。

#include "mpu6050.h" //包含mpu6050函数头文件
#include "sys.h" //包含系统头文件
#include "stm32f10x.h" //包含系统寄存器定义声明的头文件

void oled_show(void);
int Gyro_X,Gyro_Z;  // X、Z轴的陀螺仪变量

在主函数中调用延时函数、显示函数、IIC函数和MPU6050的初始化函数。

int main(void)
{ 
         
delay_init();	    //延时函数初始化
delay_ms(500);
	OLED_Init();     //OLED初始化
		IIC_Init ();            //IIC初始化
	MPU6050_initialize ();            //MPU6050初始化
//在主循环中调用超声波读取函数和显示函数
	while(1)
	{ 
        
Gyro_X=(I2C_ReadOneByte(devAddr,MPU6050_RA_GYRO_XOUT_H)<<8)+I2C_ReadOneByte(devAddr,MPU6050_RA_GYRO_XOUT_L);   //读取X轴陀螺仪数据
Gyro_Z=(I2C_ReadOneByte(devAddr,MPU6050_RA_GYRO_ZOUT_H)<<8)+I2C_ReadOneByte(devAddr,MPU6050_RA_GYRO_ZOUT_L);   //读取Z轴陀螺仪数据
	
		if(Gyro_X>32768)  Gyro_X-=65536;      //数据类型转换
		if(Gyro_Z>32768)  Gyro_Z-=65536;       //数据类型转换
		oled_show();          //显示屏打开
		delay_ms(50); 
	}

编写OLED显示函数

void oled_show(void)
{ 
        
//显示右侧编码器返回值
	OLED_ShowString(0,10," Gyro_X ");
	if(Gyro_X >=0)OLED_ShowString(20,20," "),
		OLED_ShowNumber(45,20, Gyro_X,4,12);	
	else OLED_ShowString(20,20,"-"),
		OLED_ShowNumber(45,20,4- Gyro_X,4,12);
//显示左侧编码器返回值
	OLED_ShowString(0,40," Gyro_Z ");
	if(Gyro_Z >=0)OLED_ShowString(10,50," "),
		OLED_ShowNumber(45,50, Gyro_Z,4,12);
	else OLED_ShowString(10,50,"-"),
		OLED_ShowNumber(45,50,- Gyro_Z,4,12); 
	//=============刷新======================//
	OLED_Refresh_Gram();	
}

第四步 编译并下载,观察实验现象

本实验采用仿真器为STLink V2,将仿真器与小车相连,注意正负极不要接反,如图1.7所示。 图1.7 仿真器与下载线连接图 编译程序:点击如图1.8所示的编译按键。 图1.8Keil编译环境下的编译按键 当编译完成后,如果没有问题,Build Output栏会出现无错误、无警告的提示,如图1.9所示。 图1.9 编译通过后Build Output栏提示信息 下载程序:点击如图所示的下载按键,程序就会下载到STM32的芯片中。下载按键如图1.10所示。 图1.10 Keil编译环境下的下载按键 观察实验现象,OLED显示屏上显示出当前陀螺仪的读数,用手轻轻晃动车身,观察数值的变化。 图1.11 平衡车上的陀螺仪测量数据

【思考题】

1、选择题

题目1:若AD0引脚接高电平,MPU6050的7位设备地址是(B) A:0x68 B:0x69 C:0xD0 D:0xD1 题目2:同一条IIC总线上最多挂在几个MPU6050设备(B) A:1 B:2 C:127 D:128

2、简答题

题目1:简要阐述机械陀螺仪的工作原理。

一个旋转物体的旋转轴所指的方向在不受外力影响时,是不会改变的。人们根据这个道理,用它来保持方向,制造出来的东西就叫做陀螺仪。陀螺仪在工作时要给它一个力,使它快速旋转起来,一般能达到每分钟几十万转,可以工作很长时间。然后用多种方法读取轴所指示的方向,并自动将数据信号传给控制系统。


标签: 陀螺仪传感器mpu陀螺仪力传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台