Estoy empezando a confundirme un poco sobre las tasas de muestreo y las velocidades de transmisión, etc. Tengo este código Arduino:
#include <eHealth.h>
extern volatile unsigned long timer0_overflow_count;
float fanalog0;
int analog0;
unsigned long time;
byte serialByte;
void setup() {
Serial.begin(9600);
}
void loop() {
while (Serial.available()>0){
serialByte=Serial.read();
if (serialByte=='S'){
while(1){
fanalog0=eHealth.getECG();
// Use the timer0 => 1 tick every 4 us
time=(timer0_overflow_count << 8) + TCNT0;
// Microseconds conversion.
time=(time*4);
//Print in a file for simulation
//Serial.print(time);
//Serial.print(" ");
Serial.print(fanalog0,5);
Serial.print("\n");
if (Serial.available()>0){
serialByte=Serial.read();
if (serialByte=='F') break;
}
}
}
}
}
Como no hay interrupción por retraso, ¿cuál es la frecuencia / frecuencia de muestreo? ¿Se basa en la velocidad ADC de Arduino? Cuando aumento la velocidad en baudios, ¿estoy aumentando la frecuencia de muestreo o solo la velocidad a la que envío datos a través del puerto serie?
fuente
También quería obtener una alta frecuencia de muestreo para un proyecto. Resulta que los bits ADPS2, ADPS1, ADPS0 del registro ADCSRA pueden configurarse para obtener una frecuencia de muestreo de 76923 s / so 76.8 ks / s. Pero, tenga en cuenta que estoy ejecutando el ADC de mi arduino en modo de ejecución libre, las siguientes líneas funcionaron para mí.
A esta frecuencia, los resultados habituales de 10 bits no son confiables. Significa que aumentar la frecuencia de muestreo disminuirá la precisión de los resultados. Así que solo uso los 8 bits superiores porque en este preescalar los 8 bits superiores son confiables. Puedes entrar en más detalles en esta página, ¡este tipo es genial! hizo un osciloscopio de alta frecuencia de muestreo utilizando UNO http://www.instructables.com/id/Girino-Fast-Arduino-Oscilloscope/
fuente
Cada ciclo está imprimiendo 8 caracteres sobre un enlace serial de 9600bps. Cada carácter toma 10 bits (1 inicio, 8 bits para el personaje, 1 parada). Eso significa que solo puede pasar por este ciclo ~ 120 veces / seg.
La
analogRead()
función puede muestrear a aproximadamente 9600 veces / seg en teoría, de manera realista es aproximadamente 8600 veces / seg.Usted está siendo limitado por la comunicación en serie.
fuente
Enviando 11 bits en serie a una velocidad de 9600 baudios, pero para el muestreo, lo almaceno en una matriz con el menor retraso posible, luego, una vez hecho, lo envío a través del puerto serie para que lo lea un script de Python. Estoy haciendo esto para una FFT usando matplotlib. Escucho una señal de 0-5 V, luego, sin usar la función delay (), almaceno los valores analogRead () en esa matriz. En una fracción de segundo se realiza la lectura, luego comienza el volcado de datos en serie. Cuando calibré la frecuencia de entrada usando el tono () de otro Arduino conectado, me di cuenta de que tenía que dividir el índice entre 8915 para obtener una precisión dentro de .1 Hz. Debido a que uno tendría que dividir por la frecuencia del muestreo para obtener los intervalos de índice adecuados, supongo que la frecuencia de muestreo de Arduino (al menos la mía con mi código) es 8915Hz.
fuente
Refiriéndose a la parte sobre la diferencia entre la frecuencia de muestreo y la velocidad de transmisión, son mediciones diferentes.
Sample Rate es la frecuencia con la que el dispositivo (arduino) puede recrear una representación digital de valores analógicos entrantes.
La velocidad en baudios es la velocidad a la que se transfiere la información en un canal de comunicación. Describe la velocidad de comunicación entre el microcontrolador y el mundo exterior (la computadora).
Recomendaría este enlace electronics_stack_exchange. /electronics/135056/sampling-rate-data-rate-and-bandwidth
fuente
8915Hz: está muy cerca de 125000/14 ~ = 8928.6 Mi conjetura inicial de que se requiere exactamente un espacio entre las conversiones adyacentes Un reloj ADC para el muestreo y 13 relojes ADC para la conversión misma. Un pequeño error podría ser el efecto de una fuente de reloj no perfecta de Arduino. Aun no estoy seguro. Este tema es real para mí ahora ya que los datos muestreados deben alimentar el filtro digital.
fuente
analogRead()
a un bucle cerrado, frente a un 9615.4 Hz muy consistente en modo de funcionamiento libre.