Arduino Forum

International => Español => Software => Topic started by: Metaconta on Oct 10, 2015, 05:37 am

Title: Entender este código control RPM motor
Post by: Metaconta on Oct 10, 2015, 05:37 am
Hola mi muy distinguidos amig@s:

Aquí abajo un código que mira las RPM de un ventilador y que tiene el cable amarillo. Si se fijan en el vídeo de abajo tiene una resistencia en el cable amarillo.

1. ¿Realmente hace falta esa resistencia?

2. ¿No es mejor poner el cable amarillo directamente a Arduino? (Juraría que el cable amarillo suelta pulsos por cada vueltas o dos vueltas cuando el ventilador de 12V está funcionando).



Este es el código de ver las RPM del ventilador.
Code: [Select]
int NbTopsFan;
int Calc;

int hallsensor = 2;

                        
typedef struct{              
  char fantype;
  unsigned int fandiv;
}fanspec;

//Definitions of the fans
fanspec fanspace[3]={{0,1},{1,2},{2,8}};

char fan = 1;  

void rpm ()    
{
 NbTopsFan++;
}

 
void setup()
{
 pinMode(hallsensor, INPUT);
 Serial.begin(9600);
 attachInterrupt(0, rpm, RISING);
}
void loop ()
{
   NbTopsFan = 0;  
   sei();  
   delay (1000);  
   cli();
   Calc = ((NbTopsFan * 60)/fanspace[fan].fandiv);
   Serial.print (Calc, DEC);
   Serial.print (" rpm\r\n");
}



El código que menos entiendo es este:
Code: [Select]

//Definitions of the fans
fanspec fanspace[3]={{0,1},{1,2},{2,8}};



3. ¿Para qué es este código y que funciones hace?

Ver vídeo.
https://www.youtube.com/watch?v=0wg3va_KOWk (https://www.youtube.com/watch?v=0wg3va_KOWk)

Un cordial saludo.
Title: Re: Entender este código control RPM motor
Post by: _jose_ on Oct 10, 2015, 11:03 am
Diria que la resistencia es para limitar el voltaje ,si el ventilador esta alimentado a 12v por logica la señal que envia por el cable amarillo tambien deberia ser de 12v con el consiguiente peligro de cascar la entrada del arduino.en cuanto al codigo parece que define una estructura de datos para varios tipos de ventiladores segun los sensores hall que lleven .en este caso parece que lleva dos,por eso usa el segundo elemento del array de la variable fanspace que es del tipo fanspec (definida por struct).luego usa una interrupcion para captar las señales y calcular las revoluciones.
Title: Re: Entender este código control RPM motor
Post by: Metaconta on Oct 12, 2015, 06:07 am
Hola:

Sería raro lo de la resistencia, ya que suelen proporcionar el cable amarillo del tacómetro 5 V por cada vuelta o cada dos vueltas depende  del ventilador.

Aún no entiendo exactamente el array que comenté arriba, esos números. Dijiste tipo de ventilador. Si, ¿Y?

Mirando más el código está    cli(); y sei();. ¿Qué son?

Saludos.
Title: Re: Entender este código control RPM motor
Post by: noter on Oct 12, 2015, 10:47 am
Hola.
No tiene mucha lógica la definición de esa estructura, ni ese array, pues no está utilizando prácticamente nada de los mismos. Tan sólo define un parámetro útil, que es el número de pulsos por vuelta (dos para tipo fan=1). Para eso, sencillamente con definir directamente ese número valdría:
Code: [Select]

static int NbTopsFan; // contador de impulsos.
const int fandiv = 2; // dos pulsos por vuelta
const int hallsensor = 2; // pin 2, que está unido a interrupción 0.

