Conexão do botão de pressão a um pino do controlador


8

Esse problema tem décadas, mas não vejo uma resposta direta neste site. Eu quero o seguinte:

insira a descrição da imagem aqui

Este circuito apenas permite verificar o estado do botão de dentro do microcontrolador. Nada chique. Minhas perguntas:

  1. Existe algo melhor que esse design simples?
  2. O valor do resistor de 100 quilo ohms é adequado para os dispositivos CMOS atuais, como o dsPIC30FXXXX e não para uma aplicação de alta potência?

2
1) Na verdade não, a menos que você esteja procurando por devolução de hardware. 2) sim
NickHalden

Respostas:


6

Primeiro, muitos microcontroladores e controladores de sinal digital terão resistores pull up internos. Aqui está um exemplo, um Atmel ATMega164.Porta GPega ATMega164p

Normalmente, haverá um registro que permite ativar e desativar os pull ups internos. Devido a variações no processo de fabricação, esses pullups internos têm uma gama muito ampla e não são uma boa opção se você precisar de um controle muito próximo do consumo de corrente em aplicações de ultra baixa potência. Se é importante manter a contagem baixa de componentes, é uma maneira fácil de fazê-lo. Usar pull ups internos para debounce de hardware não seria uma boa ideia, pois não é possível prever o valor exato.

Se os 100kΩvalor é adequado depende. Se for apenas uma opção que será ativada periodicamente por um usuário, 100kΩseria uma boa opção para minimizar o consumo de energia. Para coisas que mudarão mais rapidamente, como codificadores rotativos, o processo pelo qual eu passaria é

  1. Encontre a corrente máxima do coletor na folha de dados
  2. Calcular um valor pull up usando a Lei de Ohm
  3. Escolha um resistor de tamanho padrão, alguns tamanhos maiores, dependendo da velocidade realmente necessária
  4. Teste e veja se o tamanho do resistor escolhido fornece os tempos de subida e descida necessários
  5. Ajuste de acordo

Portanto, se a corrente máxima do coletor por pino GPIO fosse 10 mA e operasse em 5V: R=VI=5V10mA=500Ω. Manter esse valor R o mais pequeno possível permitirá bordas mais nítidas e frequências de comutação mais altas.


Você está dizendo que, devido à capacitância do fio / rastreio, você terá um circuito RC que causará atrasos na propagação do sinal para o uC e que, com um R maior, esses atrasos na propagação podem realmente causar a leitura incorreta de um codificador rotativo?
angelatlarge

Sim, as reatâncias parasitárias são apenas um fato da vida que precisa ser tratado cada vez mais à medida que a frequência aumenta.
Matt Young

Interessante! Estou confuso: assumindo que a capacitância paracítica é menor que 1 uF, dado um resistor de 100k Ohms e assumindo 0,1uF de parasita C, obtemos uma constante de tempo em torno de 23mS (entrada = 5V, saída = 4,5V). Em outras palavras, em um circuito de 5V, o uC verá 4,5V na entrada em um pulso crescente em menos de 25ms. Para que o uC perca isso (supondo que não esteja pesquisando), o codificador estaria gerando pulsos a 40Hz ou mais. É algo com que devemos nos preocupar?
angelatlarge

A capacitância parasitária está tipicamente na faixa nano ou pico Farad. Isso se torna um problema com codificadores rotativos em velocidades mais altas. Considere um codificador óptico que produz 24 pulsos por rotação e gira a 1500 RPM. As ondas quadradas de saída serão de 600Hz com um período de cerca de 1,2ms. Isso ainda é lento o suficiente para que a retirada de tamanho mínimo seja desnecessária, mas 100kΩlevaria a tempos de subida e descida improváveis. Vale a pena fazer uma pergunta por si só.
Matt Young

Verdadeiro e verdadeiro. Eu estava pensando em codificadores rotativos manuais.
angelatlarge

4

Você pode ficar mais simples que isso.

Basta usar um resistor pull-up / pull-down interno no seu microcontrolador.

100k é adequado, mas os pullups internos podem ser um pouco menores em alguns MCUs; por exemplo, no AVR atmega8, são 30-80kOhm para pull-up de redefinição e 20-50kOhm para todos os outros pinos de E / S.


Você não pode dizer que 100k é adequado. Não há recibo universal, você deve calcular o valor de acordo com o MCU e o dispositivo que aciona o pino do outro lado.
Blup1980

