Sensor giroscópico L3G4200D - ¿Ángulo de medición?

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.

Agregue su código real (cópielo y péguelo) a la pregunta.
ok, lo he editado.

Respuestas (1)

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!) .

Muchas gracias por esto... He editado como sugieres... Ahora obtengo valores positivos en el sentido contrario a las agujas del reloj y negativos en el sentido de las agujas del reloj... Pero, sorprendentemente, estoy en el rango de +/- 8500 No constantemente ¡pero a una mayor tasa de cambio de ángulo muestra el pico de 8000! y con batido normal es +/- 3000!! en condiciones ideales, obtengo alrededor de 40-50, estoy usando 2000 dps... Lo he comprobado en 250 dps, muestra poco ruido y una mejor estabilidad allí...
¿Puede decirme qué debo hacer para obtener los ángulos ahora? debo tomar x1 en el tiempo t1 y x2 en el tiempo t2 y luego: X_angle = (x2-x1)/(t2-t1) ¿Estoy en lo cierto?
¡una pregunta más! ¿Puedo saber cómo se ejecutará esta ecuación? x = *(int8_t *)(&h);
Para obtener el ángulo, debe integrar su lectura a lo largo del tiempo. Porque la integración de la velocidad es la posición. para hacer esto, simplemente puede sumar sus medidas y al final dividir por el factor correcto. Y sí, tienes que leer continuamente tu sensor y a gran velocidad. Depende de usted definir qué significa alta velocidad. Depende de la aceleración angular máxima posible para su sistema.