前言
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。
结语
那么以上就是本篇文章的所有内容了。
本文如果有什么不对的或者需要改进的地方欢迎指出。