Maneiras inteligentes de detectar um botão (que consome menos energia)


28

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:

esquemático

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?


5
Um pull-down de 10k consome quase nenhuma energia. 3.3V dá 330uA. E na maioria dos MCUs modernos, você tem a opção de definir um internamente, o que terá uma resistência ainda maior. Dito isto, você pode ativar o fornecimento de botão de um pino MCU através de um BJT ou MOSFET. Ative-o apenas durante a leitura e leia com a pesquisa.
Lundin

27
@Lundin Em termos "modernos", 330 A pode ser uma corrente alta ... #μ
awjlogan

6
de fato, muitos microcontroladores podem receber correntes de sono tão baixas quanto 2-10 μA. Perder 30 vezes mais que em um único pull-down é meio triste, especialmente em uma situação com bateria.
Whatsisname

1
O tamanho de um resistor que você pode usar em um pull-down depende da impedância do pino e da voltagem que eles alternam. Digamos que você tenha um pino de 3,3v em um estado de alta impedância que alterna em 2,4v, tudo o que você realmente precisa é de uma impedância ligeiramente menor que a entrada. Eu recomendo que você conecte um potenciômetro e meça o valor alto de um resistor que você pode usar para que o pino continue funcionando de maneira confiável e depois reduza em 20% o valor para manter uma margem.
Drunken Code Monkey

Respostas:


29

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.


É questionável por que você precisa do pull-up usando esta técnica. Sequência SWO Baixa, Leitura SWI, SWO Alta, Leitura SWI pode ser suficiente para saber se os pinos estão conectados juntos. Você também pode compartilhar o SWO entre vários switches.
Trevor_G

8
@Trevor Deixar a entrada flutuante quando o interruptor está aberto não é uma idéia particularmente boa. Dependendo da tecnologia, ele pode fazer com que o buffer de entrada consuma energia se a entrada estiver em um estado intermediário.
RoyC

1
@Trevor Multiplicando efetivamente o resistor pull-up pelo ciclo de trabalho sw1 sw2. Ainda é um esforço para nos levar de volta ao esquema 1. do OP. Pode funcionar em um ambiente de baixo ruído.
21417 RoyCatálogo

2
O fato de o MCU ter que ficar acordado para fazer a pesquisa em vez de depender de uma interrupção anula completamente qualquer economia de ciclos de trabalho mais curtos da chave?
18717 AndreKR 13/12

5
Olá @AndreKR, tínhamos um aplicativo de microcontrolador alimentado por bateria e ele precisava de vários comutadores conectados, por isso usamos essa técnica, pois era bastante fácil. Nós não tínhamos colocado um MCU apenas para detecção de switch. O MCU desenhou algo como 900nA no modo de suspensão entre suas interrupções de 10ms, para que as economias de pull-up valessem a pena.
TonyM

23

A SPDT ( S ingle P ole D ouble T hRow) Botão seria o botão ultra-eficiente.

insira a descrição da imagem aqui

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.


+1 .. ele sempre me escutas que SPDTs subminiature ou são muito difíceis de encontrar ou custo maneira muito ...
Trevor_G

1
@ Trevor Sim ... algumas coisas infelizmente são muito caras. Enquanto outros itens estão com preços baixos (MCU, por exemplo). Você não pode ter tudo.
Harry Svensson

Esta é uma ótima idéia. Infelizmente, não consegui encontrar um botão SPDT CMS que atendesse às minhas necessidades.
Porém

10

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).


Na verdade, o botão será um momentâneo, mas o tempo que será pressionado pode ser longa o suficiente (minutos)
vionyst

Se o dispositivo estiver ligado 24 horas por dia, 7 dias por semana, talvez alguns minutos ainda não sejam suficientes. O importante é o ciclo de serviço, 5 minutos a cada hora é 5 x 60/3600 = 8,3%. Assim, mesmo com uma corrente de 100 uA, o comutador consumiria 8,3 uA em média no meu cenário. Minha mensagem é: não se concentre muito na corrente que o comutador usa quando pressionado sem compará-lo com o consumo atual do sistema completo. Somente quando as contribuições são as mesmas, faz sentido melhorar o consumo atual do comutador. Não adianta fazer um comutador de 0,1 uA quando o MCU usa 1uA continuamente.
Bimpelrekkie

"Não adianta fazer um switch de 0,1 uA quando o MCU usa 1uA continuamente." isso soa fora. Eu acho que você quer dizer 1uA pico. 10% apenas para o interruptor seria excessiva;)
Trevor_G

@Trevor Sem pico, quero dizer 1uA de corrente média para o MCU, mas 0.1uA quando o interruptor é pressionado. Combinado com um comutador de 0,1 A que será pressionado apenas por períodos (relativamente) curtos, o comutador não contribui quase nada para o consumo médio total de energia, pois a corrente média será: 100% x 1 uA + 8,3% * 0,1 uA = 1,0083 uA (8,3% reutilizados a partir do comentário acima).
Bimpelrekkie

2
Sim, acabou de ler como se você quisesse dizer 0,1uA média no switch. O que não seria razoável para um dip-switch.
Trevor_G

10

Um método que usei tira proveito da natureza capacitiva das entradas do CMOS.

esquemático

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.


1
Isso parece muito vulnerável à EMI. Se alguma forma de energia de rádio entrar nesse circuito e eu acho que todas as apostas estão fora. Ainda bem que o material sem fio não é tão comum hoje em dia :)
Lundin

@Lundin não é tão ruim quanto você imagina. 30pF e um meg são um bom filtro.
Trevor_G

8

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.

esquemático

simular este circuito - esquemático criado usando o CircuitLab


3
Hmm, você pode criar / projetar um protótipo funcional disso e mostrar o benefício das soluções com um switch normal que estamos usando nos últimos 30 anos?
Bimpelrekkie

Certo. Eu adicionei um exemplo esquemático. Simplesmente construa isso. O benefício é que não há consumo de corrente zero da fonte no estado fechado ou aberto. As desvantagens incluem o controle deficiente do esforço necessário para ativar o comutador (um circuito ativo seria melhor, mas isso frustra os benefícios marginais do circuito), e é um design inovador em comparação ao design de comutador normal de 30 (300?) Anos de idade.
Heath Raftery

Ainda assim, minha calculadora possui muitos botões e funciona por pelo menos 5 anos em uma célula de moeda. Ainda sem ver como sua solução traria algum benefício para isso. Eu ainda acho que é uma "solução" para um problema inexistente. E mais caro também.
Bimpelrekkie

1
Oh, eu concordo! Ele atende aos critérios originais "consome o mínimo de energia possível", mas é difícil imaginar por que economizar menos de um milijoule é realmente útil.
precisa

A impedância de entrada do MCU não faz coisas desagradáveis ​​devido à alta impedância de saída do piezo?
Scott Seidman

5

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:

esquemático

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.


2

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.

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.