Maneiras apropriadas de desconectar CIs durante estados de baixa energia para evitar o fornecimento de parasitas / backfeed

10

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.

insira a descrição da imagem aqui (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:

  1. 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?)
  2. 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
  3. Desconecte o GND apenas com o N mosfet e coloque diodos em todos os pinos de dados
  4. 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)

Jeremy Gilbert
fonte
Ya isso é super chato, eu realmente vi casos onde o poder atingir um pino GPIO podem transformar um AVR (execução de código), mesmo sem poder atingir os pinos VCC ...
vicatcu
2
Observação engraçada: eu fiz mais algumas pesquisas no google desde que postei essa pergunta e essa pergunta no SE surgiu como uma classificação superior. O Google indexou esta página em menos de 10 minutos.
Jeremy Gilbert
Somente comentário: Os interruptores de isolamento adequados, conforme sugerido por outros, são a melhor solução quando uma tensão remota não pode ser eliminada. PODE ser que o uso de diodos Schottky para inserir pinos com cátodos comuns e geralmente em Vcc e fixados ao terra quando o isolamento seja necessário, proporcionará a eliminação adequada de tensões de impedância de alta intensidade. Obviamente, a fixação de Schottky em uma linha de alimentação com baixa impedância pode estragar o seu dia.
Russell McMahon
Provavelmente o Hi-Z-ing de todas as suas conexões de alguma maneira (pinos tri-state µC, buffers tri-state, comutadores analógicos, o que for), como sugeriram Peter Smith e CL, é a melhor aposta. Qual dos métodos é melhor, não tenho certeza. De qualquer forma: por que você usa um relé para a comutação, e não um P-MOSFET (ou um N-MOSFET inferior), embora a comutação inferior provavelmente seja um pouco mais difícil aqui)?
FlashCactus

Respostas:

5

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.

ADG812 fora do vazamento

O bom disso é que a técnica funciona para linhas de dados unidirecionais e bidirecionais.

Essas partes também funcionam com um sorriso brilhante:

Requisitos de energia do ADG812

A sequência usual para desligar:

  1. Desativar comutadores de caminho de dados

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

Peter Smith
fonte
Perdoe a ignorância da pergunta, mas isso é marcadamente diferente de um buffer de três estados? (E obrigado pela resposta!)
Jeremy Gilbert
Estes também são conhecidos como "portões de passagem"
vicatcu
3

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.

CL.
fonte
Você realmente não precisa aumentá-las em Z, basta reduzir as linhas GPIO do micro.
DoxyLover
1
Isso seria mais perigoso se o outro chip pudesse aumentar o sinal.
CL.
Só para que eu entenda perfeitamente, trocar os pinos pelas entradas é sempre o mesmo que colocá-las em um estado de alta impedância? Isso é generalizado para a maioria dos MCUs ou apenas os AVRs? Esse estado é o mesmo do 74x125 quando o OE está desativado?
Jeremy Gilbert
@JeremyGilbert Todas as entradas CMOS têm alta impedância (são portas MOSFET, que se comportam como capacitores muito pequenos). Uma saída '125 desativada não tem porta, mas a diferença é insignificante.
CL.
1
@JeremyGilbert As entradas geralmente são de alto Z na maioria dos aplicativos; afinal, é difícil sentir alguma coisa quando você está dirigindo a linha. Dito isto, com os AVRs pelo menos (e provavelmente outros também, mas eu não sei os detalhes), você deve observar os pullups internos: se o pino estiver no modo de entrada (configurado via DDRx) e você escrever LOW para (via PORTx), está no modo Hi-Z normal. No entanto, se você escrever ALTO no modo de entrada, o pullup interno será ativado e, de fora do pino, parecerá um resistor de ~ 50K ao VCC, em vez de uma linha flutuante.
precisa saber é o seguinte
1

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.

vicatcu
fonte
1


I2C

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.

esquemático

simular este circuito - esquemático criado usando o CircuitLab

glen_geek
fonte