一、硬件结构
1.什么是陀螺仪?
陀螺仪是用于测量或维护方位和角速度的设备。它是一个旋转的轮子或圆盘,其中旋转轴可以不受影响的设定在任何方向。当旋转发生时,根据角动量守恒定律,该轴的方向不受支架倾斜或旋转的影响。
2.MPU6050三位角度加速度陀螺仪
MPU6050是一个6轴运动处理传感器。它集成了3轴MEMS陀螺仪,3轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP(Digital Motion Processor),可用I2C接口连接一个第三方的数字传感器,比如磁力计。扩展之后就可以通过其I2C接口输出一个6轴信号。
MPU6050对陀螺仪和加速度计分别用了三个16位ADC,将其测量的模拟量转化为可输出的数字量。为了精确跟踪快速和慢速的运动,传感器的测量范围都是用户可控的。
陀螺仪的可测范围为±250,±500,±1000,±2000°/秒(dps),加速度计可测范围为±2,±4,±8,±16g。
3.原理图
作用:检测倾斜角
MPU6050中断引脚——PB5
MPU6050所用I2C——PB3/PB4
二、软件编程
1.I2C函数——mpuiic.c
GPIO初始化:PB3、PB4,模拟I2C;
通过时序函数模拟I2C通信
2.MPU6050函数——mpu6050.c
MPU6050初始化
3.MPU6050中断函数——exti.c
这里主要是通过MPU6050模块上的中断引脚ANT读取角加速度和角速度的原始数据。
exti.c:
#include "exti.h"
void MPU6050_EXTI_Init(void)
{
EXTI_InitTypeDef EXTI_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
// 开启时钟
// 外部中断,需要使能AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU; // PB5配置为上拉输入
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource5); // 外部中断和GPIO映射起来
EXTI_InitStruct.EXTI_Line=EXTI_Line5;
EXTI_InitStruct.EXTI_LineCmd=ENABLE;
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt; // 中断触发
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;// MPU6050发生中断时会有一个下降沿
EXTI_Init(&EXTI_InitStruct);
}
exti.h:
#ifndef _EXTI_H
#define _EXTI_H
#include "sys.h"
void MPU6050_EXTI_Init(void);
#endif