MPU6050数据没有变化?

MPU6050 Data Not Changing?

提问人:Allan Liu 提问时间:11/13/2023 更新时间:11/13/2023 访问量:27

问:

我正在使用STM326050 MCU,并尝试使用MPU6050(MPU6050寄存器MPU6050数据表获取陀螺仪和加速度计数据。我已使用以下代码确保MPU6050已正确初始化并准备就绪:

HAL_StatusTypeDef initMPU6050(void) {
  uint8_t check;
  HAL_I2C_Mem_Read(&hi2c1, MPU6050_ADDR, MPU6050_WHO_AM_I_REG, 1, &check, 1, 1000);
  if (check == 0x68) {
    for (int i = 0; i < 20; i++) {
      HAL_GPIO_TogglePin(GPIOA, LD2_Pin);
      HAL_Delay(200);
    }
    // the regSet variables set the gyro and accel to 500deg/s and 4g respectively
    uint8_t gyroRegSet = 0x08;
    uint8_t accelRegSet = 0x08;
    uint8_t pwrMgmtSet = 0;
    HAL_StatusTypeDef ret;
    ret = HAL_I2C_Mem_Write(&hi2c1, MPU6050_ADDR, MPU6050_GYRO_REG, 1, &gyroRegSet, 1, 100);
    if (ret != HAL_OK) {return HAL_ERROR;}
    HAL_Delay(50);
    ret = HAL_I2C_Mem_Write(&hi2c1, MPU6050_ADDR, MPU6050_ACCEL_REG, 1, &accelRegSet, 1, 100);
    if (ret != HAL_OK) {return HAL_ERROR;}
    HAL_Delay(50);
    ret = HAL_I2C_Mem_Write(&hi2c1, MPU6050_ADDR, MPU6050_PWE_MGMT_REG, 1, &pwrMgmtSet, 1, 100);
    if (ret != HAL_OK) {return HAL_ERROR;}
    return HAL_OK;
  }
  return HAL_ERROR;

后记,我尝试使用以下代码在 X 方向上收集陀螺仪数据(确保一个轴在扩展到所有 6 轴之前工作):

HAL_StatusTypeDef readGyroGx(uint16_t* Gx, HAL_StatusTypeDef init) {
  if (init != HAL_OK) {return HAL_ERROR;}
  uint8_t gxh;`
  uint8_t gxl;
  HAL_I2C_Mem_Read(&hi2c1, MPU6050_ADDR, 0x43, 1, &gxh, 1, 1000);
  HAL_I2C_Mem_Read(&hi2c1, MPU6050_ADDR, 0x44, 1, &gxl, 1, 1000);
  Gx = (gxh<<8) | gxl;
}

并使用以下命令将其显示在屏幕上:

uint16_t buf[20];
  HAL_StatusTypeDef init = initMPU6050();
  uint16_t gx;
  while (1)
  {
    readGyroGx(&gx, init);
    sprintf((char*)buf, "%u \r\n", gx);
    HAL_UART_Transmit(&huart2, buf, strlen((char*)buf), 1000);
    HAL_GPIO_TogglePin(GPIOA, LD2_Pin);
    HAL_Delay(100);
  }

我试过旋转和移动MPU6050,但无论我如何移动它,Gx 值似乎都停留在值 60254。任何帮助将不胜感激。 谢谢。

C STM32 HAL MPU6050

评论


答:

0赞 Allan Liu 11/13/2023 #1

我发现了问题,结果我的行需要使用 *Gx 而不是 Gx。对于输出数据,我应该不使用 %u。Gx = (gxh<<8) | gxl;%hu

评论

0赞 Lundin 11/13/2023
Gx = (gxh<<8) | gxl;不应该编译。假设这是 gcc,请确保已启用所有警告,并且 C 标准违规报告为错误。对于学习 C 语言的初学者,推荐使用哪些编译器选项?