Pages: 1 [2]   Go Down
Author Topic: PulseIn para RPM ?  (Read 5400 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Full Member
***
Karma: 1
Posts: 133
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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 ?
Logged

0
Offline Offline
Full Member
***
Karma: 3
Posts: 132
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

...
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:
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);

}
Logged

Belo Horizonte / MG
Offline Offline
Newbie
*
Karma: 0
Posts: 9
Take it easy (:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Testa o código e veja se melhora
Code:
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 ? smiley-razz
Logged

Gustavo Ramos
Belo Horizonte - Minas Gerais - Brazil

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

English/Português/Español/Deustch smiley-grin

0
Offline Offline
Full Member
***
Karma: 1
Posts: 133
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Full Member
***
Karma: 1
Posts: 133
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Usando este código:

Code:
//-----------------------------------------------
 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
 }
//-----------------------------------------------
Logged

0
Offline Offline
Full Member
***
Karma: 1
Posts: 133
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sempre que a ventoinha roda a função rpm_fun é executada.. eu queria implementar uma opção no Loop para saber se esta função está a ser executada ou não..

Ela é executada de 0 a 20 e depois faço a contagem das rotações, mas se ela parar antes de chegar a 20 eu não tenho como saber se parou ou não.. alguma ideia de como posso saber se a função  rpm_fun está a ser executada e o valor de rpmcount alterado?
Logged

0
Offline Offline
Full Member
***
Karma: 1
Posts: 133
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Se calhar até é fácil.. vou testar fazer isto:

Code:
volatile byte rpmcount;
 unsigned int rpm;
 unsigned long timeold;
 
 int rmpfan1state=0;
 long intervalRPM = 8000; //8 segundos //
 long previousMillis = 0;
  
 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);
   }
  
   unsigned long currentMillis = millis();
   if(currentMillis - previousMillis > intervalRPM) {
    previousMillis = currentMillis;
  if (rmpfan1state==1) rmpfan1state=0;
  if (rmpfan1state==0) Serial.println("Fan DESLIGADA!");
}
 }
 
 void rpm_fun() //Each rotation, this interrupt function is run twice
 {
   rpmcount++;  
 rmpfan1state=1;[/b]
 }
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Acho que pela data das postagens ninguém mais deve se interessar pela tópico, mas mesmo assim, lá vai.

Se fizermos duas sequências, sendo uma para calcular o tempo do pulso HIGH e em seguida calcular o tempo em que permanece como LOW, não teríamos o ciclo completo? Me corrijam se estiver errado. Estou ajudando um amigo meu num projeto dele e não temos acesso ao eixo de um rotor, então conseguimos uma forma de contar os pulsos gerados a cada volta, através de um sensor e a partir daí pensamos numa forma de conseguir medir a frequência de giro, a qual esperamos que seja essa que foi proposta.

Espero ter ajudado e receber alguma ajuda.

Até mais!
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3262
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

A maneira mais simples será ligar o T1 (não o T0 por causa do millis), a um pino externo para usar esse temporizador como contador de eventos.

Depois criar uma interrupcão do T1 de 256 em 256, ou como este é um timer de 16 bits de 65000 em 65000 e quando essa interrupcão se der, ver quanto tempo passou desde a última.
Pode fazer-se ao contrário e de x em x tempo ver quantas contagens tens e fazer as contas a partir daí.
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Pages: 1 [2]   Go Up
Jump to: