代码先锋网 代码片段及技术文章聚合

MPU6050中断读取数据及采样时长配置

技术标签: MPU6050  stm32  嵌入式  传感器  单片机



前言

MPU6050具备中断寄存器,有助于精准获取数据。本文将使用STM32配置FIFO中断,并控制中断时间。
如果对于MPU6050还存在其他问题可参考另一篇文章。
MPU6050常见问题的分析与处理


提示:以下是本篇文章的正文内容

一、MPU6050 FIFO中断配置

首先在MPU6050初始化函数中配置好

#define MPU_INT_EN_REG			0X38	//中断使能寄存器
#define MPU_INTBP_CFG_REG		0X37	//中断/旁路设置寄存器

MPU_Write_Byte(MPU_INT_EN_REG, 0X01); //开启FIFO中断
MPU_Write_Byte(MPU_INTBP_CFG_REG, 0X80);	//INT引脚0X80低电平触发
//MPU_Write_Byte(MPU_INTBP_CFG_REG,0X9c);	//INT引脚0X9c高电平触发

MPU6050触发的是STM32的外部中断,此处使用的是PB5的外部中断,因为是低电平触发,所以GPIO模式设置为上拉输入。

void MPU6050_EXTI_Init(void)
{  
	GPIO_InitTypeDef GPIO_InitStructure;
	EXTI_InitTypeDef EXTI_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //外部中断,需要使能AFIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource5);
	
	EXTI_InitStructure.EXTI_Line = EXTI_Line5;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;	
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2, 
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级1
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure); 
}

以下是中断服务函数

void EXTI9_5_IRQHandler(void)
{
	if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5) == 0) //低电平触发
	{
		EXTI->PR=1<<5; //清楚中断标志位
		
		mpu_dmp_get_data(&pitch, &roll, &yaw); //获取欧拉角
		
		/*这里写相关应用*/
	}
}

二、配置DMP采样时长

上面代码可以在FIFO溢出时产生中断及时读取数据,这个中断时间是可以控制的。经过定时器定时发现还挺准的。

在MPU6050初始化函数中配置

MPU_Set_Rate(200); //设置采样率为200Hz

在DMP初始化函数中配置

res = mpu_set_sample_rate(200); //设置采样率
if(res)
	return 3;

res = dmp_set_fifo_rate(200); //设置DMP输出速率(最大不超过200Hz)
if(res)
	return 7;   

此处将采样率设置为200HZ,那么采样时间就是1/200=5ms
根据公式T = 1 / f
实际上采样频率是根据DMP频率,如果两个频率不同最终也以DMP的为主,当然前提是使用DMP。


结语

那么以上就是本篇文章的所有内容了。
本文如果有什么不对的或者需要改进的地方欢迎指出。

版权声明:本文为qq_46554815原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_46554815/article/details/113653451

智能推荐

MPU6050驱动

使用的模拟IIC接口驱动的MPU6050,最后使用官方的mpu_dmp计算的最终数据存在偏移,估计是没有电子罗盘进行校准,时间长了方向偏移特别严重。 //MPU6050 //MPU6050.h //官方数据融合所需接口 数据融合测试  ...

MPU6050

##标题MPU6050放置问题解决 问题:当MPU6050水平放置的时候可以正常的通过自检, 将其竖直,侧放的时候放置的时候MPU无法通过自检...

Python脚本实现树莓派对MPU6050的数据读取

树莓派连接MPU6050六轴传感器接法(mpu6050连接树莓派)...

树莓派4B读取MPU6050数据(iic)

要安装 wiringPi ,安装方法百度...

树莓派利用dmp读取MPU6050姿态角

前言   发现网上树莓派利用dmp读取MPU6050姿态角的方法很少,大部分是直接读取原始数据,然后利用数学方法分析。资料比较多的是stm平台,所以我借鉴了stm的移植方法。   收获最大的是正点原子论坛中关于mpu6050的资料,大家可以在论坛中搜到mpu6050的资料,最终实现在树莓派上读取MPU6050的dmp姿态角数据,要感谢很多前辈,在网上借鉴了很...

猜你喜欢

FreeRTOS下MPU6050配置出现问题

此文为个人学习总结,方便回顾。 1、MPU6050,dmp初始化失败。         调试后发现此函数返回值为8,自检失败。         调用mpu_dmp_init(void)时,需要保证MPU6050水平状态;或者将自检关闭,注释...

MPU6050的数据获取、分析与处理

摘要 MPU6050是一种非常流行的空间运动传感器芯片,可以获取器件当前的三个加速度分量和三个旋转角速度。由于其体积小巧,功能强大,精度较高,不仅被广泛应用于工业,同时也是航模爱好者的神器,被安装在各类飞行器上驰骋蓝天。 随着Arduino开发板的普及,许多朋友希望能够自己制作基于MPU6050的控制系统,但由于缺乏专业知识而难以上手。此外,MPU6050的数据是有较大噪音的,若不进行滤波会对整个...

MPU6050读不出来数据

我使用的是MPU6050 GY521,STM32F407,软件模拟iic。 问题描述: MPU6050之前使用正点原子的例程可以读出数据,但是和超声波测距的程序融合在一起以后就出不来数据,而且现在单独使用MPU6050也都不出数据了。 单步调试发现if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)在这句中,mpu_dmp_get_data(...

STM32单片机直接读取,并串口显示MPU6050原始数据(详细教程)

提示:STM32F103读取MPU6050原始数据,并通过串口助手显示,文件下载免费。 文章目录 前言 一、MPU6050简介 二、底层文件配置详解 1.IIC通信部分文件内容 2.MPU6050对应设置及数据获取内容 3.滴答定时器延时程序设定 4.主函数 总结 前言 MPU6050的使用对于初学者来说,如果没有详细的教程资料学习了解,便想利用MPU6050来制作飞控,平衡小车,穿戴设备等,这毫...

STM32 HAL库初始化MPU6050低功耗 中断唤醒

@[TOC]STM32初始化MPU6050低功耗 中断唤醒 STM32初始化MPU6050低功耗 中断唤醒 代码如下: 已亲自测试(2021.2.4) (以下代码 采样率是20Hz) 低功耗中断唤醒 记得连MPU6050的INT引脚到MCU...