0
Offline
Jr. Member
Karma: 0
Posts: 82
Arduino rocks
|
 |
« on: May 04, 2011, 05:29:24 am » |
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 RPMNo 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: 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
Sr. Member
Karma: 0
Posts: 381
|
 |
« Reply #1 on: May 07, 2011, 12:31:53 pm » |
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? 
|
|
|
|
|
Logged
|
????????????????????
|
|
|
|
Sao Paulo - Brazil
Offline
Sr. Member
Karma: 0
Posts: 268
|
 |
« Reply #2 on: May 10, 2011, 12:13:24 am » |
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
Jr. Member
Karma: 0
Posts: 82
Arduino rocks
|
 |
« Reply #3 on: May 10, 2011, 10:47:16 am » |
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
Sr. Member
Karma: 0
Posts: 268
|
 |
« Reply #4 on: May 10, 2011, 04:15:59 pm » |
entao, definitivamente vc nao esta utilizando a forma correta! o pulseIN faz isto http://www.arduino.cc/en/Reference/PulseInthe 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
Jr. Member
Karma: 0
Posts: 82
Arduino rocks
|
 |
« Reply #5 on: May 10, 2011, 04:37:37 pm » |
entao, definitivamente vc nao esta utilizando a forma correta! o pulseIN faz isto http://www.arduino.cc/en/Reference/PulseInthe 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.  ups! Vou procurar alguma informação então de circuitos do LM2907 com o arduino Obrigado pela resposta!
|
|
|
|
|
Logged
|
|
|
|
|
Sao Paulo - Brazil
Offline
Sr. Member
Karma: 0
Posts: 268
|
 |
« Reply #6 on: May 10, 2011, 04:44:43 pm » |
post os resultados aqui!!! até
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Jr. Member
Karma: 0
Posts: 82
Arduino rocks
|
 |
« Reply #7 on: May 10, 2011, 06:24:04 pm » |
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
|
|
|
|
|
|
|
Portugal
Offline
God Member
Karma: 5
Posts: 962
|
 |
« Reply #9 on: May 12, 2011, 01:45:18 am » |
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
Jr. Member
Karma: 0
Posts: 82
Arduino rocks
|
 |
« Reply #10 on: June 06, 2011, 09:36:17 am » |
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://----------------------------------------------- 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: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
Newbie
Karma: 0
Posts: 1
Zeh80
|
 |
« Reply #11 on: June 13, 2011, 12:50:03 am » |
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
Jr. Member
Karma: 0
Posts: 82
Arduino rocks
|
 |
« Reply #12 on: June 14, 2011, 07:06:25 am » |
 Muito obrigado pela explicação!! mesmo!
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Jr. Member
Karma: 0
Posts: 82
Arduino rocks
|
 |
« Reply #13 on: June 14, 2011, 06:28:38 pm » |
Bem.. testei fazer o seguinte: 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
Jr. Member
Karma: 0
Posts: 82
Arduino rocks
|
 |
« Reply #14 on: November 19, 2011, 04:52:18 am » |
Tenho uma situação, colocando apenas o código para obter o valor pulsein funciona bem: 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: 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
|
|
|
|
|
|