¿Cómo interpretar los valores enviados por un MPU-9255?

2

Bueno, estoy usando estas vacaciones en Brasil para mejorar mis habilidades en C. He aprendido cómo usar I2C y cómo comunicarme con el MPU9255 (con la ayuda de esta pregunta). El último problema que estoy enfrentando es que el sensor está devolviendo valores incorrectos. El valor devuelto está flotando de 0 a 65000, pero no es lineal.

Creo que es porque estoy confundiendo los tipos de datos o la combinación de bytes en mi código. ¿Puede alguien ayudarme a revisar mi código?

    uint8_t Test[] = "\n AccelX: \n";
    HAL_UART_Transmit(&huart1,Test,sizeof(Test),100);

    //SET X_HIGH REGISTER ADDRESS 
    i2cData = 0x3B;
    HAL_I2C_Master_Transmit(&hi2c1, adressMPU, &i2cData, 1, 100);

    //REQUEST 6 BYTES OF DATA (ACCEL X, Y AND Z)
    HAL_I2C_Master_Receive(&hi2c1, adressMPU, receive_buffer, 6, 100); 

    AccelX = (char)receive_buffer[0]<<8 | (char)receive_buffer[1];
    AccelY = (char)receive_buffer[2]<<8 | (char)receive_buffer[3];
    AccelZ = (char)receive_buffer[4]<<8 | (char)receive_buffer[5];

    //PRINTA NA SERIAL 1
    len = sprintf(buffer, " %i\r\n", AccelX); //sprintf will return the length of 'buffer'  
    HAL_UART_Transmit(&huart1, (uint8_t *)buffer, len, 1000);  

    HAL_Delay(500); 

Actualización:

Acabo de notar una cosa: de 0 a 16768, las mediciones del sensor son correctas, pero cuando subo el eje, el sensor pasa de 65536 a ~ 49000 cuando debería ser de 0 a -16768. Seguramente es un error de conversión, pero todavía no puedo ver dónde está exactamente el error.

    

1 respuesta

1

El MPU-9255 le brinda un entero con signo de 16 bits. Su código lo interpreta como sin firmar.

Un número de 16 bits sin signo puede representar valores de 0 a 65535. Un número de 16 bits con firma representa de -32768 a +32767.

Aquí hay un ejemplo de 8 bits de Wikipedia :

Parahacerlaconversión,primeroobservaelbitalto.Sies\$0\$,entoncesnoesnecesarianingunaconversión.Sies\$1\$,entonces\$signed=(unsigned-2^N)\$,donde\$N\$eselnúmerodebits.Dieciséis,entucaso.

Aquíhayunmétodosimplepara16bits:

uint16_tunsignedAccelX;int16_tsignedAccelX;if(unsignedAccelX<32768){signedAccelX=unsignedAccelX;}else{signedAccelX=unsignedAccelX-65536;}

Haymuchasformasmáselegantesy/oeficientesdehaceresto.Hayunadiscusión aquí .

¡Buena suerte!

    
respondido por el bitsmack

Lea otras preguntas en las etiquetas