STM32例程分享-04-MPU6050陀螺仪模块(IIC)

例程运行结果:
在这里插入图片描述


1. 简介

   MPU-60X0是全球首例9轴运动处理器。它集成了3轴MEMS陀螺仪,3轴MEMS加速计,以及1个可扩展的数字运动处理器DMP,可用I2C接口连接一个第三方的数字传感器,比如磁力计。扩展之后就可以通过其I2C或SPI接口输出一个9轴的信号。MPU-60X0也可以通过其I2C接口连接非惯性的数字传感器,比如压力传感器等,在做嵌入式开发中,我们经常用它做运动检测,姿态识别,平衡控制等应用。
在这里插入图片描述

2. DMP

  MPU6050 自带了数字运动处理器,即 DMP,并且InvenSense 提供了一个 MPU6050 的嵌入式运动驱动库,结合 MPU6050 的 DMP,可以将我们的原始数据,直接转换成四元数输出,而得到四元数之后,就可以很方便的计算出欧拉角,从而得到 yaw、roll 和 pitch。使用内置的 DMP,大大简化了四轴的代码设计,且 MCU 不用进行姿态解算过程,大大降低了 MCU 的负担,从而有更多的时间去处理其他事件,提高系统实时性。
 在公众号“IOT趣制作”中回复关键字“0421”直接下载相关资料,然后在目录“常用模块资料\05-MUP6050陀螺仪模块\MPU6050示例工程\HARDWARE\MPU6050\DMP”下,有InvenSense提供的MPU6050 DMP驱动库。
在这里插入图片描述

3. IIC驱动

 由于模块采用IIC通信,我们先写一个软件IIC的驱动文件,大家可以参考目录.\05-MPU6050陀螺仪模块\MPU6050\MPU6050示例工程\HARDWARE\IIC下的myiic.h文件,根据需要修改自己的引脚,由于这里使用的是CRL和CRH寄存器来配置的输入输出方向,所以我们在修改时需要注意寄存器的正确使用,示例中IIC的SDA引脚为PB0,SCL引为PB1,在本手册中涉及的所有IIC的相关模块,使用的都是这个IIC文件。
在这里插入图片描述

4. MPU6050驱动

 在目录常用模块资料\05-MUP6050陀螺仪模块\MPU6050示例工程\HARDWARE\MPU6050下,有MPU6050 驱动文件。
在这里插入图片描述

5. 使用方法

1) 基本初始化

  IIC_Init();           //IIC初始化
  MPU6050_initialize();//MPU6050初始化
  DMP_Init();          //DMP初始化

2) 定时器初始化

由于我们使用DMP,这里我们开启定时中断来读取DMP的数据
main.c中定义TIM2_Init函数:

/*
*********************************************************************************************************
* 函 数 名: TIM2_Init
* 功能说明: 定时器2初始化
* 形 参:u16 arr,u16 psc
*                  arr:重载系数  psc:预分频系数
* 返 回 值: 无
*********************************************************************************************************
*/
void TIM2_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
  TIM_TimeBaseStructure.TIM_Period= arr;                 //设置在下一个更新事件装入活动的自动重装载寄存器周期的值    计数到5000为500ms
  TIM_TimeBaseStructure.TIM_Prescaler=psc;           //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
  TIM_TimeBaseStructure.TIM_ClockDivision= 0;        //设置时钟分割:TDTS = Tck_tim
  TIM_TimeBaseStructure.TIM_CounterMode= TIM_CounterMode_Up;  //TIM向上计数模式
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  TIM_ITConfig( TIM2,TIM_IT_Update|TIM_IT_Trigger,ENABLE);        //使能定时器2更新触发中断
  TIM_Cmd(TIM2, ENABLE);  //使能TIMx外设
  NVIC_InitStructure.NVIC_IRQChannel= TIM2_IRQn;                       //TIM3中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   //先占优先级0级
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                  //从优先级3级
  NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;                         //IRQ通道被使能
  NVIC_Init(&NVIC_InitStructure);
}

3) 定时器中断

void TIM2_IRQHandler(void)
{
  if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)//溢出中断
  {
      Read_DMP(&Pitch,&Roll,&Yaw);
      printf("\n\r 俯仰角=%.2f      横滚角=%.2f      偏航角=%.2f \n\r",Pitch,Roll,Yaw);  
  }
  TIM_ClearITPendingBit(TIM2,TIM_IT_Update);  //清除中断标志位
}

4) 主函数

/*
*********************************************************************************************************
* 函 数 名: main
* 功能说明: 主函数,定时读取并打印陀螺仪姿态信息与芯片温度
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
int main(void)
{
  delay_init();                //delay初始化
  uart_init(115200);          //串口初始化
  printf("uart ok!\r\n");
  IIC_Init();                  //IIC初始化
  MPU6050_initialize();       //MPU6050初始化
  DMP_Init();                  //DMP初始化
  TIM2_Init(1999,719);        //定时器初始化,完成MPU6050定时采集DMMP数据
  TIM_Cmd(TIM2,ENABLE);       //启动定时器
  while(1)
{
//定时读取并打印陀螺仪姿态信息并每1s读取MPU6050芯片温度
      printf("tempuare is %.1f\r\n",(float)Read_Temperature()/10);
      delay_ms(1000);
  }
}

6. 运行结果

在这里插入图片描述

7. 示例工程

在目录“常用模块资料\05-MUP6050陀螺仪模块\MPU6050陀螺仪示例工程\USER”下,有STM32的MP6050测试工程:
在这里插入图片描述

8.参考资料

在目录“.\常用模块资料\05-MUP6050陀螺仪模块\参考资料”中有其他相关资料供大家参考

在这里插入图片描述


上一期:STM32例程分享-03-EEPROM模块(读写AT24C02)(IIC)
下一期:STM32例程分享-05-WS2812B灯带模块(单线归零码)


  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
STM32 MPU6050陀螺仪是指在STM32单片机上读写MPU6050陀螺仪的软件DEMO例程源码。这个例程可以供学习和设计参考使用。 MPU6050是一款使用I2C通讯的陀螺仪和加速度计。要想获取MPU6050陀螺仪和加速度数据,需要先了解一下MPU6050的使用方法。 在STM32 MPU6050陀螺仪的软件DEMO例程源码中,通过初始化和校验的步骤,成功地完成了MPU6050的初始化。然后在数据读取环节,使用相应的函数来读取MPU6050的加速度数据、角加速度数据和原始温度数据。 具体的读取函数包括: 1. 读取MPU6050的加速度数据的函数MPU6050ReadAcc,将数据存储在accData数组中。 2. 读取MPU6050的角加速度数据的函数MPU6050ReadGyro,将数据存储在gyroData数组中。 3. 读取MPU6050的原始温度数据的函数MPU6050ReadTemp,将数据存储在tempData变量中。 通过调用这些函数,可以获取MPU6050陀螺仪数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [STM32单片机 MPU6050陀螺仪串口屏显示&匿名上位机软件例程源码](https://download.csdn.net/download/GJZGRB/86775224)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【stm32stm32学习笔记(江科大)-详解stm32获取Mpu6050陀螺仪和加速度](https://blog.csdn.net/m0_74086611/article/details/129171737)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [模块介绍之六轴陀螺仪MPU6050篇(STM32基本使用)](https://blog.csdn.net/weixin_42193239/article/details/102979420)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IOT趣制作

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值