sábado, 2 de agosto de 2014

Controle virtual de Bounce

Hoje estaremos abordando o tratamento de um ruído gerado por sinal de controle de origem mecânica, em outras palavras, interferência gerado ao pressionar um botão, por exemplo, para alterar o nível lógico em um pino de um microcontrolador. Existe o tratamento desta resposta indesejada de um acionamento mecânico via hardware, normalmente envolvendo capacitores configurados como "passa-baixa", mas caso tenha algum processamento sobrando em seu circuito de controle essa é uma prática que pode lhe poupar algum dinheiro e ajudar a solucionar problemas de no circuito físico virtualmente. Nosso circuito será um pouco complexo hoje:


Ou não, suponhamos que a saída (Out) esteja indo para um pino do seu microcontrolador que irá tratar este sinal, enquanto a chave (S1) esta aberta nosso resistor (R1) garante VCC em "Out" e ao pressionar garantimos terra no mesmo, até aqui a história simples, mas dependendo da aplicação existe um grande problema na transição entre os níveis lógicos, vamos analisar o gráfico a seguir:

Digamos que essa tenha sido a resposta no momento que a chave fora fechada, notem que entre o nível alto e a condição 0V estabilizada existe uma sequencia de pulsos indesejados. Caso o circuito que esta a planejar sirva para controle de volume, a condição acima é extremamente prejudicial ao controle, já que, dependendo da frequência que esta seu ciclo de maquina, este pulsos serão tratados e ao invés de um único pulso de ajuste teremos entre quatro e cinco pulsos de controle, vejamos a seguir:

O sinal que queremos realmente processar esta em azul agora, notem que a cada vez que o sinal bate em 0V e retorna a um nível alto temos um pulso e não é garantido de nenhuma maneira que serão apenas cinco variações a cada vez que S1 for pressionado e essa imprevisibilidade não é útil para a nossa aplicação hipotética. Veremos então o que podemos fazer durante o processamento desta informação para não haver erros de leitura, a seguir o código:

int conta=0;
int verifica=0;
short resposta=0;
short aciona=0;

void main{

      while(TRUE){

      if((input(PIN_"xx"))==FALSE){
            aciona=TRUE;
      }
       if(aciona){  
             for(conta=0, conta<100, conta++){
                     if((input(PIN_"xx"))==FALSE){
                           verifica=verifica+1;
                     delay_ms(1);
                     }
              if(verifica>75){
                      resposta=TRUE;
              }
              else{
                      resposta=FALSE;
              }
              verifica=0;
              aciona=FALSE;
              }
      }
      
      if(resposta){
                      output_high(PIN_"yy");
      }
      else{
                      output_low(PIN_"yy");
      }
}

O código acima funciona da seguinte maneira, a variável "int conta" serve apenas para podermos efetuar a função "for", "int verifica" armazenará os resultados dos teste da condição do pino analisado, "int resposta" fala por si só e por fim a variável "int aciona" que indicará quando o estado do pino deve ser verificado. O trecho de código esta em um loop, mas não executa a verificação da entrada a cada ciclo, apenas quando o primeiro pulso é detectado que a variável "int aciona" ficará em alta, o programa entrará na verificação, devolvera a resposta e a variável "int aciona" voltará a ficar em baixa até ,pelo menos, um pulso ser detectado na entrada, este processo permite que o microcontrolador se concentre em se a entrada esta realmente com um sinal valido ou não apenas quando algum pulso é detectado. Após a "int aciona" ser colocada em alta entramos no trecho de verificação, onde a função "for" verifica cem vezes se a entrada esta em alta ou não com um tempo de um milissegundo entre uma verificação e outra, a resposta de cada verificação é incrementada na variável "int verifica", ou seja, a verificação da condição lógica da entrada é feita aproximadamente em um décimo de segundo. No momento que a função "for" termina de ser executada a "int verifica" é analisada, se seu valor for maior que 75 isto significa que a leitura se trata realmente de um comando e não de um ruído (Bounce) , caso contrario não se trata de um comando, e aqui esta nosso trunfo, o 75 indica que durante a verificação em 75% do tempo a entrada ficou em baixa (lembre que nossa lógica esta negada, quando vai a zero que temos sinal), portanto ao invés de agirmos a cada pulso analisamos a média de tempo em cada estado lógico eliminando o problema de ruído mecânico, continuemos. Com "int verifica" analisado, setamos a saída "int resposta" como alta ou não, este dado acionará um pino onde podemos colocar um LED e assistir a lógica funcionando, claro que para trabalhar com esse LED na saída o interessante é aumentar o tempo de amostra de analise setando o "delay" para 10 ou 15 milissegundos. Espero que tenham gostado, um abraço e até a próxima.   

Nenhum comentário:

Postar um comentário