Durante uma reunião para um projeto em particular, fui solicitado a pensar na maneira de detectar um toque em um botão com um MCU. A detecção deve consumir o mínimo de energia possível. À primeira vista, pensei no circuito típico com uma subida ou descida:
simular este circuito - esquemático criado usando o CircuitLab
Não considero alguns recursos anti-rejeição aqui, pois isso está além do escopo desta pergunta. Em qualquer um dos casos, quando o botão é pressionado, o valor total da corrente que flui depende do valor do resistor. Para minimizá-lo (a corrente), eu poderia aumentar o valor do resistor, mas não tanto, pois, se eu estiver certo, isso também depende do valor de vazamento do pino de entrada. Além disso, um grande resistor se recuperaria lentamente.
Minha pergunta é a seguinte: quais são as maneiras inteligentes de detectar um botão pressionado que não consome energia (normalmente para um aplicativo que consome muita energia)? Existem métodos que mal consomem energia quando o botão é pressionado?
fonte
Respostas:
Um método de baixa corrente que usei uma vez foi conectar um switch entre dois pinos de E / S do microcontrolador.
Uma E / S foi configurada como uma saída (SWO). O segundo foi configurado como uma entrada (SWI) com seu pull-up interno programável ativado.
O estado do comutador era amostrado com pouca frequência (a cada 10 ms) por uma rotina de interrupção de software. A sequência de leitura foi: drive SWO baixo, leia SWI, drive SWO alto.
Isso significava que um interruptor pressionado consumia apenas a corrente de pull-down do SWI e o SWO por menos de 1 nós durante a varredura, enquanto um interruptor não pressionado não consumia corrente. Esse consumo atual de <1 us a cada 10 ms resultou em um pequeno consumo médio médio de corrente.
fonte
A SPDT ( S ingle P ole D ouble T hRow) Botão seria o botão ultra-eficiente.
Fonte: http://www.ni.com/white-paper/3960/en/
No seu caso, o 1P iria para o MCU, o 1T para o VCC, o 2T para o GND.
fonte
Quanto tempo o botão será pressionado? Se não for um interruptor de alavanca (que mantém seu estado), mas um interruptor momentâneo, a corrente que flui quando o botão é pressionado é irrelevante devido ao pouco tempo em que o botão é realmente fechado.
Qualquer um dos dois circuitos que você mostra está OK, não importa.
Você pode supor que o vazamento de entrada e / ou a corrente em uma entrada do MCU sejam desprezíveis . Atualmente, todos os MCUs estão na tecnologia CMOS e possuem uma corrente de entrada praticamente nula. Então pare de considerar, não está lá.
Em vez de usar um resistor externo, você também pode usar o resistor de pull-up interno em muitas entradas do MCU. Esse resistor pode ter um valor relativamente baixo (talvez 50 kohm), portanto uma pequena corrente fluirá quando o botão for pressionado.
Você pode usar com segurança até 1 resistor de Mohm para um pull-up / pull-down. Somente em ambientes muito "sujos" (eletricamente falando), você pode precisar de um valor mais baixo. Você também pode colocar um capacitor de 100 nF em paralelo com o comutador para suprimir a interferência de outros circuitos próximos.
Dica profissional: Reserve um local para esse capacitor na PCB, mas não monte uma tampa. ainda. Em caso de problemas: coloque-o e veja se isso ajuda.
Para detectar o estado do comutador, use polling (como na resposta de TonyM) ou use uma interrupção . Depende da aplicação qual é melhor para o consumo de energia (do MCU).
fonte
Um método que usei tira proveito da natureza capacitiva das entradas do CMOS.
simular este circuito - esquemático criado usando o CircuitLab
No circuito acima do interruptor, quando fechado, permite que o resistor de pull-down carregue / descarregue as capacitâncias de entrada do GPIO até o nível do solo.
O truque desse circuito é usar a natureza bidirecional de um GPIO para manter a entrada carregada em um nível lógico alto quando o comutador estiver aberto.
A rotina de controle periodicamente desliga o pino como um nível alto, ou permite brevemente a tração, tempo suficiente para manter a carga das tampas. O pino de entrada atua como um bit de memória dinâmica e, na maioria dos dispositivos, retém essa carga por um período considerável e utilizável.
Quando configurada corretamente, se o botão for pressionado, a carga no pino descarregará mais rápido que a taxa de atualização. Essa condição pode ser detectada como parte do algoritmo de atualização como uma operação de leitura antes da atualização ou usada para acionar uma interrupção.
A energia é usada brevemente durante o pulso de atualização, tanto para recarregar os capacitores quanto através do resistor e alternar se estiver fechado. No entanto, o comprimento do pulso de atualização é curto e a frequência de polling faz com que a corrente de atualização seja relativamente insignificante.
Obviamente, este método é ativo. Se o micro for colocado no modo de suspensão, o estado do interruptor será indeterminado ao acordar. O primeiro ciclo de atualização após a ativação deve ignorar a leitura dos pinos. Além disso, este método não deve ser usado para ativar o micro. Antes de ir para a cama, também é aconselhável habilitar o pino como saída baixa para estacioná-lo em um estado de corrente zero.
Para ler mais switches estáticos, como dip-switches de configuração, uma rotina dedicada pode ser usada em vez de um ciclo de atualização contínuo. Após a leitura, os pinos do GPIO devem ser "estacionados" em um estado ativo de baixa saída (corrente zero) para evitar o problema de entradas flutuantes.
NOTA: Essa técnica sofre um pouco de sensibilidade ao ruído se os comprimentos dos traços forem longos e viajarem por uma área barulhenta. Como tal, R1 deve estar próximo ao pino de entrada. No entanto, eu não o recomendaria para conectar um interruptor a alguma distância de um painel frontal em algum lugar, a menos que você adicione capacitância extra próxima ao pino.
fonte
Se o botão for um interruptor piezo, a única energia necessária será a energia gerada pressionando o botão.
Por exemplo: R2 / C1 coleta a energia produzida pressionando o piezo. D1 evita que a tensão C1 fique muito alta. R1 drena C1 quando o botão é liberado. O MCU GPIO deve estar no modo de entrada, sem puxar. Voilà, o botão detecta com zero consumo de corrente da fonte.
simular este circuito - esquemático criado usando o CircuitLab
fonte
Se o dispositivo precisar permanecer indefinidamente em qualquer um dos estados, o uso de um comutador SPDT será a abordagem de menor potência, uma vez que um circuito estático pode ser feito para extrair corrente além de seu próprio vazamento interno e do comutador. Uma vantagem adicional dos comutadores SPDT é que eles podem ser quase perfeitamente recuperados, não importa a rapidez com que sejam operados ou quão frágeis os contatos possam ser, desde que apenas um contato pare de saltar antes que o outro leia pela primeira vez como fechado.
Existem duas boas abordagens para conectar esses comutadores:
simular este circuito - esquemático criado usando o CircuitLab
A primeira abordagem requer um resistor a menos que o segundo, mas a segunda será mais tolerante à sobreposição entre os dois pólos (ela consumirá uma corrente mais alta do que o habitual, mas não impedirá o fornecimento). Observe que, se o comutador puder entrar em um estado moderadamente resistivo por um período prolongado, isso poderá queimar uma corrente significativamente mais alta do que o normal, mas durante o uso normal, nenhum dos resistores carregará corrente significativa, exceto durante o breve momento entre o o interruptor muda de estado e a saída responde.
fonte
Use o pull-up interno do microcontrolador e, quando a impressora for detectada, desative-o. Em seguida, reative-o ocasionalmente brevemente para verificar o estado do botão.
fonte