Go Down

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

almamater

May 04, 2011, 12:29 pm Last Edit: May 04, 2011, 12:30 pm by almamater Reason: 1
: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: [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);
}


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?  




Kotch

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

Radames

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.

almamater


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...


Radames

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.

almamater


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.


XD  :smiley-red:  ups!

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

Obrigado pela resposta!

Radames

post os resultados aqui!!! até

almamater

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


Radames

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!

Senso

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.

almamater

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


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





brGiba

#11
Jun 13, 2011, 07:50 am Last Edit: Jun 14, 2011, 06:13 am by brGiba Reason: 1
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!




almamater

:%

Muito obrigado pela explicação!! mesmo!

almamater

Bem.. testei fazer o seguinte:

Code: [Select]
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..

almamater

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

Code: [Select]
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: [Select]
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?

Go Up