Go Down

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

almamater

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?

almamater

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

Code: [Select]

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]
}

Daniel_Gomes

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!

bubulindo

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

Go Up