Go Down

Topic: QRD1114 en Arduino (Read 6 times) previous topic - next topic

madepablo

#15
Aug 23, 2010, 11:39 pm Last Edit: Aug 23, 2010, 11:39 pm by madepablo Reason: 1
Gracias chicos por las ideas que me habéis aportado en este foro y con las que he podido desarrollar mi anemómetro, que llevaba tiempo teniendo en mente:

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1282599142

Espero que encontréis interesante el código y el hardware para vuestras aplicaciones (como la de medir las RPM de motor con la que empezó este hilo).

Muchas gracias de nuevo y suerte!

javilolo

Hola a todos.
He estado liado y no he tenido tiempo de retomar el tema hasta ahora. Os comento.
Acabo de montar el sensor CNY70 con el siguiente programa:


volatile long tachCount = 0;
long time;
long rpm = 0;

void setup()
{
 Serial.begin(115200);
 attachInterrupt(0, tachPulse, RISING);
 time = millis();
}

void loop()
{
 //Runs every 1/4 second
 //if (millis() - time >= 250)
 if (millis() - time >= 1000)
 {
   // rpm = numero de vueltas en 250ms
   //  *4 se multiplica por cuatro para llevarlo a segundos
   //  *60 se multiplica por 60 para llevarlo a minuto
   //  /2 se divide en 2 porque son dos pulsos por cada rotacion (4 cilindros)
   //  /10 (Depende de la aplicacion)
   
   //NOTA: YO OCUPE ESTA RUTINA PARA UN TACOMETRO Y NO FUE NECESARIO DIVIDIR
   //EN 10 PRUEBEN USTEDES PERO YO LES RECOMIENDO NO DIVIDIR EN 10
   
   //rpm = (((tachCount*4)*60)/2)/10;
   detachInterrupt(0);
   rpm = tachCount;
   
   //aqui hacemos lo que queramos (mostramos en lcd, puerto serial, etc)
   //
   Serial.println(rpm);
   tachCount = 0;
   time = millis();
   attachInterrupt(0, tachPulse, RISING);
 }
}

void tachPulse()
{
 ++tachCount;
}


Como vereis he hecho varias pruebas hasta que al final lo único que quería ver es el número de interrupciones generadas al pasar de blanco a negro...el caso es que al leerlas en el COM, me sale un número elevadísimo y aunque genere los pulsos a la misma velocidad, cada lectura me salen datos muy distintos....parece como si se tratase de rebotes en un pulsador pero claro...en este caso no hay pulsador...¿alguna sugerencia?

javilolo

Hola de nuevo.
Después de ver durante la noche algunas webs y andar masticándolo en la cama, he llegado a la solución.
El problema SI eran los rebotes que se producen en la entrada de interrupción del micro (pensaba yo que no....). se ha solucionado poniendo un inversor Schmitt-trigger a la salida del fototransistor junto con un condensador de 100nF. La señal que ataca al micro la tomo directamente de la salida del Schmitt-trigger. Todo esto lo he visto por ahí en webs por lo que no me voy a liar a poner fotos. El programa finalmente es el siguiente:


volatile long tachCount = 0;
long time;
long rpm = 0;

void setup()
{
 Serial.begin(115200);
 attachInterrupt(0, tachPulse, RISING);
 time = millis();
}

void loop()
{
 //Runs every 1/4 second
 if (millis() - time >= 125)
 {
   // rpm = numero de vueltas en 125ms
   //  *8 se multiplica por cuatro para llevarlo a segundos
   //  *60 se multiplica por 60 para llevarlo a minuto
   //  Es un flanco de subida por cada rotación
   
   rpm = tachCount*8*60;

   //aqui hacemos lo que queramos (mostramos en lcd, puerto serial, etc)
   Serial.println(rpm);
   tachCount = 0;    
   time = millis();  
 }  
}

void tachPulse()
{
 ++tachCount;
}


Como veis, actualizo la cuenta cada 1/8 de segundo para que sea mas rápido...aunque no se si luego al montarlo le va a dar tiempo a la pantalla a refrescar a esa velocidad...será cuestión de probar.

*

El microcontrolador lleva un trigger schmitt en cada pin, por lo que no hace falta ponerlo externo, a lo mejor lo que te ayuda es el condensador que has puesto, que actúe como un filtro paso bajo, haz la prueba y quita el trigger a ver si con el condensador sólo se soluciona, puede ser que tengas mucho ruido, o la colocación del sensor, material que has usado para el negro, etc..

Go Up