Bueno, estoy usando estas vacaciones en Brasil para mejorar mis habilidades en C. Aprendí a usar I2C y cómo comunicarme con el MPU9255 (con la ayuda de esta pregunta). El último problema al que me enfrento es que el sensor está devolviendo valores incorrectos. El valor devuelto es flotante de 0 a 65000, pero no es lineal.
Creo que se debe a que 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);
Actualizar:
Solo noté una cosa: de 0 a 16768, las medidas del sensor son correctas, pero cuando invierto 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.
El MPU-9255 le proporciona 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 signo representa -32768 a +32767.
Aquí hay un ejemplo de 8 bits de Wikipedia :
Para hacer la conversión, primero mire el bit alto. Si esto es , entonces no es necesaria ninguna conversión. Si esto es , entonces , dónde es el número de bits. Dieciséis, en su caso.
Aquí hay un método simple para 16 bits:
uint16_t unsignedAccelX;
int16_t signedAccelX;
if (unsignedAccelX < 32768)
{
signedAccelX = unsignedAccelX;
}
else
{
signedAccelX = unsignedAccelX - 65536;
}
Hay muchas formas más elegantes y/o eficientes de hacer esto. Aquí hay algo de discusión .
¡Buena suerte!
usuario103380
Vinícius Jean Ferreira
tyler
tyler
Vinícius Jean Ferreira
Vinícius Jean Ferreira
Bence Kaulics
AccelX
?