关于物联网:如何利用小熊派获取MPU6050六轴原始数据

34次阅读

共计 3356 个字符,预计需要花费 9 分钟才能阅读完成。

摘要:应用小熊派开发板,通过硬件 IIC 与 MPU6050 六轴传感器模块通信,实现相应寄存器配置,胜利获取陀螺仪、加速度计数据。

本问次要讲述应用小熊派开发板 +MPU6050 六轴传感器,获取加速度计以及陀螺仪信息。

一、试验筹备

1. 试验环境

  • 一块 stm32 开发板(举荐应用小熊派),以及数据线
  • 曾经装置 STM32CubeMX
  • 曾经装置 KeilMDK, 并导入 stm32 开发板对应的芯片包(小熊派应用的是 STM32L431RCT6)
  • 一个 MPU6050 模块(IIC 接口)以及杜邦线

2. 指标成果

  • 通过 CubeMX 创立工程并配置参数
  • IIC 形式通信,配置 MPU6050 寄存器
  • 小熊派通过 IIC,获取陀螺仪、加速度计数据
  • 串口 1 重定向输入编码器转动的角度、角速度

二、通过 CubeMX 生产 MDK 工程

A. 芯片抉择

  • 关上 CubeMX, 进入芯片抉择:

  • 抉择本人的 stm32 芯片(即 STM32L431RCT6):

B. 时钟源 RCC 设置

  • 更改零碎时钟源

零碎时钟默认应用外部的高速时钟(HSI),抉择应用 HSE,时钟更准确

  • 设置内部时钟对应的端口

  • 配置时钟树

STM32L431RCT6 零碎时钟最大能够为 80MHz,咱们配置到最大即可

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

1)配置 USART1

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

2)硬件 IIC 配置

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

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

其余选项咱们放弃默认即可

3)MPU6050 模块

当然,咱们还须要理解 MPU6050 模块的电路,更好的进行配置。当然咱们也能够自主制作模块

如果 AD0 脚 (9 脚) 接地,IIC 地址为 0X68(不蕴含最低位);如果 AD0 脚接 V3.3, 则 IIC 地址为 0X69(不蕴含最低位).

能够看到,AD0 引脚曾经被拉低,所有默认 IIC 地址为 0x68.

最初,生成代码就 OK 了

D. 工程设置

一些根底的设置,包含工程名、存储地位、工程环境、工程中各个文件的组成

E. 生成代码

三、编写相应代码

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 worldrn”);/ USER CODE END 1 /

留神:本人增加的代码,须要在 begin 和 end 之间

2. 写 MPU6050 驱动

咱们创立两个文件,别离是 mpu6050.h 和 mpu6050.c

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

在 main 函数中,咱们首先设置计数器初值为 10000,而后关上编码器,每 1S 获取一次计数器的更新值,判断编码器信息
因为寄存器切实太多,就没有一一列出,能够在附件中查看哦~

b). 配置各个寄存器

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

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

初始化函数

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;,”rnMPU6050:0x%2xrn”,res);
UsartPrintf(&huart1;,”rnMPU6050:0x%2xrn”,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(“rn 陀螺仪:x=-,y=-,z=-rn”,x,y,z); while(MPU_Get_Accelerometer(&x,&y,&z) != 0);
HAL_Delay(1000);
printf(“rn 加速度计:x=-,y=-,z=-rn”,x,y,z); / USER CODE BEGIN 3 / }

四、编译 + 下载

点击编译后,0 error,0 warning

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

五、连贯硬件

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

2. 连贯 MPU6050

咱们只须要应用 mpu6050 的 SDASCLGNDVCC。
即:

  • SDA–>PB7
  • SCL–>PB6
  • GND–>GND
  • VCC–>5V

3. 成果

关上串口调试助手,咱们手动转动开发板(包含模块),看见陀螺仪和加速度数据一直变动,当静止时数据保持稳定。

至此,咱们曾经能够通过小熊派以 IIC 获取六轴传感器原始数据信息

本文分享自华为云社区《小熊派实际——获取 MPU6050 六轴原始数据》,原文作者:ttking。

点击关注,第一工夫理解华为云陈腐技术~

正文完
 0