Frecuencia de datos de salida (ODR) del giroscopio frente a la frecuencia del ciclo del programa (L3G4200D, Arduino)?

0

Configuro un giroscopio L3G4200D con una velocidad de datos de salida de 100 Hz y un programa lee los valores sin procesar de los registros (eje X, Y, Z) cada 5 ms.

Pero si el programa se ejecuta a 200 Hz (es decir, se repite cada 5 ms) y el giroscopio emite nuevos valores a 100 Hz, entonces significa que el programa (siempre) lee los mismos valores cada 2 programas bucles?

    
pregunta tozheneznayu

2 respuestas

0

Dejé FIFO deshabilitado por defecto. Evité la interferencia de 'Serial.print' con cada ciclo individual concatenando 8 valores en una cadena durante 8 ciclos y luego imprimí la cadena una vez después de 8 ciclos (sacrificando un tiempo de ciclo).

k = 1;

void loop()
{

 //get values from L3G4200D, e.g. RawX

 output += k;
 output += ": ";
 output += RawX;
 output += ", ";
 k++;

 if (k == 9)
   {
    Serial.println(output);
    output = "";
    k = 1;
   }

 //trim cycle time to 5 ms
}

El resultado (una prueba visual que estaba buscando) se puede ver de la siguiente manera:

1: -14.10 , 2: -14.10 , 3: -7.10 , 4: -7.10 , 5: -7.10 , 6: -11.10 , 7: -11.10 , 8: 14.90 , 1: 14.90 , 2: -15.10 , 3: -15.10 , 4: -22.10 , 5: -22.10 , 6: -11.10 , 7: -8.10 , 8: -8.10 , 1: -4.10 , 2: -4.10 , 3: 7.90 , 4: 7.90 , 5: -8.10 , 6: -8.10 , 7: -33.10 , 8: -33.10 , ...

El aumento de la frecuencia del bucle a 400 Hz (es decir, 2,5 ms) le da a la mayor parte del tiempo 4 valores idénticos en una fila. A veces también ves grupos de 2 o 3 idénticos en el medio. Este "desincronización" quizás se pueda corregir trabajando con registros FIFO, como lo señala ammar.cma.

Espero que ayude a otros a usar este giroscopio específico.

    
respondido por el tozheneznayu
0

Una mirada a la hoja de datos sugiere que tiene suficiente munición para cumplir con su propósito.

El enfoque para sincronizar los datos del sensor y el circuito del controlador es: cada vez que los datos están listos en el registro del sensor, genera un evento / interrupción en un pin. Esto notifica al controlador para recoger los datos.

Para resolver su problema:

Pruebe este primer enfoque: no estoy seguro de si esto funcionará. La hoja de datos no menciona en ninguna parte sobre este bit DRDY en detalle. Pero dale una oportunidad.

Habilite / establezca el bit I2_DRDY en CTRL_REG3 y conecte el pin DRDY físico al pin 2 o 3 en arudino uno.

void setup{
attachInterrupt(0,data_pickup,RISING); /* Assuming the DRDY Pin generates a rising edge when data is ready, if it generates falling edge, put falling*/
}


void loop(){
do nothing
/*For example */
if(flag==1){SPI.begin();
SPI.write(yyy);
SPI.end();

}


void data_pickup(){ 
/*initiate a SPI/I2C transcation here and pickup data into your program now.
I prefer to put a flag variable here and set it to true and do other things in loop*/ For example
flag=1;
}

Ahora vamos a un segundo enfoque que le ahorrará tiempo a arduino para hacer otras cosas mientras los datos se están colocando en FIFO interno, es como esto

Configure los registros FIFO para habilitar. Establezca un umbral FIFO y use la interrupción nuevamente para comenzar a leer. Pero esta vez, tienes que leer 31 muestras en una lectura de ráfaga. Aún necesita conectar el pin DRDY a arduino y usar el código de interrupción como se indica arriba.

Habilite el bit I2_WTM en CTRL_REG3 para el nivel FIFO de marca de agua

Habilita FIFO_EN en CTRL_REG5 para que FIFO se habilite.

Establezca FIFO_CTRL_REG en 01011111 Esto pondrá a FIFO en modo de flujo y tiene un umbral FIFO establecido en 31 muestras. Puede jugar con la cantidad de muestras que desee estableciendo 5 bits más bajos.

El enfoque del código anterior seguirá siendo el mismo, excepto que ahora necesita hacer una lectura de ráfaga para 31 muestras.

Le sugeriría que intente el primer enfoque inicialmente, ya que asegurará que, siempre que las muestras ADC, generarán la interrupción y usted recogerá los datos.

el último enfoque es cuando desea ahorrar energía y optimizar el sistema.

Para saber más acerca de las interrupciones: busque la documentación de Arduino y aprenda sobre ella. Buscalo en Google.

    
respondido por el ammar.cma

Lea otras preguntas en las etiquetas