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

 smiley-roll-sweat

Viva!

Com arduino consigo facilmente contar as voltas de uma ventoinha..:



Através do código disponível em http://www.arduino.cc/playground/Main/ReadingRPM, e da função "attachInterrupt" tenho um valor de 4200 RPM

No entanto, eu quero usar a função PulseIn() uma vez que a nível de "attachInterrupt" apenas posso usar 2 pinos (2 ventoinhas) e queria obter a info de RPM de mais ventoínhas..

Estou a utilizar 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);
}

funciona bem, a única diferença é que retorna o valor de 3600, como a função PulseIn() retorna micro-segundos.. alguém sabe como chegar aos 4200 RPM da função "attachInterrupt", pois deverá ser este o valor real..  e não os 3600, tenho de converter como?  



« Last Edit: May 04, 2011, 05:30:58 am by almamater » Logged

Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 381
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Opz, bele?

Onde acho a biblioteca do arduino duemilanove pro Proteus?
Esta que vc usou ai no seu desenho!
Pode disponibilizar aki , ou um link pra download?


 smiley-roll
Logged

????????????????????

Sao Paulo - Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 268
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

nao entendi,
vc esta tentando usar a funcao pulsein para medidir os pulsos gerados pelo giro da ventoninha?
note que a funcao pulsein retorna o tempo de um pulso, a largura de um pulso que pode HIGH ou LOW. Voce nao consegue contar pulsos com ela.
Logged

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

nao entendi,
vc esta tentando usar a funcao pulsein para medidir os pulsos gerados pelo giro da ventoninha?
note que a funcao pulsein retorna o tempo de um pulso, a largura de um pulso que pode HIGH ou LOW. Voce nao consegue contar pulsos com ela.

Olá,

Sim a função pulsein devolve micro-segundos, conseguimos converter para Hz e depois para rpm?  ou algo assim..?

Com esta função consigo saber se a ventoinha está parada ou a rodar e era mesmo excelente se conseguisse calcular +/- a velocidade a que está a trabalhar...

Logged

Sao Paulo - Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 268
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

entao,
definitivamente  vc nao esta utilizando a forma correta!
o pulseIN faz isto

http://www.arduino.cc/en/Reference/PulseIn

Quote
the length of the pulse (in microseconds) or 0 if no pulse started before the timeout (unsigned long)

ele te retorna a largura de um pulso em microsegundos!

para vc contar múltiplas ventoinhas precisa fazer um tachometer para múltiplas entradas, procure este chip LM2907 , ele converte frequência, para voltagem, assim vc pode ler sem acrescentar mais nada 6 ventoninhas utilizando 6 portas analógicas.
 
Logged

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

entao,
definitivamente  vc nao esta utilizando a forma correta!
o pulseIN faz isto

http://www.arduino.cc/en/Reference/PulseIn

Quote
the length of the pulse (in microseconds) or 0 if no pulse started before the timeout (unsigned long)

ele te retorna a largura de um pulso em microsegundos!

para vc contar múltiplas ventoinhas precisa fazer um tachometer para múltiplas entradas, procure este chip LM2907 , ele converte frequência, para voltagem, assim vc pode ler sem acrescentar mais nada 6 ventoninhas utilizando 6 portas analógicas.
 
smiley-lol  smiley-red  ups!

Vou procurar alguma informação então de circuitos do LM2907 com o arduino smiley

Obrigado pela resposta!
Logged

Sao Paulo - Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 268
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

post os resultados aqui!!! até
Logged

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

Bom.. toda a informação que encontro está associada para carros.. no datasheet do chip o exemplo que mais se adapta será este:



Em vez daqueles 2 fios no "Magnetic Pickup" secalhar dá para meter apenas o fio amarelo vindo da Fan..  a nível de Vout é que não deve dar para ligar directamente a um pino analógico do arduino.. tem de se ver o que sai dali

Logged

Sao Paulo - Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 268
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

