Acelerómetro de muestreo Arduino

3

Tengo un acelerómetro analógico que quiero muestrear a 100 Hz, también quiero trazar los datos con el tiempo de cada muestra para tener una aceleración en el tiempo. Para hacer un seguimiento del tiempo, iba a usar millis (). Para muestrear a 100 Hz puedo usar un temporizador, pero AnalogRead () tiene sobrecarga y me preguntaba cómo muestrear a 100 Hz la corrección de la sobrecarga de AnalogRead () ???

También el envío de datos a través de la serie tiene una sobrecarga, no estoy seguro de cómo compensar esto, quiero obtener una aceleración a lo largo del tiempo que sea al menos algo precisa si es posible. No tengo el dinero ahora mismo para un chip RTC

    
pregunta zacharoni16

3 respuestas

2

Puede enviar transmisión aproximadamente 11 bytes por milisegundo a 115200 baudios. Entonces, siempre que restrinja su salida a 10 caracteres y una nueva línea por muestra, eso debería estar bien.

La matemática subyacente es 115200 baudios significa 115200 bit-times / second, y hay 10 bit-times por byte transmitidos en el UART (bit de inicio, 8 bits de datos y bit de parada). Por lo tanto, 115200/10 = 11520 bytes / segundo = 11.520 bytes / milisegundos (y redondeo hacia abajo).

En resumen, el muestreo a 100Hz debería ser fácil.

El enfoque canónico de la sincronización de intervalos se muestra en el ejemplo de BlinkWithoutDelay Arduino. Consolidado se parece a lo siguiente:

long previousMillis = 0;
long interval = 10; // interval in milliseconds (10ms => 100Hz)

void setup() {
   // whatever
   Serial.begin(115200);
   Serial.println("Hello World");
}

void loop(){
   unsigned long currentMillis = millis();
   if(currentMillis - previousMillis > interval) {
      previousMillis = currentMillis;

      // do your task
      Serial.println(analogRead(0));
   }
}
    
respondido por el vicatcu
1

de Arduino: millis (): devuelve el número de milisegundos desde que la placa Arduino comenzó a ejecutar el programa actual. Este número se desbordará (volverá a cero) después de aproximadamente 50 días.

es una representación convertida del contador del programa, que se sigue ejecutando, independientemente. No debe confundirse con delay () y delayMicroseconds (), que son básicamente nops calculados. Su uso entre muestras tendría retrasos y un sesgo cada vez mayor.

Así que usando

if ((millis() - lastTime) > _Delay) {
  lastTime = millis();
  blah... 
}

no se desviaría. Del mismo modo, hay una biblioteca enlace que hará lo mismo. pero en un formato de biblioteca y servicio más típico, que uso.

Donde ambos de estos tendrán un poco de jitter, no sesgado, de otras interrupciones y otras cosas que suceden. Dicho esto, el uso de la interrupción Timer1 para generar los 100Hz debería reducir el jitter lo mejor posible. Como se muestra en enlace

    
respondido por el mpflaga
1

El tiempo de lectura analógica es del orden de 10 microsegundos con la mayoría de los ajustes de selección de reloj, no hay que preocuparse. La serie es similar a lo que dice vicatu: 11 bytes en un milisegundo. Tiene diez milisegundos para hacer todo su trabajo y los retrasos no deberían sumar más de un milisegundo, no debería haber ningún problema. Solo implementa la verificación de tiempo como se mostró en su publicación y deberías estar bien.

    
respondido por el AngryEE

Lea otras preguntas en las etiquetas