STM32

您所在的位置:网站首页 六轴陀螺仪是什么样的 STM32

STM32

2024-07-08 00:14| 来源: 网络整理| 查看: 265

文章目录 一.MPU6050介绍1.MPU6050与陀螺仪、加速度计的关系:2.整体概括3.引脚说明4.基本配置及相关寄存器电源管理寄存器1陀螺仪配置寄存器加速度计配置寄存器FIFO使能寄存器陀螺仪采样率分频寄存器温度传感器寄存器 二.代码详解1.框架2.mpu_iic.c/mpu_iic.h3.mpu6050.c/mpu6050.h4.DMP相关代码5.mian()函数

一.MPU6050介绍 1.MPU6050与陀螺仪、加速度计的关系:

MPU6050是InvenSense公司推出的一款全球首款的整合性9轴运动处理传感器,其最大的特色就是:消除了陀螺仪和加速度计的误差,将陀螺仪和加速度计组合在一起,而且缩小了空间。关于陀螺仪、加速度计和MPU6050之间的关系之前在一篇博客中已经做了介绍:博客链接

2.整体概括

MPU6050内部整合了三轴MEMS陀螺仪、三轴MEMS加速度计以及一个可扩展的数字运动处理器DMP,而且还可以连接一个第三方数字传感器(比如:磁力计),这样的话,就可以通过IIC接口输出一个9轴信号。 更加方便的是,有了DMP,可以结合InvenSense公司提供的运动处理资料库,实现姿态解算。通过自带的DMP,可以通过IIC接口输出9轴融合演算的数据,大大降低了运动处理运算对操作系统的负荷,同时也降低了开发难度。

特点: ① 以数字形式输出 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.5V±5%、 3.0V±5%、 3.3V±5%; VLOGIC 可低至 1.8V± 5% ⑪ 陀螺仪工作电流: 5mA,陀螺仪待机电流: 5uA; 加速器工作电流: 500uA,加速器省 电模式电流: 40uA@10Hz ⑫ 自带 1024 字节 FIFO,有助于降低系统功耗 ⑬ 高达 400Khz 的 IIC 通信接口 ⑭ 超小封装尺寸: 4x4x0.9mm(QFN)

其检测轴如图所示: 在这里插入图片描述

3.引脚说明

在这里插入图片描述 如图,MPU6050一共有8个引脚,实际上输出六轴数据时,只用了5个:VCC、GND、SCL、SDA、AD0。下面介绍一下引脚:

VCC:供电,3.3V即可GND:接地SCL:连接MCU的IIC时钟接口SAD:连接MCU的IIC数据接口XCL:连接外部设备的IIC时钟接口XAD:连接外部设备的IIC数据接口AD0:地址控制引脚(控制地址的最低位)INT:中断触发接口(不用)

XCL、XDA只有在连接外部设备(比如磁力计的时候才用),AD0用来控制MPU6050的地址,如果AD0低电平,地址就是0X68;如果AD0高电平,地址就是0X69。

4.基本配置及相关寄存器

MCU与MPU6050的通信是建立在IIC通信机制上的,在IIC的基础上,可以实现对MPU6050的寄存器的操作,而MPU6050的运作就是过对寄存器进行读写。所以,了解相关的寄存器和对寄存器的操作是很有必要的。MPU6050的寄存器相关资料都可以在数据手册中查到,下面介绍一下几个重要的寄存器:

电源管理寄存器1

地址:0X68在这里插入图片描述 主要位的功能:

DEVICE_RESET:控制复位,1表示复位,复位后会自动清零;SLEEP:控制MPU6050工作模式,1表示睡眠模式,0表示正常工作模式,复位后改位为1,要手动将改位清零;TEMP_DIS:使能温度传感器位,0代表使能;CLKSEL[2:0]:选择系统时钟源,一般采用PLL_X轴陀螺作为参考,具体的时钟源选择及相应位的值如图:在这里插入图片描述 陀螺仪配置寄存器

地址:0X1B 在这里插入图片描述 主要位的功能:

FS_SEL[1:0]:设置陀螺仪满量程范围:为0代表±250° /S、为1代表±500° /S、为2代表±1000° /S为3代表±2000° /S;

陀螺仪的分辨率是16位,所以在最大量程下灵敏度为: 65536/4000=16.4LSB/(° /S)。

加速度计配置寄存器

地址:0X1C 在这里插入图片描述 主要位的功能:

AFS_SEL[1:0]:设置加速度计满量程范围:为 0代表±2g、为1代表±4g、为 2代表±8g、为 3代表±16g; FIFO使能寄存器

地址:0X23 在这里插入图片描述 用来控制FIFO功能,相应位对应着相应的传感器FIFO功能,为0代表禁止,为1代表使能。注意:加速度传感器的三个轴的FIFO功能由一个位ACCEL_FIFO_EN控制。在简单读取传感器数据的情况下可以不使用FIFO。

陀螺仪采样率分频寄存器

地址:0X19 在这里插入图片描述 改寄存器用来设置MPU6050陀螺仪的采样频率,与之相关的是陀螺仪的输出频率,俩者关系是:采样频率 = 陀螺仪输出频率 / (1+SMPLRT_DIV) 陀螺仪输出频率与数字低通滤波器(DLPF)有关,DLPF滤波频率一般设置为采样率的一半。

温度传感器寄存器

地址:高八位0X41、低八位0X42 直接通过读取寄存器中的值来得到温度数据,温度换算公式为: Temperature = 36.53 + regval/340

二.代码详解 1.框架

我是用STM32驱动MPU6050,MPU6050输出原始的六轴数据,经过DMP处理(有库)得到四元数,再由四元数算出欧拉角:yaw、roll、pitch。由串口打印在电脑屏幕上。

首先,要做底层的IIC驱动,用来和MPU6050建立通信,我在mpu_iic.c中实现了;然后,有了底层的驱动,就要写一些函数来与MPU6050交流了(通过读写寄存器),还可以写入命令、配置MPU6050、读取原始数据等等,这些操作我都写在mpu6050.c中,当然在mpu6050.h头文件中还包含了MPU各寄存器地址和相关指令。通过mpu6050.c的实现,就可以读出原始六轴数据,下一步就是通过DMP将原始数据转换为四元数,这一步的DMP算法我水平有限,只能移植InvenSense公司提供的例程。关于移植DMP算法,由于DMP算法本质也是对MPU6050的操作,所以我们只需要向移植过来的算法提供:对MPU6050寄存器执行读和写的函数接口即可,最后通过移植过来的函数直接读出四元数!然后,就是将四元数转换为欧拉角了,这个比较简单,一个函数就可以实现。最后,打印串口到屏幕。

下面给出各函数文件

2.mpu_iic.c/mpu_iic.h

mpu_iic.h 主要是宏定义对引脚电平的操作和进行函数声明。

#ifndef __MPU_IIC_H #define __MPU_IIC_H #include "stm32f10x.h" #include "delay.h" /* 宏定义引脚电平操作函数 */ #define MPU_SDA_IN() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8CRH|=37)==1 ) MPU_IIC_SDA_1(); else MPU_IIC_SDA_0(); data


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3