Velocidad de muestreo UNO vs DUE

Benas a todos,

Estoy empezando a utilizar placas arduino y me han surgido algunas dudas. Quiero obtener datos de un sensor de ultrasonidos MA300D1-1. Con ello tengo el objetivo de crear un anemometro ultrasonico. Para ello quiero obtener medidas de este sensor en el rango de los microsegundos.

Para comenzar he realizando un sketch sencillito para conocer la velocidad de muestreo con las placas UNO y DUE:

const int Pin = A0;
int sensorValue = 0;
unsigned long tiempo;

void setup() {
 Serial.begin(9600);
}

void loop() {

 // read the analog in value:
 sensorValue = analogRead(Pin);

 // print the results to the serial monitor:
 tiempo = micros();
 Serial.print(tiempo);
 Serial.print(" ");
 Serial.println(sensorValue);
}

Y los resultados son los siguientes: UNO: 264 1023 768 1023 1264 1023 1808 1023 2352 1023 2896 1023 3440 1023 3984 1023 14056 1023 25496 1023 36936 1023 48376 1023 59816 1023 71256 1023 82696 1023 94144 1023

DUE: 2045 1023 10535 1023 21975 1023 33415 1023 44855 1023 56295 1023 67735 1023 79175 1023 90615 1023 102055 1023

En teoria la placa DUE me deberia dar datos mas rapido. Como puedo solucionar esto?

Gracias.

Bueno, pues me voy a responder a mi mismo.

Despues de dos días ya se lo que relentizaba tanto, era la comunicación serial. He creado otro sketch, en este, recojo en una array varias lecturas y mando la array por comunicación serial. Antes lo que hacia era mandar cada medida.

#define mysize 20

unsigned long tStart;
unsigned long tEnd;
byte data[mysize];
//byte time[mysize];
const int Pin = A0;

void setup() {
Serial.begin(115200);
} 

void loop() {
  tStart=micros();
  for (int i=0; i<mysize;i++){
     data[i]=analogRead(Pin);
     //time[i]=micros();
  }
  tEnd=micros();
  
  Serial.println();
  Serial.println("NEW ACQUISITION");
  Serial.print("tStart=");
  Serial.println(tStart);
  Serial.print("tEnd=");
  Serial.println(tEnd);
  Serial.print("tEnd-tStart=");
  Serial.println(tEnd-tStart);  
  Serial.print("nPoints=");
  Serial.println(mysize);
  
  for (int i=0; i<mysize;i++){
    //Serial.print(time[i],DEC);
    //Serial.print("  ");
    Serial.println(data[i],DEC); 
  }
  delayMicroseconds(10);
}

Y el resultado que me da con la placa DUE es este:

NEW ACQUISITION
tStart=2551458
tEnd=2551528
tEnd-tStart=70
nPoints=20
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023

Y este el resultado que me da con la placa UNO:

NEW ACQUISITION
tStart=11440
tEnd=13688
tEnd-tStart=2248
nPoints=20
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023
1023

Aún asi alguien se le ocurre como aumentar mas la velocidad de muestreo de la placa DUE?

Gracias.

Hola griphusff8:

Con el DUE se puede llegar a 1 micro segundo por muestra. Y con el UNO no me acuerdo bien, creo que 11 micro segundos por muestra.

A esos valores se acerca tocando los parametros del micro, o sea poniendo un poco de código maquina sobre el Arduino.

En UNO hay que poner esto una sola vez antes del AnalogRead

 ADCSRA &= B11111000;                      // blanqueo el multiplicador de la funcion ADC (analog digital converter)
 ADCSRA |= B011;                                  // pongo el multiplicador (preescaler 08, 2 MHz  12 us x medicion)

El aumento de frecuencia de lectura es a expensas de la calidad de medición.

En DUE es un poco mas complejo llegar a la frecuencia de muestreo de 1 MHz

Fijate aca http://forum.arduino.cc/index.php?PHPSESSID=jkra1uvdoh265mbuua84t8p1i6&topic=224664.0

Y se llega si estas midiendo con una sola entrada.

Vos estas llegando a 7 microsegundos por muestra, me parece mucho, debería ser al menos la mitad. ¿Porque no probas medir mas valores, unos 2000?

Saludos

Hola Perrociego,

Gracias por la ayuda. Para aclararlo bien en las caracteristicas de los ADC pone que el DUE tiene 1000 ksps y el UNO 15ksps. Por lo que corresponden a 1us por muestra y 67us por muestra.

Con el DUE estoy consiguiendo 3,5us por muestra: 70us/20muestras=3,5 Con mas muestra ya habia probado y me sigue dando la misma velocidad.

Voy a hecharle un ojo a los links que me pasaste.

Muchas gracias.

Y si alguien puede iluminarlos se agradecera.

Hola soy nuevo en arduino. Quiero tomar 42 muestras de un sensor cada 396,825[micro-segundos] y no se como hacerlo me ¿ayudan? gracias :)

Stop_Me no debes responder hilos de mas de 120 días a menos que seas uno de los interlocutores del hilo. Asi que crea un hilo con tu consulta y se paciente para esperar la respuesta Hilo cerrado.