Estou trabalhando em um projeto baseado em AVR de bateria de baixa energia que integra alguns dispositivos diferentes, incluindo uma faixa de neopixel e um duende Adafruit . Quando o dispositivo geral está inativo, eu gostaria que ele usasse menos de 0,1 mA para maximizar a vida útil da bateria do LiPo.
Consegui tudo isso funcionando (medido 0,035mA), mas não tenho certeza se fiz necessariamente da maneira "certa" e pretendo construir um produto com base nisso, para que eu faça o que é certo.
(Não mostrado: um diodo flyback para o relé)
A principal preocupação que tenho é a alimentação "parasitária" dos dispositivos quando o VCC é desconectado por meio da corrente que flui dos pinos de dados. Por exemplo, o Pixie (que se comunica via serial), não possui o modo de desligamento e mesmo quando "off" é drenado por um miliampère. Então, coloquei um pequeno relé para desconectar seu VCC e descobri que o pino serial ainda estava realmente alimentando o duende. Dicas em outros lugares sugeriram que muitos chips possuem um diodo que desvia seus pinos de entrada digital para o VCC como proteção de energia. Para resolver isso, tive que suspender a biblioteca serial e digitalWrite (PIN, LOW) durante o sono.
O mesmo ocorre com o VCC WS2812b, que desconecta a tira, ainda permite que o dispositivo seja alimentado pelo pino de dados. E em outros projetos, quando desconectei o GND com um MOSFET de canal N, vi o inverso - um fluxo de corrente de retorno através da linha de dados para o terra! (Isso teve que ser resolvido com um diodo por post no PJRC.) Os WS2812b na verdade demoram cerca de um miliampere cada, mesmo quando estão apagados,
Portanto, a pergunta: existe uma maneira geral e "limpa" de desconectar o VCC e o GND das partes de um projeto durante a suspensão do sistema quando houver pinos de dados no mix. Qual é a melhor prática?
Algumas ideias:
- Força o VCC ao GND (não sabe ao certo como? Hbridge?). (Se eu fizer isso, o que acontece com os pinos de dados que estão altos?)
- Coloque um buffer de três estados entre todos os pinos de dados e esses dispositivos e, durante o sono, coloque o buffer de três estados em um estado de alta impedância, desconecte o VCC ou o GND apenas com o mosfet P ou N
- Desconecte o GND apenas com o N mosfet e coloque diodos em todos os pinos de dados
- Existe algum tipo de trava de energia que desconecta o VCC e o GND e os coloca em um estado de "alta impedância" (como um buffer de três estados para energia?) Dessa forma, a corrente não tem como fluir "fora" das linhas de dados.
Alguém pode me esclarecer sobre a maneira mais limpa e repetível de lidar com esse tipo de problema de "desconexão de carga"? (Escusado será dizer que passei horas pesquisando esse problema com pouca sorte, embora tenha encontrado esta nota técnica sobre troca de carga, mas ela não trata de alimentação parasitária e de energia parasitária)
Respostas:
Quando faço isso, geralmente uso comutadores analógicos CMOS nas linhas de dados afetadas.
Algo como o ADG812 possui 4 canais de comutadores SPST que são facilmente adequados para uma lógica bastante rápida e fornecem uma impedância realmente alta entre os nós do comutador quando estão no estado desligado.
O bom disso é que a técnica funciona para linhas de dados unidirecionais e bidirecionais.
Essas partes também funcionam com um sorriso brilhante:
A sequência usual para desligar:
Desativar comutadores de caminho de dados
Desligue o domínio.
Ligar é o oposto, é claro.
[Atualizar]
Estes são de fato conhecidos por outros nomes, como portões de passagem e portões de transmissão .
Eles são significativamente diferentes de um buffer de três estados verdadeiro (como você pode ver no diagrama no link acima), mas para a lógica comum, o efeito é melhor (este é inerentemente um dispositivo bidirecional), mas com menor potência.
fonte
Se os sinais de dados estiverem conectados ao seu microcontrolador, você pode simplesmente torná-los com alta impedância, configurando esses pinos como entradas. (Se o outro chip usa muito pouca energia, você pode tratar seu Vcc como um sinal de dados.)
Caso contrário, você pode usar comutadores analógicos (chips lógicos 74x66) para desconectá-los. Para sinais unidirecionais, 74x125 também funcionaria.
fonte
Infelizmente, não acho que exista um tamanho único para toda a estratégia. Troque a energia para os subsistemas como você já fez. No software, os pinos da unidade são baixos para os estados de baixa energia, a menos que isso cause uma condição de estado estável de alta energia. Nesse caso, mova o pino alto. Nunca deixe as entradas flutuarem. Poder de seqüência conforme necessário para estabelecer condições iniciais seguras.
fonte
Você não tem essa opção - você é forçado a usar E / S serial assíncrona. Alguns microcontroladores permitem uma abordagem semelhante à do I2C para resolver o problema. Se você pode programar o pino de saída serial para ser somente pull-down, em vez do pull-up-for-1, pull-down-0 mais comum , você pode adicionar um resistor de pull-up ao Vcc comutado para estabelecer uma lógica alta.
Essa solução não é tão robusta quanto a sua abordagem atual, mas deve resolver o problema de alimentar novamente os módulos de E / S do AVR. Não é realmente uma solução "limpa", mas é muito mais segura para os microcontroladores em seus módulos de E / S.
simular este circuito - esquemático criado usando o CircuitLab
fonte