提问人:Allan Liu 提问时间:11/13/2023 更新时间:11/13/2023 访问量:27
MPU6050数据没有变化?
MPU6050 Data Not Changing?
问:
我正在使用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。任何帮助将不胜感激。 谢谢。
答:
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 语言的初学者,推荐使用哪些编译器选项?
评论