Botões de rejeição

32

Recentemente, li um artigo sobre a rejeição de botões e fiquei pensando se deveria ter isso em mente ao trabalhar com, por exemplo, um Arduino (ATMega mC)? Suponho que seja um problema, especialmente ao trabalhar com interrupções.

Portanto, é melhor detectar rejeição no código ou isso deve ser resolvido com o hardware? Por favor elabore.

Vincent Van Den Berghe
fonte

Respostas:

17

Eu recomendo conectar um escopo (espero que você tenha um ou consiga usar um) até o seu switch. Eu vi o projeto de um aluno que teve um salto no interruptor que passou de 5v para -5v até 4v para -3v, depois para até 2v, depois para 2v e depois para 0v. Quando analisamos o desenho atual em um escopo, houve um pico muito grande.

No seu caso particular, era muito necessário que ele renunciasse à sua chave no hardware.

No entanto, por outro lado, vi switches que têm um efeito muito menor que poderia ser facilmente removido no software.

Você precisa pesar suas opções. Se você possui uma quantidade muito complexa de firmware, a adição de sobrecarga para você, como programador e o uso da CPU, pode não valer a pena, e seria melhor adicionar apenas um pouco de hardware. Agora, por outro lado, se você estiver tentando reduzir custos e tamanho, convém remover o máximo de hardware possível e fazer tudo isso no firmware, se puder.

Kellenjb
fonte
Criei um escopo para uma imagem de switch bounce e a publiquei na Wikipedia: en.wikipedia.org/wiki/File:Switch_bounce.JPG
Thomas O
@ Thomas O, que é uma imagem muito divertida de rejeição. Eu só quero ter certeza de que @Vincent Van Den Berghe entenda que nem todo salto será assim. Esse salto é limitado a 0-5V, nem sempre será assim.
Kellenjb
2
@ Thomas O, como observação lateral, criamos uma prática de alunos reprovados que tiram imagens do Oscope assim. O flash na tela é horrível. Também damos um passo adiante e incentivamos os alunos a coletar pontos de dados reais, usando algo como um CSV ou uma visão de laboratório, para que possa ser facilmente usado em relatórios e análise de dados.
Kellenjb
@Kellenjb, estou comprando uma impressora em breve para o meu escopo que suporta HP-IB. Também descobri que o modo "Esportes" da minha câmera pode tirar boas fotos da tela do osciloscópio sem flash e sem desfocagem.
Thomas O
1
@Lundin Em um ambiente de tempo real, você depende muito de interrupções. Se você pressionar o botão em uma interrupção, não desejará realmente que o seu sistema em tempo real seja interrompido várias vezes com o pressionar de um único botão. Você também não precisa dedicar recursos para aguardar 10 ms.
Kellenjb
15

Se você é um designer profissional de eletrônica, é provável que seu chefe nem permita que você faça isso em hardware. O motivo é simples: se o lote de produção é grande o suficiente, o software é praticamente gratuito , enquanto o hardware deve ser pago por cada unidade que você produz. E enquanto os resistores e capacitores são muito baratos, montá-los em uma placa de circuito impresso pode custar até 20 vezes o preço de compra.

Independentemente de você renunciar em software ou hardware, você ainda precisa selecionar botões de qualidade. O infame botão 157ms do artigo simplesmente não é adequado para nenhuma aplicação.
Normalmente, mostro o botão em intervalos de 32 ms , o que é suficiente para diminuir o tempo de debounce de qualquer botão bom. Sou bastante fã dos Switches SKQG TACT da Alps .

Interruptor tato Alpes

Nos poucos dispositivos que testei, o tempo de rejeição inicial era inferior a 10ns. Embora tenha uma vida útil de 100.000 ciclos, testamos por 200.000 ciclos e, mesmo assim, o débito de 32ms foi suficiente. (Acho que deveria ter medido o nível real de devolução, mas nosso principal interesse na época era o comportamento do produto final. De qualquer forma, estávamos usando-o fora das especificações.)

Se você realmente deseja uma solução de hardware, recomendo a solução de flip-flop SR mencionada no artigo como a melhor solução tecnicamente:

circuito de debounce

O flip-flop pode ser construído com uma porta NAND dupla , que está disponível em um pequeno pacote VSSOP8, por exemplo. A principal desvantagem desta solução é que você precisa de um botão SPDT, em que o SPST está muito mais disponível.

stevenvh
fonte
12

Existem muitas (e muitas) maneiras diferentes de devolver botões. O fato de você fazer isso em software ou hardware dependerá dos requisitos do seu projeto e do tipo de switch.

Aqui estão alguns links para diferentes métodos:

http://www.ganssle.com/debouncing.htm

http://hackaday.com/2010/11/09/debounce-code-one-post-to-rule-them-all/

Toby Jaffey
fonte
Eu estava indo para obter um link para ganssle quando vi a pergunta.
Kortuk
O artigo ganssle foi a razão pela qual eu fiz essa pergunta, ela está vinculada na minha pergunta :) Obrigado pelo link para os trechos do código de devolução.
Vincent Van Den Berghe
Você se importaria em resumir alguns casos de uso para ilustrar quando usar soft / hardware? (isso é provavelmente subjetivo, mas eu gostaria de alguns exemplos de qualquer maneira) #
687 Vincent Van Den Berghe
1
@Incinc, Kellenjb resumiu em sua resposta como decidir. Não cliquei no seu link porque tinha um nome engraçado, agora que cliquei, vejo ganssle!
Kortuk
Se essa é a regra geral / de consenso, na verdade, não há necessidade de mais exemplos.
Vincent Van Den Berghe
6

