Desenvolviendo medidas desde el acelerómetro Adxl345

3

Estoy intentando leer los valores de aceleración de un ADXL345 a través de I2C. He configurado con éxito el acelerómetro con una resolución de 16G.

Prueba 1 : rotación de 180 ° a lo largo del eje y en resolución 16G. La aceleración a lo largo del eje Z se muestra a continuación:

Usandounaconfiguraciónde16g,laresoluciónesdemasiadobaja.Locambiéa2gparaobtenerunvalordegravedadmásprecisoyrealicélamismaprueba.

Prueba2:rotaciónde180°alolargodelejeyenresolución2G.LaaceleraciónalolargodelejeZsemuestraacontinuación:

Comopuedever,esunefectodereinversiónprobablementecausadoporlacantidaddebitsutilizadosenelregistroparaguardarelvalor.Conelmodo16g,elmóduloutilizaunregistrode13bits,conelmodo2/4/8gutilizaunregistrode10bits.

¿Quéenfoquesugiereparareconstruirelvalordeaceleración?

En esta pregunta @davidcary mencionó el efecto de renovación.

EDIT

Estoy leyendo dos bytes, es el mismo código que usé para el modo 16g

def read_word(self,adr):
     high = self.bus.read_byte_data(self.address, adr)
     low = self.bus.read_byte_data(self.address, adr+1)
     val = (high << 8) + low
     return val

def read_word_2c(self,adr):
     val = self.read_word(adr)
    if (val >= 0x8000):
       return -((65535 - val) + 1)
    else:
       return val
[...]

accel_zout = adx.read_word_2c(0x36)

Aquí hay una captura de pantalla de los registros que contienen los valores de Zaxis

Nota

Aquíhayotroproblema,abriréotrapreguntaparaesto,perovalelapenaseñalarelsiguienteproblema.Porfavor,enfóquesesoloenelejeZ

Prueba:inclinede0°a180°yvuelvaa0°dosveces,luegode0°a-180°yvuelvaa0°.

Figura1:datossinprocesar

Comopuedever,elcambionoescostoso.Elcambiopromedioesdealrededorde58.000,peroavecesesmáspequeñoqueesto.Siaplicamoslamismacorrecciónatodaslasocurrenciasdeshify,terminaremosconesto:

Figura2:datosnoenvueltos

Si el umbral después del cual se debe aplicar la corrección no se define correctamente, los datos resultantes no serán precisos. En Figura 2 , la aceleración a lo largo del eje Z después de la prueba es diferente del valor inicial de cero, lo que significa un desastre ...

    
pregunta UserK

1 respuesta

3

La reconstrucción que está buscando se llama desenvolver . Implementé esto en C ++ con buenos resultados el año pasado al medir la revolución total de una rueda de automóvil. En matlab: enlace

Q = unwrap(P,tol)

El "vuelco" observado (en realidad, un ajuste ) no se debe al desbordamiento del registro, sino al cambio de señal de la aceleración de la gravedad medida. La tolerancia tol debe ser la mitad de la amplitud pico a pico observada.

En C, sería algo como esto (no he probado esto, pero la idea está aquí):

void unwrap(int *P, int tol, int len)
{
    for (int index = 1; index < len; index++)
    {
        // Upwards wrapping
        while (P[index-1] - P[index] > tol)
        {
            P[index] += 2*tol;
        }
        // Downwards wrapping
        while (P[index] - P[index-1] > tol)
        {
            P[index] -= 2*tol;
        }
    }
}
    
respondido por el Vicente Cunha

Lea otras preguntas en las etiquetas