void rpm ()     // se llamará cada vez que se pruduce la interrupción
{
 NbTopsFan++;
}

 
void setup()
{
 pinMode(hallsensor, INPUT);
 Serial.begin(9600);
 attachInterrupt(0, rpm, RISING);
}
void loop ()
{
   NbTopsFan = 0;
   sei();   
   delay (1000); 
   cli();
   int Calc = ((NbTopsFan * 60)/fandiv);
   Serial.print (Calc, DEC);
   Serial.print (" rpm\r\n");
}


En cuanto a sei y cli, lo que hacen respectivamente es activar / desactivar las interrupciones. Entonces, establecemos las interrupciones, hacemos un delay de un segundo y desactivamos las interrupciones. Es decir, mientras dura ese delay, cada vez que se produce una interrupción por un tick, se ejecuta rpm(), que suma un pulso. Cuando termina el delay se desactivan las interrupciones para que no siga contando, y se hace el cálculo con los impulsos que hemos contado.
Title: Re: Entender este código control RPM motor
Post by: _jose_ on Oct 12, 2015, 11:12 am
Hola:

Sería raro lo de la resistencia, ya que suelen proporcionar el cable amarillo del tacómetro 5 V por cada vuelta o cada dos vueltas depende  del ventilador.

Aún no entiendo exactamente el array que comenté arriba, esos números. Dijiste tipo de ventilador. Si, ¿Y?

Mirando más el código está    cli(); y sei();. ¿Qué son?

Saludos.
Una estructura es un conjunto de variables agrupadas en un mismo nombre a las que se accede por la notacion de punto ,como en las propiedades o metodos de los objetos.se define una estructura llamada fanspec ,que como veras ,esta compuesta por dos vaiables ,una tipo char llamada fantype  y otra tipo unsigned int llamada fandiv.para usar esta estructura ,se define una variable que es de tipo fanspec ,en este caso la llama fanspace ,esta variable,recuerda que tiene dos elementos y accederiamos a ellos por notacion de punto,con fanspace.fantype accedemos a la variable char y con fanspace.fandiv a la unsigned int ,es decir cada variable tiene a su vez dos valores.pero ademas se puede crear un array de este tipo ,como es el caso .si creamos un array de tres variables del tipo fanspec tendremos en total 2*3 = 6 elementos,que son los que ves entre llaves.como dice noter en este caso es del todo inutil.en cuanto al tipo de ventilador ,lo que dije exactamente es tipo de ventilador segun sensores ,porque me imagino que habra ventiladores de 2 ,4 o 8 sensores,no lo se.en cuanto a la resistencia no se me ocurre otro motivo que el comentado,pero a ver si alguien mas puesto en electronica nos alumbra.
Title: Re: Entender este código control RPM motor
Post by: Metaconta on Oct 12, 2015, 12:29 pm
Buenas:

Si alguien sabe hacer un pequeño código más simplificado, menos engorroso y ameno, mejor que mejor. No digo optimizado ya que si hay que actualizarlo, se complica.

Voy a coger un ventilador con tacómetro que tengo y me pongo hacer pruebas, si funciona, subo un vídeo.

Muchas gracias por las explicaciones, ahora lo pillo mejor.


