技术标签: MPU6050 stm32 嵌入式 传感器 单片机
MPU6050具备中断寄存器,有助于精准获取数据。本文将使用STM32配置FIFO中断,并控制中断时间。
如果对于MPU6050还存在其他问题可参考另一篇文章。
MPU6050常见问题的分析与处理
首先在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); //获取欧拉角
/*这里写相关应用*/
}
}
上面代码可以在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。
那么以上就是本篇文章的所有内容了。
本文如果有什么不对的或者需要改进的地方欢迎指出。
使用的模拟IIC接口驱动的MPU6050,最后使用官方的mpu_dmp计算的最终数据存在偏移,估计是没有电子罗盘进行校准,时间长了方向偏移特别严重。 //MPU6050 //MPU6050.h //官方数据融合所需接口 数据融合测试 ...
##标题MPU6050放置问题解决 问题:当MPU6050水平放置的时候可以正常的通过自检, 将其竖直,侧放的时候放置的时候MPU无法通过自检...
树莓派连接MPU6050六轴传感器接法(mpu6050连接树莓派)...
要安装 wiringPi ,安装方法百度...
前言 发现网上树莓派利用dmp读取MPU6050姿态角的方法很少,大部分是直接读取原始数据,然后利用数学方法分析。资料比较多的是stm平台,所以我借鉴了stm的移植方法。 收获最大的是正点原子论坛中关于mpu6050的资料,大家可以在论坛中搜到mpu6050的资料,最终实现在树莓派上读取MPU6050的dmp姿态角数据,要感谢很多前辈,在网上借鉴了很...
此文为个人学习总结,方便回顾。 1、MPU6050,dmp初始化失败。 调试后发现此函数返回值为8,自检失败。 调用mpu_dmp_init(void)时,需要保证MPU6050水平状态;或者将自检关闭,注释...
摘要 MPU6050是一种非常流行的空间运动传感器芯片,可以获取器件当前的三个加速度分量和三个旋转角速度。由于其体积小巧,功能强大,精度较高,不仅被广泛应用于工业,同时也是航模爱好者的神器,被安装在各类飞行器上驰骋蓝天。 随着Arduino开发板的普及,许多朋友希望能够自己制作基于MPU6050的控制系统,但由于缺乏专业知识而难以上手。此外,MPU6050的数据是有较大噪音的,若不进行滤波会对整个...
我使用的是MPU6050 GY521,STM32F407,软件模拟iic。 问题描述: MPU6050之前使用正点原子的例程可以读出数据,但是和超声波测距的程序融合在一起以后就出不来数据,而且现在单独使用MPU6050也都不出数据了。 单步调试发现if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)在这句中,mpu_dmp_get_data(...
提示:STM32F103读取MPU6050原始数据,并通过串口助手显示,文件下载免费。 文章目录 前言 一、MPU6050简介 二、底层文件配置详解 1.IIC通信部分文件内容 2.MPU6050对应设置及数据获取内容 3.滴答定时器延时程序设定 4.主函数 总结 前言 MPU6050的使用对于初学者来说,如果没有详细的教程资料学习了解,便想利用MPU6050来制作飞控,平衡小车,穿戴设备等,这毫...
@[TOC]STM32初始化MPU6050低功耗 中断唤醒 STM32初始化MPU6050低功耗 中断唤醒 代码如下: 已亲自测试(2021.2.4) (以下代码 采样率是20Hz) 低功耗中断唤醒 记得连MPU6050的INT引脚到MCU...