Go Down

Topic: Aumentar la frecuencia de muestreo (Solucionado) (Read 26 times) previous topic - next topic

CesarCarlos

Aug 09, 2011, 04:10 am Last Edit: Aug 19, 2011, 12:14 am by CesarCarlos Reason: 1
Hola, soy muy nuevo en el manejo de esta increíble herramienta soy docente, he armado una barrera óptica con un viejo mouse para ser usada en un trabajo práctico de física, que consiste en calcular la velocidad de una flecha lanzada con una ballesta, lo he logrado a medias http://anajesusa.wordpress.com/2011/07/16/midiendo-la-velocidad-de-una-flecha-con-un-mouse-viejo-y-el-arduino/
Quisiera que algún experimentado me oriente para que la velocidad de muestreo sea mayor, he logrado medir hasta 2 milisegundos lo que me parece mucho, en caso de querer usar el mismo dispositivo para medir la velocidad de un balín de rifle de aire comprimido por ejemplo.
El código que usé es este:
Seguramente para Uds esto será muy rústico y con errores sepan por favor disimular
/*
Barrera de luz
*/
// to the pins used:
const int analogInPin = A0; // acá entra el cable que viene del fototransistor
int sensorValue = 0; //
//int outputValue = 0; //
unsigned long time;
void setup() {
Serial.begin(115200);
}
void loop() {
// read the analog in value:
sensorValue = analogRead(analogInPin);
// print the results to the serial monitor:
//Serial.print("Time: ");
time = millis();
Serial.print(time);
Serial.print(" ");
Serial.println(sensorValue);
}
Saludos
César

Esog Enaug

Yo usaria una interrupcion: se activa cuando sucede algo.

En mi blog (en mi firma) tienes un ejemplo de algo similar, pues busco detectar un paso por meta.
La electrónica y el slot (o esos cochecitos)
http://www.juanjofrancia.es/arduslot

ionhs

Yo el problema que veo es que menos que 2 milisegundos me resulta difícil teniendo en cuenta que la ejecución de las instrucciones necesita su tiempo. En el arduino no se cuanto tiempo necesita en ejecutar cada instrucción (tal vez salga en el datasheet), pero si es 1 milisegundo piensa que en tu bucle hay 5 instrucciones, asi que ejecutarlas te está comiendo el tiempo.

Igor R

#3
Aug 09, 2011, 09:20 am Last Edit: Aug 09, 2011, 11:15 am by Igor R Reason: 1
Hola,

Para algo tan concreto, lo mejor es que te mires cómo esta programada la función analogRead() de Arduino (Wiring). La conversión creo que dura unos 13 ciclos (25 si es la primera vez), por lo que tienes que mirar a cuanto han configurado el prescaler del módulo ADC. Lo mejor es tirar del datasheet del micro + ojear la función. Si bajas la resolución del ADC, puedes aumentar bastante la velocidad.

Puedes ojear http://interface.khm.de/index.php/lab/experiments/arduino-realtime-audio-processing/, que estan haciendo tratamiento de sonido a tiempo real. Muestrean a 15 kHz.

Por otro lado, usando sensores de barrera (salida digital) e interrupciones, para el tipo de aplicación que quieres, creo que será  mucho mejor que algo analógico.


Saludos


Igor R.

SrDonGato

yo lo haría con interrupciones, y que la función de interrupción sea que almacene la variable millis() en un array o variable, estamos hablando de que el reloj va a 16 Mhz o 20 mhz, 2 mseg a esta velocidad me parece muchísimo, si lo haces como te digo la función de la interrupción no gastara mucho tiempo ( en ensamblador seria un MOV de un registro a otro )

yo utilizaría entradas digitales, las analógicas tardan mucho en hacer la conversión , además como ya he comentado en otros post las entradas analógicas están multiplexadas, solo hay un conversor analógico, cuantas mas entradas analógicas se utilicen menor será la frecuencia que puedas utilizar. además al no ser el mismo tiempo de conversión de una vez que otra ( depende del nivel de la señal) tampoco puede calcular con exactitud la diferencia de tiempos entre una señal y otra.

yo utilizaria 2 interrupciones
1º que almacene el valor de millis() en variablesensor1
2ª que almacene el valor de millis() en variablesensor2

y por display o serie o como quieras que muestre el calculo de (espacio entre sensores)/(variablesensor2-variablesensor1)

quizás se me escape algo ...

Un saludo ¡




Go Up