Edito:
Buscando más información he encontrado estas cosas.
attachInterrupt (https://www.arduino.cc/en/Reference/AttachInterrupt)

http://www.prometec.net/interrupciones/ (http://www.prometec.net/interrupciones/)


https://www.youtube.com/watch?v=lgttxSregzM (https://www.youtube.com/watch?v=lgttxSregzM)

Por lo que veo en las LCD no cuenta los RPM en tiempo real, sino que cada cierto tiempo te lo muestra de forma lenta como algo más d eun segundo.
Title: Re: Entender este código control RPM motor
Post by: noter on Oct 12, 2015, 01:57 pm
Si has visto el código que he puesto yo, creo que poco más se puede simplificar.
Title: Re: Entender este código control RPM motor
Post by: Metaconta on Oct 12, 2015, 02:09 pm
¡¡¡Dios mio, se me pasó!!!

Gracias por el código, lo has hasta explicado con líneas de textos. Voy a probarlo con ansias, antes a ver si realmente da pulso de 5 V el tacómetro.

Esta parte del código.
Code: [Select]
attachInterrupt(0, rpm, RISING);

Presisamente donde dice RISING. ¿Qué significa?

Saludos.
Title: Re: Entender este código control RPM motor
Post by: _jose_ on Oct 12, 2015, 03:05 pm
¡¡¡Dios mio, se me pasó!!!

Gracias por el código, lo has hasta explicado con líneas de textos. Voy a probarlo con ansias, antes a ver si realmente da pulso de 5 V el tacómetro.

Esta parte del código.
Code: [Select]
attachInterrupt(0, rpm, RISING);

Presisamente donde dice RISING. ¿Qué significa?

Saludos.
Esta explicado en el enlace que pones a prometec y en la referencia a atachinterrupt.tienes varias maneras de disparar la interrupcion ,con RISING la interrupcion se produce cuando la entrada que recibe el impulso pasa de LOW a HIGH.
Title: Re: Entender este código control RPM motor
Post by: surbyte on Oct 12, 2015, 03:16 pm
RISING flanco de subida.
La interrupción se dispara cuando la tensión en el pin 2 del arduino pasa de LOW a HIGH.
Title: Re: Entender este código control RPM motor
Post by: Metaconta on Oct 12, 2015, 03:26 pm
Buenas:

¿No es lo mismo dejarlo en HIGH?

Ya que en este caso lo que importa es cuando detecte el HIGH o alto o 1 ó 5 V. Dice que el RISING es cuando detecta el LOW al HIGH. Detecta cambio de flanco, pero si soloen HIGH también lo detecta.

¿O es qué al volver a LOW y luego cuando se pone en HIGH no hace nada?

Si es así, para eso si que se usa RISING.

Saludos.
Title: Re: Entender este código control RPM motor
Post by: surbyte on Oct 12, 2015, 03:53 pm
Tienes cuatro posibles disparos
LOW
Low to High o RISING
HIGH
High to Low o FALLING

Cada vez que pase de 0->1 tienes sun flanco de subida y un disparo de la interrupcción.
No hay mucho mas que decir. Si eso no se ajusta a tu necesidad usas otra opción.
Title: Re: Entender este código control RPM motor
Post by: Metaconta on Oct 12, 2015, 04:03 pm
Entendido.

En este trozo de código:

Code: [Select]
void loop ()
{
   NbTopsFan = 0;
   sei();   
   delay (1000);
   cli();
   int Calc = ((NbTopsFan * 60)/fandiv);
   Serial.print (Calc, DEC);
   Serial.print (" rpm\r\n");
}


Precisamente donde pone:

Code: [Select]
delay (1000);

Lo que equivale 1 seg. ¿Hal algún problema si lo pones en menos tiempo?

Se acerca más en tiempo real los datos del RPM. Lo que no se si Arduino UNO no es capaz, pero un DUE lo hará de perlas y un Raspberry ni te cuento, como solo me interesa el UNO me quedo con él.

¿Alguna opinión al respecto?

Saludo.
Title: Re: Entender este código control RPM motor
Post by: surbyte on Oct 12, 2015, 06:24 pm
Claro que lo hay, son las lecturas en 1 segundo que luego te dan esta expresión

Code: [Select]
int Calc = ((NbTopsFan * 60)/fandiv);

Si disminuyes a 100 mseg x ejemplo la ecuación cambia a

Code: [Select]
int Calc = ((NbTopsFan * 60 * 10)/fandiv);



Title: Re: Entender este código control RPM motor
Post by: Metaconta on Oct 13, 2015, 02:32 am
Buenas:

Mirando el serial. Se presenta los datos en cada segundo y lo quiero en tiempo real o menos tiempo posible el refrezco, que luego quiero pasarlo al LCD.

Con Arduino UNO a lo mejor no se puede porque es muy lento con Arduino DUE es potente y no se si se puede hacer, tal como pasa con los tacómetros de los coches y con Raspberry Pi 2 se peude hacer si o si.

Cambiando de tema y haciendo pruebas. El resultado sin tener un tacómetro, en realidad estoy con un pulsador pulsándolo, en este caso sin pulsar e incluso pulsado me aparece esto.

Code: [Select]
2150 rpm
29938 rpm
24508 rpm
26968 rpm
26068 rpm
26278 rpm
27178 rpm
26458 rpm
25888 rpm
23698 rpm
28498 rpm
27838 rpm
24328 rpm
25948 rpm



Supuestamente tiene que dar 0 RPM si no hace nada en la entrada del tacómetro, pin 2. Cuando empiece a pulsar el pulsador, tiene que pontar los pulsos, incluido los rebotes.

¿Qué es lo que ocurre?

Saludos.

PD: ¿No habrá al final Ardiuno TRE? ¿El proyecto se ha abandonado?
Title: Re: Entender este código control RPM motor
Post by: noter on Oct 13, 2015, 10:07 pm
¿Tienes el pulsador con su resistencia pull down correspondiente?
El código no está probado, pero no es muy complicado y creo que debería funcionar.
Title: Re: Entender este código control RPM motor
Post by: Metaconta on Oct 14, 2015, 05:15 am
Hola:

He usado el Pull-Up y Down, hasta con interruptor, luego ondas cuadradas de 1 Hz, 10 Hz, 100 Hz y 1 KHz generadas por un PIC12F508. Se coporta igual haga lo qu ehaga, está conectada al pin 2 de Arduino UNO rv3. También he cambiado de 9600 baudios a 115200 y sigue con lo mismo. He probado hasta el pin 3 por si acaso, el mismo comportamiento de siempre.


Ver imagen. (http://www.subeimagenes.com/img/p1480231-1484971.JPG)

Espero que no esté roto el pobre Arduino. Quizás hay qu eprobar mejor código, a parte en vez de usar delay un mili que es más preciso y no deja en ningún momento el microcontrolador esclavo.

Saludos.
Title: Re: Entender este código control RPM motor
Post by: noter on Oct 14, 2015, 04:48 pm
Simulado en proteus con un pulsador funciona bien. Me da 0 cuando no pulso y sube dependiendo de mi frecuencia de pulsación.
¿Tienen tierra masa común el arduino y el generador de pulsos?
Title: Re: Entender este código control RPM motor
Post by: Metaconta on Oct 14, 2015, 04:51 pm
Buenas:

Sigo investigando y he probado un ventilador de 12 V. / 0.10 A. con tacómetro y su salida del cable amarillo de es 5 V.



El comportamiento es el mismo, hasta con tacómetro, probando otro ventilador ocurre lo mismo.

Estoy buscando como loco un ejemplo sencillo sobre leer RPM de un ventilador de PC precisamente por aquí (https://www.google.es/?gfe_rd=cr&ei=GGceVu3CB6is8we_2bGYAg&gws_rd=ssl#safe=off&q=arduino+cooler+leer+rpm).

Si encuentran algunos interesantes antes que yo, los probaré todos, me quedo con el más efizaz. Sigo pensando mejor ponerlo a 115200 baudios com proyecto final, ya que trabaja más rápido en la lectura de datos y sin problemas. Por ahroa nos centramos en el famoso 9600 baudios.

El generador si tiene masa. también he hecho pruebas de lo que preguntas.

Lo queno entiendo que hace sin RPM conectado en el serial contando RPM como si lo tuviera así sin más. Debería poner 0 RPM. Conectando el ventilador lo he detenido quitándo la alimentación, debería poner 0 RPM y sigue con la misma.

Un cordial saludo.
Title: Re: Entender este código control RPM motor
Post by: noter on Oct 14, 2015, 09:40 pm
Haz la siguiente prueba:
Sin nada conectado al pin2, prueba el programa, pero iniciando el pin en el setup así:

Code: [Select]
pinMode(hallsensor, INPUT_PULLUP);

Debería darte cero. Si es así, pon un pulsador entre pin2 y GND y prueba pulsando a ver.
Title: Re: Entender este código control RPM motor
Post by: Metaconta on Oct 14, 2015, 11:21 pm
Buenas:

hice lo que dijiste y si funcinoa a 0 RPM, luego le puse el tacómetro del ventilador activado y funciona de maravilla, es lo que quiero. Y sin usar la resistencia como en el esquema que pusieron en un vídeo en el tacómetro.

Code: [Select]
static int NbTopsFan; // contador de impulsos.
const int fandiv = 2; // dos pulsos por vuelta
const int hallsensor = 2; // pin 2, que está unido a interrupción 0.

void rpm ()     // se llamará cada vez que se pruduce la interrupción
{
 NbTopsFan++;
}

 
void setup()
{
 //pinMode(hallsensor, INPUT);
 pinMode(hallsensor, INPUT_PULLUP);
 Serial.begin(115200); // 115200
 attachInterrupt(0, rpm, RISING);
}
void loop ()
{
   NbTopsFan = 0;
   sei();   
   delay (1000);
   cli();
   int Calc = ((NbTopsFan * 60)/fandiv);
   Serial.print (Calc, DEC);
   Serial.print (" rpm\r\n");
}


Donde pone delay(1000) quise poner    millis(1000);

Me parece que es mejor y más preciso, a parte de no dejar esclavo Arduino durante ese tiempo. Si no es importante como creo, pues lo dejamos en Delay y me dejo de tonterías.

Los RPM se muestra en cada segundo, no en menos tiempo para al menos que se parezca en tiempo real, ya que si reduzjo los RPM, tarda un segundo en ver los nuevos datos.

¿Hay alguna manera de hacerlo más rápido la lectura de los RPM?


Como los coches, que no tardan cada segundo en mostrar cada revolución.

Muchas gracias por la ayuda a todos.
Title: Re: Entender este código control RPM motor
Post by: noter on Oct 15, 2015, 12:03 am
Claro que se puede mostrar cada menos tiempo. En el código actual no hay diferencia entre delay y millis, porque no necesitas hacer nada durante el tiempo de medida. En cuanto a actualizar a más frecuencia, claro que es posible. Ahora lo que te limita es que hay que dejar suficiente delay como para que le de tiempo a serial print a completarse, pues en caso contrario llenas el buffer.
Supongo que a 115200bps así le daría tiempo a refrescar:

Code: [Select]
void loop ()
{
   NbTopsFan = 0;
   sei();   
   delay (100);
   cli();
   int Calc = ((NbTopsFan * 600)/fandiv);
   Serial.print (Calc, DEC);
   Serial.print (" rpm\r\n");
}
Title: Re: Entender este código control RPM motor
Post by: Metaconta on Oct 15, 2015, 01:54 am
Buenas:

Que curioso, si lo pongo a 100 el delay con el 115200 los RPM como máximo son algo más de 400 RPM, si halo lo mismo pero con el delay a 1000 como estaba son unos 3600 RPM.

¿Esto es normal?

Saludos.
Title: Re: Entender este código control RPM motor
Post by: noter on Oct 15, 2015, 04:34 pm
Sospecho que igual nos estamos saliendo del rango de int en los cálculos.
Cambia las declaraciones de Calc, NbTopsFan y fandiv de int a long.
Title: Re: Entender este código control RPM motor
Post by: Metaconta on Oct 15, 2015, 07:00 pm
Los puse todo a long, se comporta como si tuviera 300 RPM.

Code: [Select]
static long NbTopsFan; // contador de impulsos.
const long fandiv = 2; // dos pulsos por vuelta
const int hallsensor = 2; // pin 2, que está unido a interrupción 0.

void rpm ()     // se llamará cada vez que se pruduce la interrupción
{
 NbTopsFan++;
}

 
void setup()
{
 //pinMode(hallsensor, INPUT);
 pinMode(hallsensor, INPUT_PULLUP);
 Serial.begin(115200); // 115200
 attachInterrupt(0, rpm, RISING);
}
void loop ()
{
   NbTopsFan = 0;
   sei();   
   delay (100);
   cli();
   long Calc = ((NbTopsFan * 60)/fandiv);
   Serial.print (Calc, DEC);
   Serial.print (" rpm\r\n");
}
Title: Re: Entender este código control RPM motor
Post by: noter on Oct 15, 2015, 09:41 pm
De momento cambia un error mío que aparentemente no tiene importancia, pero puede tenerla. En la primera línea, en lugar de static debería poner volatile (no sé en qué estaría pensando).
Sigo revisando a ver.
Title: Re: Entender este código control RPM motor
Post by: noter on Oct 15, 2015, 09:45 pm
En segundo lugar, en la fórmula debes multiplicar el número de ticks por 600; no por 60, ya que estamos contando los ticks que se producen en una décima de segundo (delay 100 ms), no en un segundo.

... Lo que me lleva a pensar que con este sistema la variación va a ser sobre múltiplos de 600, con lo que la precisión no va a ser muy buena.

Por aquí se ha dicho varias veces, ahora que me acuerdo, que para bajas frecuencias es más efectivo calcular la frecuencia midiendo el tiempo entre ticks (periodo), y para altas contando ticks.
Title: Re: Entender este código control RPM motor
Post by: noter on Oct 15, 2015, 10:50 pm
Echa un vistazo a este código (http://forum.arduino.cc/index.php?topic=273100.msg1925492#msg1925492) de Nick Gammon.
Title: Re: Entender este código control RPM motor
Post by: Metaconta on Oct 16, 2015, 12:55 am
Es deicr, si pongo el delay a 100, el de 60 tengo que ponerlo a 600. ¿Es lo que te refieres?

No se si le falta precisión, pero si funciona.

Por cierto, si el código anterior de arriba de delay a 1000 y el calc a 60 tiene más precisión, pues dejaré ese. ¿Cómo sabemos cuando tiene mñas precisión uno que el otro?

Code: [Select]
volatile long NbTopsFan; // contador de impulsos.
const long fandiv = 2; // dos pulsos por vuelta
const int hallsensor = 2; // pin 2, que está unido a interrupción 0.

void rpm ()     // se llamará cada vez que se pruduce la interrupción
{
 NbTopsFan++;
}

 
void setup()
{
 //pinMode(hallsensor, INPUT);
 pinMode(hallsensor, INPUT_PULLUP);
 Serial.begin(115200); // 115200
 attachInterrupt(0, rpm, RISING);
}
void loop ()
{
   NbTopsFan = 0;
   sei();   
   delay (100);
   cli();
   long Calc = ((NbTopsFan * 600)/fandiv);
   Serial.print (Calc, DEC);
   Serial.print (" rpm\r\n");
}


voy a husmear el código del enlace que me dejaste.
Title: Re: Entender este código control RPM motor
Post by: noter on Oct 16, 2015, 10:35 pm
Exactamente. Si en lugar de tomar muestra durante un segundo la tomas durante una décima, para calcular lo que corresponde a un minuto deberás multiplicar por 600 en lugar de 60.
Por lo tanto, un solo tick de más (o de menos) medido en esa décima de segundo, traspasado a minuto (rpm) se convierte en 600 pulsos, por lo que las rpm subirán en múltiplos de 300 (600/2 ticks por vuelta).
No he mirado el código de Nick, pero te garantizo que sacará partido al máximo de las capacidades del timer del arduino.
Title: Re: Entender este código control RPM motor
Post by: cuervo on Oct 16, 2015, 10:49 pm
Me matan, gente, ustedes son increibles, hasta  lo entendi casi todo con su explicacion, por que antes......... no entendia nada, gracias por compartir su sabiduria.
Saludos.
Title: Re: Entender este código control RPM motor
Post by: surbyte on Oct 17, 2015, 04:49 am
Por eso cuando mides frecuencias bajas el método no es el qeu usas, sino a la inversa, se mide período y luego se determina la frecuencia como la inversa.
Porque período, commo la lectura de un flanco de subida y otro de bajada. Porque usando un timer puedes hacerlo con mucha precisión, tanto como 62.5nseg por tick de medicion o 1/16Mhz = 62.5nseg
en 100 mseg entran 100 mseg/62.5nseg = 1.600.000 cuentas.
Que te parece Metanconta, algo preciso no? Claro que el Timer rebalsará o dará overflow pero por cada overflow incrementas otro contador y no pierdes nada.

No recuerdo bien donde estaba el limite entre medir por periódo y medir por ventana de tiempo (frecuencia), no estoy seguro si era 1Khz o 10kHz. De todos modos supongamos que fuera 1Khz.
Para una rueda dentada estamos lejos de ese limite y siempre debe leerse por periódo o bien incrementar la cantidad de dientes para poder medir por frecuenca pero con menor error.
 
Title: Re: Entender este código control RPM motor
Post by: noter on Oct 17, 2015, 12:48 pm
Por ello insisto en el código de Nick Gammon, Ricardo. Mide el periodo de forma muy precisa  y por lo que dicen en el hilo a frecuencias de 1kh es "super exacto", y llega hasta 99khz (aunque ahí ya hay algo de error), pero supongo que para frecuencias de 20 khz siga siendo muy aceptable.
Saludos.
Title: Re: Entender este código control RPM motor
Post by: surbyte on Oct 17, 2015, 02:02 pm
Es exactamente por lo que expliqué.
Bajas frecuencias medir período.
Altas frecuencias medir frecuencia.
Title: Re: Entender este código control RPM motor
Post by: Metaconta on Oct 17, 2015, 04:57 pm
Hola:

Voy a probar el código de Nick.
Code: [Select]
/ Frequency timer
// Author: Nick Gammon
// Date: 10th February 2012

volatile boolean first;
volatile boolean triggered;
volatile unsigned long overflowCount;
volatile unsigned long startTime;
volatile unsigned long finishTime;

// here on rising edge
void isr ()
{
  unsigned int counter = TCNT1;  // quickly save it
 
  // wait until we noticed last one
  if (triggered)
    return;

  if (first)
    {
    startTime = (overflowCount << 16) + counter;
    first = false;
    return;
    }
   
  finishTime = (overflowCount << 16) + counter;
  triggered = true;
  detachInterrupt(0);   
}  // end of isr

// timer overflows (every 65536 counts)
ISR (TIMER1_OVF_vect)
{
  overflowCount++;
}  // end of TIMER1_OVF_vect


void prepareForInterrupts ()
  {
  // get ready for next time
  EIFR = _BV (INTF0);  // clear flag for interrupt 0
  first = true;
  triggered = false;  // re-arm for next time
  attachInterrupt(0, isr, RISING);     
  }  // end of prepareForInterrupts
 

void setup () {
  Serial.begin(115200);       
  Serial.println("Frequency Counter");
 
  // reset Timer 1
  TCCR1A = 0;
  TCCR1B = 0;
  // Timer 1 - interrupt on overflow
  TIMSK1 = _BV (TOIE1);   // enable Timer1 Interrupt
  // zero it
  TCNT1 = 0;     
  // start Timer 1
  TCCR1B =  _BV (CS20);  //  no prescaling

  // set up for interrupts
  prepareForInterrupts ();   
 
} // end of setup

void loop ()
  {

  if (!triggered)
    return;

  unsigned long elapsedTime = finishTime - startTime;
  float freq = 1.0 / ((float (elapsedTime) * 62.5e-9));  // each tick is 62.5 nS
 
  Serial.print ("Took: ");
  Serial.print (elapsedTime);
  Serial.print (" counts. ");

  Serial.print ("Frequency: ");
  Serial.print (freq);
  Serial.println (" Hz. ");

  // so we can read it
  delay (500);

  prepareForInterrupts ();   
}   // end of loop


Saludos.
Title: Re: Entender este código control RPM motor
Post by: noter on Oct 18, 2015, 09:59 am
Devuelve la frecuencia en Hercios, pero pasar a RPM supongo que no supondrá un hándicap insalvable.  :smiley-mr-green:  :smiley-mr-green:  :smiley-mr-green:
Title: Re: Entender este código control RPM motor
Post by: Metaconta on Oct 18, 2015, 04:30 pm
¿Se puede mostrar Hz y RPM?

¿Cómo se hace?
Title: Re: Entender este código control RPM motor
Post by: surbyte on Oct 18, 2015, 04:36 pm
Hz son ciclos x segundo
Rpm son revoluciones x minuto o vulgarme serian Hz expresados x minuto.

X rpm = revoluciones/min = revoluciones/60 seg = 1/60 Hz

Entonces un par de ejemplos:
120 rpm = 120/60 Hz = 2 Hz
600 rpm = 600/60 Hz = 10 Hz

Title: Re: Entender este código control RPM motor
Post by: noter on Oct 18, 2015, 04:47 pm
En resumen, multiplica hercios por 60 y tienes rpm. Divides rpm por 60 y tienes hercios.
Title: Re: Entender este código control RPM motor
Post by: Metaconta on Oct 18, 2015, 04:51 pm
Buenas:

Hz es la unidad de medida de la frecuencia. Haré esos cálculos, que no solo se muestre en el seria, sino en una LCD 20x4 que haré más adelante.

Saludos.
Title: Re: Entender este código control RPM motor
Post by: noter on Oct 18, 2015, 05:05 pm
Pero no nos dejes en ascuas. ¿Probaste ya con el código de Gammon?
Title: Re: Entender este código control RPM motor
Post by: Metaconta on Oct 19, 2015, 04:29 am
JAjaa ajajaja, tankis, lo probaré y comentaré, no te preocupes. Vamos a ver como se comporta y les diré dicho comportamiento. Cada vez que pruebo un código creyendo firmemente lo que dice el creador, me encuntro sorpresas, por eso la experiencia es un grado.
Title: Re: Entender este código control RPM motor
Post by: surbyte on Oct 19, 2015, 01:45 pm
Las cosas funcionan en el contexto de quien las crea.
TU crees repetir la situación pero nunca es la misma, por eso siempre estamos hablando en este foro.

Sino todos leeríamos las cosas en INTERNET y las podriamos repetir sin problemas.
Title: Re: Entender este código control RPM motor
Post by: Metaconta on Oct 21, 2015, 06:54 am
¿?  :o  :o  :o
Title: Re: Entender este código control RPM motor
Post by: surbyte on Oct 21, 2015, 09:29 am
Tan complicado no hablo Metaconta.
Quote
Las cosas funcionan en el contexto de quien las crea.
TU crees repetir la situación pero nunca es la misma, por eso siempre estamos hablando en este foro.

Sino todos leeríamos las cosas en INTERNET y las podriamos repetir sin problema.
Cada vez que vez algo en internet, intentas reproducirlo no? pero no siempre puedes. Porqué? Por que, no siempre reproduces el ambiente exacto de quien creó el tutorial. O te falta algo, que pasaste por alto, o no considerarte un detalle que luego se vuelve crucial. 
Entonces, por eso digo: "Las cosas funcionan en el contexto (ambiente) de quien las crea".  En el proceso de reproducirlas muchas veces cometemos errores.
Ejemplo: tu estas con esto y yo no puedo hacer funcionar un pequeño ESP8266, hasta que leí a gepd/maxid/jopapa quienes dijeron en  alguna respuesta que hay que cambiar el firmware. Entonces ahi tienes. Mi contexto mi entorno no es el mismo de quien hizo el tutorial del ESP8266 y a mi no me funciona. 
Se comprende ahora?