veja o datasheet
http://www.national.com/profile/snip.cgi/openDS=LM2907
tem mais application examples.

mas da para medir sim, a ventoinha tem um sensor hall!
Logged

Portugal
Offline Offline
God Member
*****
Karma: 5
Posts: 962
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Usa PCINT's

Mas o pulsein tenho quase a certeza que funciona, isso é onda quadrada, se só te dá meia onda multiplicas o tempo por dois.
Logged

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

Sim.. mas alguma ideia do que tenho de alterar ou qual o cálculo a adicionar?

Se utilizar o método do attachInterrupt tenho 4200 Rpm´s, usando o pulsein ele dá-me 3600

attachInterrupt:
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
 }
//----------------

Pulsein:
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);
}



Logged

Jacarei, Sao Paulo
Offline Offline
Newbie
*
Karma: 0
Posts: 1
Zeh80
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sim, almamater e é simples.

O resultado da função pulseIn, como você já sabe, nos dá a largura do pulso capturado pela entrada em microsegundos. Acompanhe:

pulseIn = 3600 microsegundos;

x 2 (um ciclo) = 7200us;

inverter: 1/7200 = 0,138888kHz = 138Hz;

x 60 (1 minuto) = 8280rpm;

/ 2 (ventilador com dois pulsos por volta) = 4140rpm.


Só funciona se o duty cycle for de 50%.

Boa sorte!



« Last Edit: June 13, 2011, 11:13:10 pm by brGiba » Logged

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

 smiley-draw

Muito obrigado pela explicação!! mesmo!
Logged

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

Bem.. testei fazer o seguinte:

Code:
int pin = 8;
unsigned long duration;
float duration2;

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

void loop()
{
  Serial.println("-----");
  duration = pulseIn(pin, HIGH);
  Serial.println(duration);
  duration2=(duration*2);
  Serial.println(duration2);
  duration2=(1/duration2);
  duration2=(duration2*1000);
  duration2=(duration2*1000);
  Serial.println(duration2);
  duration=(duration2*60/2);
  Serial.println(duration);
}

Resultado:

-----
3622      -> Valor lido no pulsein
7244.00 -> multiplicado por 2
138.05   -> não sei se é bem isto mas ao resultado de 1/7244 multipliquei depois 2x por 1000
4141      -> Resultado RPM
-----
3628
7256.00
137.82
4134
-----
3623
7246.00
138.01
4140
-----
3628
7256.00
137.82
4134
-----
3622
7244.00
138.05
4141
-----
--------------------------------------------

Assim parece estar Ok! mas vou testar ainda mas só amanhã que agora tenho de ir dormir..
Logged

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

Tenho uma situação, colocando apenas o código para obter o valor pulsein funciona bem:

Code:
void loop()  {
  Serial.println("-----FAN1");

  duration = pulseIn(pin1, HIGH);
  duration2=(duration*2);
  duration2=(1/duration2);
  duration2=(duration2*1000);
  duration2=(duration2*1000);
   duration=(duration2*60/2);

  Serial.println(duration);
}

Se colocar código associado a outras coisas já se atrofia todo.. exemplo:


Code:
void loop()  {
  Serial.println("-----FAN1");

  duration = pulseIn(pin1, HIGH);
  duration2=(duration*2);
  duration2=(1/duration2);
  duration2=(duration2*1000);
  duration2=(duration2*1000);
  duration=(duration2*60/2);

  Serial.println(duration);

//Temperatura:
sensors.requestTemperatures();
Serial.print("Temperature for Device 1 is: ");
temperature=(sensors.getTempCByIndex(0));
Serial.println(temperature);
Serial.print("Temperature for Device 2 is: ");
temperature=(sensors.getTempCByIndex(1));
Serial.println(temperature);
}
Fico com valores de 18032 em vez de 3050 

Para obter os valores correctos de RPM tenho de executar o código pilsein sozinho?
Logged

Pages: [1] 2   Go Up
Jump to: