No se pueden leer los valores del acelerómetro desde MPU6050 Interconectado con STM32F303RE

0

Estoy trabajando en un "robot de auto equilibrio" con STM32F303RE.Estoy usando STCubeMX para generar el código de configuración de MCU y luego agregué main () para obtener los valores de MPU6050 del siguiente código:

#include "main.h"
#include "stm32f3xx_hal.h"

/* Private variables-----*/
I2C_HandleTypeDef hi2c1;
uint8_t i;
uint8_t i2cBuff[8];
uint16_t ax,ay,az;
float Xaccel,Yaccel,Zaccel;
#define mpu6050Address 0xD0


int main(void)
{
   HAL_Init();
   /* Configure the system clock */
   SystemClock_Config();
   MX_GPIO_Init();
   MX_I2C1_Init();
   /* USER CODE BEGIN 2 */
   for(uint8_t i=0 ; i <255;i++)
   {
       if(HAL_I2C_IsDeviceReady(&hi2c1,i,1 ,10) == HAL_OK )
       {
          HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
          break;
       }
    }


    /* USER CODE END 2 */

    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1)
    {
       i2cBuff[0]= 0x3B;
       HAL_I2C_Master_Transmit(&hi2c1, mpu6050Address, i2cBuff, 1, 10);
       i2cBuff[1] = 0x00;
       HAL_I2C_Master_Receive(&hi2c1, mpu6050Address, &i2cBuff[1], 6, 10);

       ax = -(i2cBuff[1]<<8 | i2cBuff[2]);
       ay = -(i2cBuff[3]<<8 | i2cBuff[4]);
       az = -(i2cBuff[5]<<8 | i2cBuff[6]);

       Xaccel = ax/8192.0;
       Yaccel = ay/8192.0;
       Zaccel = az/8192.0;
      /* USER CODE END WHILE */

      /* USER CODE BEGIN 3 */

      }
      /* USER CODE END 3 */

   }

Pero, cuando agrego las variables ax, ay, az o Xaccel, Yaccel, Zaccel para ver, siempre aparece 0. ¿Cuál puede ser el problema?

    
pregunta Raven

1 respuesta

2

No estoy seguro de si este es su problema, pero las funciones HAL que está utilizando no son las mejores para leer un registro (subdirección) desde un dispositivo. HAL_I2C_Master_Transmit() escribe los datos especificados en el dispositivo y finaliza la transmisión con un bit de parada I2C. Y luego, HAL_I2C_Master_Receive() inicia un nuevo intercambio para leer datos del dispositivo.

Pero la secuencia de lectura I2C recomendada en la página 36 de hoja de datos es diferente de lo que hace tu código. La recomendación es escribir el valor de la dirección de registro y luego enviar un bit Repeat Start (no un Stop) antes de leer los bytes de datos. No puede escribir, repetir-iniciar y leer con HAL_I2C_Master_Transmit() o HAL_I2C_Master_Receive() . Pero puedes hacer esto con HAL_I2C_Mem_Read() .

Intenta reemplazar tus llamadas a HAL_I2C_Master_Transmit() y HAL_I2C_Master_Receive() con esta única llamada:

HAL_I2C_Mem_Read(&hi2c1, mpu6050Address, 0x3B, I2C_MEMADD_SIZE_8BIT, &i2cBuff[1], 6, 10);

No estoy seguro de si esto solucionará su problema porque la forma en que lo está haciendo puede funcionar para muchos dispositivos I2C que recuerdan la subdirección del registro anterior de un intercambio al siguiente. Si puede leer el registro WHO_AM_I del dispositivo correctamente, puede haber otro problema. Por ejemplo, quizás necesite habilitar o configurar el acelerómetro antes de poder leer los valores del acelerómetro.

    
respondido por el kkrambo

Lea otras preguntas en las etiquetas