Ola pessoal ,criei um contador de voltas, beleza ,um simples i++, o programa recebe esta contagem de um sensor .A duvida é : como eu detecto quando o contador parar de contar por digamos um 1min

Exibições: 673

Responder esta

Respostas a este tópico

olá Camilo, bom dia.

      É simples fazer isso.  Mas depende também da forma como vc implementou no código do Arduino (suponho que seja ambiente Arduino, mas vc nada disse sobre).

      Acredito que sua implementação seja através de Interrupção, usando o Pino 2 ou o Pino 3 do Arduino UNO por exemplo.  Neste caso vc deve ter ligado a saída do seu Sensor ao Pino de Interrupção (o 2 ou o 3).  Normalmente, na Rotina de Interrupção (a "ISR" - Interrupt Service Routine),  as pessoas incrementam um Contador, e depois acessam este fora da ISR, lendo o mesmo Contador e assim usando seu valor para saber a rotação, seja em RPM, seja em RPS.  Uma observação importante sobre termos técnicos:  dentro da ISR é chamado de "execução no Background", e fora da ISR é chamado de "execução no Foreground".

      Dito isto, segue como vc pode proceder para obter o resultado desejado:

      1)  crie uma Flag Global volátil,  ou seja:  declare uma variável tipo "volatile bool", e inicialize a mesma com "true", como no exemplo a seguir, onde eu chamei a Flag de "Voltas_OK":

        volatile bool Voltas_Ok = true;    // Flag que valida a recepcao dos Pulsos do Sensor.

      2) dentro da sua ISR (no "background"), sete a Flag com o valor "true", conforme mostrado a seguir:

           ......ISR......

     

               Voltas_Ok = true;    // sinaliza que recebeu Pulso do Sensor.

   

           ......ISR......

      3)  no "foreground" (ou seja, fora da sua ISR),  vc deve testar a Flag, e se a mesma ficar "false" por determinado tempo então vc saberá que a ISR parou de ser executada, uma vez que os Pulsos do Sensor pararam de chegar. Claro, logo após testar a Flag, vc deve resetá-la com "false". Veja esta implementação na rotina a seguir,  com o respectivo teste para saber se parou de receber os Pulsos do Sensor após um "timeout":

(clique na figura para "zoom")

      Observe que o valor "Tempo_a_Detectar" deve estar em mili-segundos. Logo se vc quiser saber se o Sensor parou de emitir Pulsos por por exemplo  9 segundos, então o valor "Tempo_a_Detectar" deve ser 9000 (9 mil).  Se for por exemplo por 2 minutos, então "Tempo_a_Detectar" deve ser 120000 (120 mil).

      Veja que é obrigatório o uso do tipo "volatile" para a variável "Voltas_Ok", conforme mostrei acima.  Se vc não souber o motivo, me pergunte.  Não é preciso se preocupar com a questão da "Atomicidade", pois as variáveis tipo "bool" ocupam apenas um Byte na Memória.

      Inclusive, verifique se seu "Contador de Voltas" está declarado como "volatile", pois ele deveria estar assim.  Neste caso fique atento, pois se seu Contador  tiver mais de um Byte de tamanho, então vc precisa também implementar a "Atomicidade",  claro: isto  se quiser que seu código nunca falhe. Mas isto é simples de fazer (se não souber como, pergunte aqui).

      Espero ter ajudado,

      Abrçs,

      Elcids

ah sim: complementando:

      Se vc não usou Interrupção, ainda assim é fácil de obter o mesmo resultado, e é praticamente idêntico ao que postei. Apenas neste caso não necessita que a Flag tenha o qualificador "volatile", uma vez que ela não seria acessada no "background" (e claro, sem se preocupar também com a questão da "Atomicidade" que apavora algumas pessoas, embora seja fácil tratar).

       E no caso de vc não usar Interrupção, ou seja não existiria uma ISR, então a linha de código onde no meu exemplo a Flag é setada para "true" dentro da ISR,  deve estar no seu código  imediatamente após  vc detectar que "chegou" um Pulso do Sensor de Rotação.

       Mas eu aconselharia que vc usasse Interrupção, pois além de ser mais confiável ( aqui a confiabilidade significa que vc pode utilizar diversos elementos no seu Sistema, como LCD, Botões, outros Sensores, etc, de forma harmoniosa sem que a temporização de um interfira com a do outro),  usando Interrupção é também a forma adequada de medir altas velocidades de rotação (se for o seu caso).

      Abrçs,

      Elcids

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço