Go Down

Topic: Entender este código control RPM motor (Read 4275 times) previous topic - next topic

cuervo

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.

surbyte

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.
 

noter

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.

surbyte

Es exactamente por lo que expliqué.
Bajas frecuencias medir período.
Altas frecuencias medir frecuencia.

Metaconta

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.

noter

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:

Metaconta

¿Se puede mostrar Hz y RPM?

¿Cómo se hace?

surbyte

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


noter

En resumen, multiplica hercios por 60 y tienes rpm. Divides rpm por 60 y tienes hercios.

Metaconta

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.

noter

Pero no nos dejes en ascuas. ¿Probaste ya con el código de Gammon?

Metaconta

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.

surbyte

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.

Metaconta


surbyte

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?

Go Up