小熊派实践——获取MPU6050六轴原始数据

举报
ttking 发表于 2020/11/23 21:50:40 2020/11/23
【摘要】 使用小熊派开发板,通过硬件IIC与MPU6050六轴传感器模块通信,完成相应寄存器配置,成功获取陀螺仪、加速度计数据

本贴使用小熊派开发板+MPU6050六轴传感器,获取加速度计以及陀螺仪信息。

一、实验准备

1.实验环境

  • 一块stm32开发板(推荐使用小熊派),以及数据线

  • 已经安装STM32CubeMX

  • 已经安装KeilMDK,并导入stm32开发板对应的芯片包(小熊派使用的是STM32L431RCT6)

  • 一个MPU6050模块(IIC接口)以及杜邦线
    image.png
    image.png


2.目标效果

  • 通过CubeMX创建工程并配置参数

  • IIC方式通信,配置MPU6050寄存器

  • 小熊派通过IIC,获取陀螺仪、加速度计数据

  • 串口1重定向输出编码器转动的角度、角速度

二、通过CubeMX生产MDK工程

A.芯片选择

  • 打开CubeMX,进入芯片选择:

image.png

  • 选择自己的stm32芯片(即STM32L431RCT6):

image.png

B.时钟源RCC设置

  • 更改系统时钟源

    系统时钟默认使用内部的高速时钟(HSI),选择使用HSE,时钟更精确

  • 设置外部时钟对应的端口
    image.png

  • 配置时钟树

    STM32L431RCT6系统时钟最大可以为80MHz,我们配置到最大即可

image.png

C.参数配置(对应端口设置)

1)配置USART1

使用USART,模式为异步,波特率为115200,无硬件流控制


image.png

2)硬件IIC配置

IIC(Inter-Integrated Circuit)其实是IICBus简称,所以中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构

我们使用小熊派的I2C1,小熊派引出的引脚为PB7->I2C1_SDA,PB6->I2C1_SCL

其他选项我们保持默认即可

image.png

3)MPU6050模块

当然,我们还需要了解MPU6050模块的电路,更好的进行配置。当然我们也可以自主制作模块
如果AD0脚(9脚)接地,IIC地址为0X68(不包含最低位);如果AD0脚接V3.3,则IIC地址为0X69(不包含最低位).

image.png

可以看到,AD0引脚已经被拉低,所有默认IIC地址为0x68.

最后,生成代码就OK了

D.工程设置

一些基础的设置,包括工程名、存储位置、工程环境、工程中各个文件的组成


image.png


image.png

E.生成代码

image.png

三、编写相应代码

1. 串口1输出重定向

我们知道printf是打印函数,原理是根据传入的字符串参数格式化打印输出到stdout中。我们需要让printf打印到串口之中,只需要在usart.c文件中模仿printf写一个输出函数即可

  • 在添加头文件

    /* USER CODE BEGIN 0 */#include <stdarg.h>#include <string.h>#include <stdio.h>/* USER CODE END 0 */
  • 写输出函数

/* USER CODE BEGIN 1 */void UsartPrintf(UART_HandleTypeDef *huart, char *fmt,...){

 unsigned char UsartPrintfBuf[296];
 va_list ap;
 unsigned char *pStr = UsartPrintfBuf;

 va_start(ap, fmt);
 vsprintf((char *)UsartPrintfBuf, fmt, ap); //格式化
 va_end(ap);

 while(*pStr != 0)
 {
  USART1->TDR = *pStr++;
  while((USART1->ISR & 0x40)  == 0);
 }}//注意:在usart.h中添加void UsartPrintf(UART_HandleTypeDef *huart, char *fmt,...);//使用方法:UsartPrintf(&huart1;,"hello world\r\n");/* USER CODE END 1 */

注意:自己添加的代码,需要在begin和end之间

2.写MPU6050驱动

我们创建两个文件,分别是mpu6050.h和mpu6050.c

a).首先我们在mpu6050.h中宏定义相应的寄存器,方便后续使用。


因为寄存器实在太多,就没有一一列出,可以在附件中查看哦~

image.png

b).配置各个寄存器

主要的函数为:IIC读写、初始化MPU6050、设置陀螺仪和加速度计满量程、设置采样率、读取数据

代码附件中有,不一一讲解。

初始化函数

>初始化函数中,我们必须要保证IIC读写的正确,因此可以通过读某一个有确定值的寄出去,大致判断IIC通信的准确。此方法同样在SPI等通信协议时会使用到


uint8_t MPUInit(void){
 uint8_t res;
 extern I2C_HandleTypeDef hi2c1;

 HAL_I2C_Init(&hi2c1;); //初始化IIC

 /*上电后最好有一定延时,保证数据准确*/
 HAL_Delay(500);
 MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x80); //复位MPU6050,写入1000 0000
 MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x00);//sleep写入0,保持唤醒状态

 MPU_Set_Gyro_Fsr(3);  //陀螺仪满量程±2000
 MPU_Set_Accel_Fsr(0); //加速度计满量程±2g
 MPU_Set_Rate(50);     //设置采样率=50Hz

 MPU_Write_Byte(MPU_INT_EN_REG,0x00);//关闭所有中断
 MPU_Write_Byte(MPU_USER_CTRL_REG,0x00); //关闭从iic
 MPU_Write_Byte(MPU_FIFO_EN_REG,0x00);   //关闭FIFO
 MPU_Write_Byte(MPU_INTBP_CFG_REG,0x80);  //INT引脚低电平有效

 res = MPU_Read_Byte(MPU_DEVICE_ID_REG);  //读取地址
 UsartPrintf(&huart1;,"\r\nMPU6050:0x%2x\r\n",res);
 UsartPrintf(&huart1;,"\r\nMPU6050:0x%2x\r\n",MPU_ADDR);
 if(res == MPU_ADDR) //判断地址是否正确
 {
  MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x01); //001,pll,x轴为参考系统时钟源
  MPU_Write_Byte(MPU_PWR_MGMT2_REG,0x00); //都不使用待机模式
  MPU_Set_Rate(50);
 }else return 1;

 return 0;}

需要注意到,mpu6050上电后需要有一定延时,保证数据的稳定。重启mpu6050会有睡眠模式,写入关闭睡眠。最后检测并判断IIC地址是否正确

3.main函数

/* USER CODE BEGIN PV */short x;short y;short z;/* USER CODE END PV */
  /* USER CODE BEGIN 2 */
 MPUInit();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
 while(MPU_Get_Gyroscope(&x,&y,&z) !=0);
 HAL_Delay(1000);
   printf("\r\n陀螺仪:x=-,y=-,z=-\r\n",x,y,z);
 while(MPU_Get_Accelerometer(&x,&y,&z) != 0);
 HAL_Delay(1000);
   printf("\r\n加速度计:x=-,y=-,z=-\r\n",x,y,z);
    /* USER CODE BEGIN 3 */
  }

四、编译+下载

点击编译后,0 error,0 warning


image.png

小熊派连接在电脑上,代码下载到开发板

image.png

五、连接硬件

1.将小熊派串口1和电脑相连,即拨到 AT-MUC,按下复位键

image.png

2.连接MPU6050

我们只需要使用mpu6050的SDA\SCL\GND\VCC。
即:

  • SDA-->PB7

  • SCL-->PB6

  • GND-->GND

  • VCC-->5V


3.效果

打开串口调试助手,我们手动转动开发板(包括模块),看见陀螺仪和加速度数据不断变化,当静止时数据保持稳定 。

至此,我们已经可以通过小熊派以IIC获取六轴传感器原始数据信息

附件中包含CubeMX工程、MDK工程



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。