L3G4200D Sensor de giro - ¿Ángulo de medición?

4

Estoy haciendo una IMU para 6DOF que tiene un giroscopio digital de 3 ejes L3G4200D.

He comprobado tantos blogs, foros, notas de aplicaciones y he programado en consecuencia para obtener la lectura / información adecuada de mi giro.

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 con signo + 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;
                }
         }
}

Probablemente obtengo algunos valores de < 800 cuando muevo el giro en la dirección contraria del reloj con respecto al eje X y obtengo > 4000 para la dirección opuesta.

Quiero tener valores de ángulos positivos mientras los giro en sentido contrario a las agujas del reloj y valores de ángulos negativos en sentido de las agujas del reloj ... ¿Por lo que debo agregar en mis cálculos? [Los ángulos deben estar en grados 1 a 180 y amp; (-1) a (-180)]

// en el código 0.007 está en mdps, que es el valor de cada LSB de los datos de gyro

Lo que debería agregar podría y por qué tengo > 4000 & < 800 valores en este momento?

¿Podría alguien ayudarme con esto?

Muchas gracias por su valioso tiempo.

    

1 respuesta

1

Primero, puedes usar algo como esto para obtener tu valor en un entero con signo correcto:

uint8_t xl = ...;
uint8_t xh = ...;
int16_t x = *(int8_t *)(&xh);
x *= (1 << 8);
x |= xl;

Pero x es solo un valor en Grado por segundo. Para obtener su orientación actual como ángulo, debe integrar este valor a lo largo del tiempo, lo que agregará mucha desviación. Para compensar esto, puede filtrarlo con datos del acelerómetro (¡PDF!) .

    
respondido por el xythobuz

Lea otras preguntas en las etiquetas