Estoy haciendo una IMU para 6DOF que tiene un giroscopio digital de 3 ejes L3G4200D.
Revisé tantos blogs, foros, notas de aplicación y programé en consecuencia para obtener la lectura/información adecuada de mi giroscopio.
Aunque estoy muy cerca de resolverlo, ¡un solo problema me ha vuelto loco desde las últimas dos noches! Tengo un dígito de 16 bits - 1 bit firmado + valor de 15 bits
Supongamos que quiero medir un ángulo con respecto al eje X a 2000 dps, para eso estoy haciendo lo siguiente:
while(1)
{
for(g=39;g<42;g++)
{
r = I2CRegRead(I2C0_MASTER_BASE, 0x68, g); // read the reg. no. g
switch (g)
{
case 40:
l = r; // LSB part of X_Gyro
break;
case 41:
h = r; // MSB part of x_Gyro
x = 0;
x = h<<8;
x = x|l;
x = x*70/1000;
UARTprintf("Gyro_X : %5d\n\r",x);
break;
}
}
}
¡Obtengo algunos valores probablemente <800 cuando muevo el giroscopio en la dirección contraria al reloj con respecto al eje X y obtengo> 4000 para la dirección opuesta!
Quiero tener valores de ángulo positivos mientras lo giro en sentido contrario a las agujas del reloj y valores de ángulo negativos para el sentido de las agujas del reloj... Para eso, ¿qué debo agregar en mis cálculos? [Los ángulos deben estar en grados 1 a 180 y (-1) a (-180)]
// en el código 0.007 está en mdps que es el valor de cada LSB de los datos del giroscopio
¿Qué debo agregar y por qué tengo valores> 4000 y <800 en este momento?
¿Alguien podría ayudarme con esto?
Muchas gracias por su valioso tiempo.
Primero, podría usar algo como esto para convertir su valor en un entero con signo adecuado:
uint8_t xl = ...;
uint8_t xh = ...;
int16_t x = *(int8_t *)(&xh);
x *= (1 << 8);
x |= xl;
Pero x es solo un valor en grados por segundo. Para obtener su orientación actual como ángulo, debe integrar este valor a lo largo del tiempo, lo que agregará mucha deriva. Para compensar esto, puede filtrarlo con datos del acelerómetro (¡PDF!) .
Anindo Ghosh
Jigar4Electrónica