发新帖我要提问
123
返回列表
打印
[其他ST产品]

STM32CubeMX驱动MPU6050模块

[复制链接]
楼主: 逢dududu必shu
手机看帖
扫描二维码
随时随地手机跟帖
41
逢dududu必shu|  楼主 | 2023-12-29 00:27 | 只看该作者 回帖奖励 |倒序浏览
4.4 读取数据
4.4.1 读取加速度计值
函数声明如下:void MPU6050_ReadAccel(MPU6050_t* mpu6050, float* ax, float* ay, float* az);

使用特权

评论回复
42
逢dududu必shu|  楼主 | 2023-12-29 00:27 | 只看该作者
MPU6050_t* mpu6050:MPU6050设备结构体指针,用来表示要读取的MPU6050设备。
float* ax: 存储X轴加速度值的指针,函数执行后,X轴加速度值将被存储在该指针指向的内存地址中。
float* ay: 存储Y轴加速度值的指针,函数执行后,Y轴加速度值将被存储在该指针指向的内存地址中。
float* az: 存储Z轴加速度值的指针,函数执行后,Z轴加速度值将被存储在该指针指向的内存地址中。

使用特权

评论回复
43
逢dududu必shu|  楼主 | 2023-12-29 00:27 | 只看该作者
4.4.2 读取角速度计值
函数声明如下:
void MPU6050_ReadGyro(MPU6050_t* mpu6050, float* gx, float* gy, float* gz);

MPU6050_t* mpu6050:MPU6050设备结构体指针,用来表示要读取的MPU6050设备。
float* gx: 存储X轴角速度值的指针,函数执行后,X轴角速度值将被存储在该指针指向的内存地址中。
float* gy: 存储Y轴角速度值的指针,函数执行后,Y轴角速度值将被存储在该指针指向的内存地址中。
float* gz: 存储Z轴角速度值的指针,函数执行后,Z轴角速度值将被存储在该指针指向的内存地址中。

使用特权

评论回复
44
逢dududu必shu|  楼主 | 2023-12-29 00:27 | 只看该作者
4.4.1 读取温度值
函数声明如下:
float MPU6050_ReadTemp(MPU6050_t* mpu6050);
MPU6050_t* mpu6050:MPU6050设备结构体指针,用来表示要读取的MPU6050设备。
返回值即为对应的芯片温度,单位为摄氏度

使用特权

评论回复
45
逢dududu必shu|  楼主 | 2023-12-29 00:27 | 只看该作者
5. 实验
先将模块静止在桌面,然后晃动模块,最后用体温对芯片进行热传递,观察OLED显示的加速度值、角速度值和温度值变化。
主函数内容如下:
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "i2c.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "oled.h"
#include "MPU6050.h"
#include "stdio.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
uint8_t accelX_buff[16]={0},accelY_buff[16]={0},accelZ_buff[16]={0};
uint8_t gyroX_buff[16]={0},gyroY_buff[16]={0},gyroZ_buff[16]={0};
uint8_t temp_buff[16]={0};
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
    // 定义一个MPU6050结构体
    MPU6050_t mpu6050
    = {
    .hi2c=&hi2c2,
    .devAddr = 0xD0,            // 设备地址
    .initialized = 0            // 设备是否已初始化
};
    float ax, ay, az, gx,gy,gz,temp;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C1_Init();
  MX_I2C2_Init();
  /* USER CODE BEGIN 2 */
  OLED_Init();
  OLED_Clear();
  MPU6050_Init(&mpu6050, &hi2c2);
  if (mpu6050.initialized)
  {
      
      OLED_ShowString(0,0,"MPU6050 initialized successfully!",16);
  }
  else
  {
      OLED_ShowString(0,0,"MPU6050 initialization failed.",16);
      return -1;
  }
  OLED_Clear();
  
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    /* 读取加速度计数据 */
    MPU6050_ReadAccel(&mpu6050, &ax, &ay, &az);
    /* 读取加速度计数据 */
    MPU6050_ReadGyro(&mpu6050, &gx, &gy, &gz);      
    /* 读取温度数据 */
    temp = MPU6050_ReadTemp(&mpu6050);

    /* 打印数据到串口 */
    sprintf((char*)accelX_buff,"AccelX:%-.3f   ",ax);
    OLED_ShowString(0,0,accelX_buff,8);
    sprintf((char*)accelY_buff,"AccelY:%-.3f   ",ay);
    OLED_ShowString(0,1,accelY_buff,8);
    sprintf((char*)accelZ_buff,"AccelZ:%-.3f   ",az);
    OLED_ShowString(0,2,accelZ_buff,8);
   
    sprintf((char*)gyroX_buff,"Gyro X:%-.3f   ",gx);
    OLED_ShowString(0,3,gyroX_buff,8);
    sprintf((char*)gyroY_buff,"Gyro Y:%-.3f   ",gy);
    OLED_ShowString(0,4,gyroY_buff,8);
    sprintf((char*)gyroZ_buff,"Gyro Z:%-.3f   ",gz);
    OLED_ShowString(0,5,gyroZ_buff,8);
   
    sprintf((char*)temp_buff,"Temp :%-.3f   ",temp);
    OLED_ShowString(0,6,temp_buff,8);
  }
  /* USER CODE END 3 */
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则