Esse artigo é a "bíblia" sobre a renúncia. O retorno do contato pode ser um problema com qualquer aplicativo.

Geralmente, é melhor rejeitar comutadores no software, pois é mais fácil ajustar os atrasos para determinados comutadores, pois eles diferem na quantidade de rejeição de contato. Também é necessário renunciar à liberação da chave. Os fabricantes de comutadores geralmente especificam a quantidade de rejeição de seus produtos, normalmente em torno de 10 ms a 20 ms.

Leon Heller
fonte
Por que as pessoas estão votando nisso?
perfil completo de Toby Jaffey
Bom ponto sobre a renúncia de lançamentos de chaves!
Vincent Van Den Berghe
1
Eu não diminuí a votação, mas apenas fazer isso em software é uma péssima idéia. É uma boa idéia para caracterizar.
Kortuk
Eu disse "geralmente", que é o caso, e dei o motivo. Também minimiza o custo da BOM e aumenta a confiabilidade.
Leon Heller
isso só aumenta a confiabilidade se o sinal permanecer dentro dos limites seguros do seu controlador. Esta ação aumentará a confiabilidade se você diminuir a contagem de componentes sem aumentar o desgaste dos componentes. Eu não estava dizendo que discordava do conceito de suas postagens, mas trabalho constantemente com os engenheiros que acabam de entrar em campo e com uma resposta como essa, e eles rebatem tudo no software. Você sempre deve caracterizar. Também não diminuí a sua votação, mas também não. Acredito que uma resposta ampla, como o software, arrisque os desenvolvedores mais novos a arriscarem seu hardware.
Kortuk
1

O retorno do interruptor pode durar dezenas de milissegundos. Se você estiver pesquisando um comutador a partir de uma rotina de interrupção que é executada em um temporizador, o ressalto não será um problema, porque, mesmo que você ocorra um questionário no meio de uma tempestade, você obterá o novo estado imediatamente , ou, na pior das hipóteses, obtenha o estado antigo e não verá o novo estado até a próxima pesquisa com base no cronômetro. A pesquisa de um ISR cronometrado como este constitui uma forma de debounce de software.

No entanto, se você estiver usando esse comutador para causar a interrupção, e espera que a rotina do serviço de interrupção seja executada rapidamente, em menos de 10 milissegundos, precisará de uma reativação de hardware; caso contrário, um evento de comutador poderá resultar em um número aleatório de interrompe e, certamente, muitas vezes mais do que o esperado. Por outro lado, se a rotina de interrupção for longa o suficiente, o retorno do switch será resolvido antes que o ISR termine, e você ficaria bem, mas os ISRs mais bem construídos não demoram tanto tempo.

JustJeff
fonte
Ter a opção de causar a interrupção é uma boa ideia. Mas depois de obtê-lo, não permita mais interrupções - desligue-as e inicie um cronômetro para o tempo especificado de devolução.
Lundin 11/11
@Lundin - se houver temporizadores disponíveis, você pode simplesmente usar o cronômetro para implementar a abordagem pesquisada e não se incomodar em fazer com que o comutador gere interrupções.
JustJeff
0

A melhor maneira de fazer qualquer coisa é a que melhor combina com você. Porém, quando você já possui um microcontrolador, pode debitar no software apenas pelo custo de um esforço de código.

A maneira mais essencial de debounce no software é verificar os botões nos momentos mais distantes do que o tempo de rejeição mais longo. 50 ms parece ser um limite superior no tempo de rejeição dos comutadores 'normais'; portanto, quando você pode organizar seu software dessa maneira, fica claro:

forever loop
   wait (at least) 50 ms
   check buttons
   do procesing
end loop
Wouter van Ooijen
fonte
E use os temporizadores no chip do seu MCU para isso.
Lundin 11/11
Claro que isso é possível, mas você pode escrever muitos programas sem.
Wouter van Ooijen 11/10
3
Software profissional em produtos de qualidade sempre usará temporizadores no chip. Os entusiastas podem se dar bem com algum "NOP" para pesquisas de loop ou espera em espera. Mas nunca há razão para fazer isso em produtos reais, independentemente de suas necessidades em tempo real. "Não sei como o timer funciona e esse loop morto leva 10 segundos para meu eu preguiçoso escrever" não é um argumento válido para um engenheiro.
Lundin 11/11
Bois. Os profissionais devem ser eficazes, o que (dependendo do projeto em questão) pode significar (entre outras coisas) 'usar o hardware com a maior eficácia possível' ou 'usar o tempo do profissional o mais eficaz possível'. Portanto, sua vinda certamente se aplica em alguns casos (provavelmente todos os casos com os quais você já lidou) e certamente não se aplica a todos os casos.
Wouter van Ooijen 11/10
A implementação do temporizador no chip leva no máximo uma hora do seu tempo. Isso dificilmente é algo complexo, é a engenharia diária de pão e manteiga. Você não pode nem investir uma hora em seu projeto para obter uma solução significativamente melhor e uma qualidade geral melhor? Sim, bem ... se você não sabe muito sobre programação, pode levar uma semana. Mas talvez você não deva trabalhar com software em primeiro lugar ... ou talvez deva trabalhar mais com ele, para aprender a implementar essa pequena coisa simples em pouco tempo.
Lundin
0

Uma abordagem para a rejeição que ainda não foi mencionada é o uso de um comutador de lançamento duplo com um lançamento vinculado ao VDD e o outro no chão. Alimente isso em um pino que (seja por software ou hardware) será puxado levemente para o seu estado atual. Essa abordagem fornecerá as vantagens de um comutador de lançamento duplo, mas exigirá apenas um pino de E / S em vez de dois.

supercat
fonte