Go Down

Topic: Velocidad de muestreo UNO vs DUE (Read 3411 times) previous topic - next topic

griphusff8

Aug 07, 2014, 11:24 am Last Edit: Apr 09, 2017, 08:19 pm by surbyte Reason: Códigoi sin etiqueta
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:

Code: [Select]
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.

griphusff8

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.

Code: [Select]
#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.

perrociego

#2
Aug 09, 2014, 07:50 am Last Edit: Apr 09, 2017, 08:21 pm by surbyte Reason: Código sin etiqueta. Link sin etiqueta
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

Code: [Select]
 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

griphusff8

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.

Stop_Me

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 :)

surbyte

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.

Go Up