Go Down

Topic: PulseIn para RPM ? (Read 5 times) previous topic - next topic

almamater

Possa... é muito complicado obter valores certos, usando simplesmente este código:

Code: [Select]
int pin = 7;
unsigned long duration;

void setup()
{
 Serial.begin(9600); // Inicializa a comunicação serial
 pinMode(pin, INPUT);
}

void loop()
{
 duration = pulseIn(pin, HIGH);
 Serial.println(duration);
}


Tenho valores completamente diferentes consoante as ventoinhas, com uma bastante potente de 80mm tenho 3600 de resultado, com uma ventoinha de 120mm já tenho 15084.

Pensei que fosse por ser de 120mm, mas testei uma outra de 80mm e tenho os mesmo valores ~14033..

Usando o attachInterrupt os valores batem sempre certo independentemente do tipo de ventoinha.. tem a ver com o tipo de hall effect sensor ?

fabio_h


...
Tenho valores completamente diferentes consoante as ventoinhas, com uma bastante potente de 80mm tenho 3600 de resultado, com uma ventoinha de 120mm já tenho 15084.

Pensei que fosse por ser de 120mm, mas testei uma outra de 80mm e tenho os mesmo valores ~14033..
...


Quanto mais potente a ventoinha, mais rapido ela gira... e menos tempo ela demora para dar uma volta....
a ventoinha de 120mm é maior mas não mais rápida e daí o tempo maior...

Testa o código e veja se melhora
Code: [Select]
int pin = 7;
unsigned long duration;
float resultado;
void setup()
{
  Serial.begin(9600);
  pinMode(pin, INPUT);
}

void loop()
{
  duration = pulseIn(pin, HIGH);
  resultado = ( 1000000.0 / float(duration) ) * 60.0;
  Serial.println(resultado);

}

GustavoDDRamos


Testa o código e veja se melhora
Code: [Select]
int pin = 7;
unsigned long duration;
float resultado;
void setup()
{
  Serial.begin(9600);
  pinMode(pin, INPUT);
}

void loop()
{
  duration = pulseIn(pin, HIGH);
  resultado = ( 1000000.0 / float(duration) ) * 60.0;
  Serial.println(resultado);

}



Fábio,

Assim não fica impossível de ler no serial monitor ? Ele irá printar valores alguns milhares de vez por segundo, não ? :P
Gustavo Ramos
Belo Horizonte - Minas Gerais - Brazil

E-mail/GTalk: Gustavo.Ramos@veadvogados.com.br

English/Português/Español/Deustch :D

almamater

Ainda não testei o código do Fábio, e desde já agradeço as vossas respostas.

O meu objectivo é implementar um ATMega168 num sistema de refrigeração com 4 ventoinhas, para além de controlar as mesmas queria apresentar/obter a rotação +/- real de cada uma.

Será que existe alguma outra forma (outro controlador/chip) que possa utilizar para esta parte do projecto? em que seja mais fácil? já pesquisei muito na web mas acabo sempre por concluir que com o arduino é mais simples.. mas não sei se existem controladores específicos para ler as rpm´s das ventoinhas

almamater

Alguma ideia de como posso saber se a ventoinha está parada ou não?

Usando este código:

Code: [Select]

//-----------------------------------------------
volatile byte rpmcount;
unsigned int rpm;
unsigned long timeold;
void setup()
{
   Serial.begin(9600);
   attachInterrupt(0, rpm_fun, RISING);
   rpmcount = 0;
   rpm = 0;
   timeold = 0;
}
void loop()
{
   if (rpmcount >= 20) {
     //Update RPM every 20 counts, increase this for better RPM resolution,
     //decrease for faster update
     rpm = 30*1000/(millis() - timeold)*rpmcount;
     timeold = millis();
     rpmcount = 0;
     Serial.println(rpm,DEC);
   }
}
void rpm_fun()
{
   rpmcount++;
   //Each rotation, this interrupt function is run twice
}
//-----------------------------------------------

Go Up