1
A pessoa que fez a pergunta especificou um botão. Não vejo problema com esta resposta.
mjh2007

1
  1. Existe algo melhor que esse design simples?


    Melhor não pode ser respondido sem critérios específicos contra os quais você não forneceu. Na maioria dos casos, a topologia exibida é boa. Duas variações podem ser "melhores", dependendo da situação:

    Muitos microcontroladores possuem pullups internos em alguns de seus pinos. Estes destinam-se exatamente a esse tipo de situação. O resistor é interno ao micro e você define um pouco para habilitá-lo. A única parte externa necessária é apenas o próprio botão.

    Outra variante útil a ser lembrada é para projetos de baixa potência, nos quais o botão pode ser um interruptor que pode ser fechado por longos períodos de tempo. Nesse caso, você deseja minimizar a corrente média de longo prazo através do resistor de pullup. Você o torna o maior possível, mas existem limites e inconvenientes para torná-lo grande demais. Em vez disso, você ativa o pullup por apenas alguns µs de cada vez para fazer uma leitura de botão. Se você verificar o botão a cada 1 ms e o pullup estiver ativado por 10 µs, a corrente de pullup média será reduzida em 100x. Com um resistor externo, você usa outro pino para acionar a parte superior da tração. Com um pullup interno, você o ativa / desativa no firmware, conforme necessário.

  2. O valor do resistor de 100 quilo ohms é adequado para os dispositivos CMOS atuais, como o dsPIC30FXXXX e não para uma aplicação de alta potência?


    Eu já respondi isso extensivamente aqui .


0

Melhor do que esse design simples? Sim. Jogue um boné nele e você terá um simples interruptor rebocado por hardware.

insira a descrição da imagem aqui

O capacitor seria uma tampa de cerâmica comum de 0,1uf. O Resistor seria um 10k. Este site tem todos os detalhes sobre o porquê. Em resumo, um circuito de retorno evita que o microcontrolador registre falsamente várias pressionamentos quando você pressiona o botão. A configuração do resistor / capacitor suaviza o ressalto mecânico do botão, para que seja uma transição constante.


As tampas eletrolíticas não gostam de ser atingidas. Uso regularmente 100nF, o que funciona bem para meus aplicativos.
jippie

1
@jippie o símbolo era o que a imagem tinha, mas uma cerâmica de 100nf ou 0,1uf é o que é necessário.
quer

3
Este não é um bom circuito de rebate. Primeiro, isso apenas denuncia uma quebra, não uma marca. Quando o botão é pressionado, a tampa é colocada em curto imediatamente. Segundo, a constante de tempo de 1 ms é muito curta para ser muito útil. Terceiro, isso só deve ser alimentado em uma entrada de gatilho Schmidt. Entradas normais não gostam de sinais subindo lentamente. Apenas deixe de fora a tampa e faça a depuração no firmware, o que você precisaria fazer mesmo com a tampa.
precisa

Sim, no make, a tampa é imediatamente cortada em curto, mas qualquer recarga por causa do ressalto é filtrada com passe baixo, removendo quaisquer efeitos do ressalto. Talvez com mais precisão, o debounce on make seja um mecanismo muito diferente do debounce on break. Um ms é muito rápido. Não gosto de usar este circuito por inúmeras razões. No entanto, se você estiver conduzindo uma interrupção com o pino em questão, rebater no firmware geralmente não é a melhor solução. Mover para um DPST e rebater com um flipflop SR é um método muito bom para esse caso.
Scott Seidman

0

EDIT - o comentário que fiz abaixo foi feito para acompanhar o que Olin havia dito mais tarde sobre o circuito com um capacitor para supostamente adicionar debounce. Me desculpe, parece que parece estar no lugar errado - talvez alguém possa consertar isso, porque eu sou obviamente muito cego ou estúpido para ver como eu deveria ter feito isso !!

Eu concordo com Olin - ele não fornece um bom retorno. Eu também acrescentaria que o curto-circuito do capacitor pode causar um grande aumento de corrente que pode redefinir o microprocessador se o layout da PCB não for realmente bom. Alguns interruptores precisam de uma corrente úmida para operar corretamente e de maneira confiável e 100k pode ser muito alto para alguns interruptores (especialmente interruptores de membrana).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.