Como os pinos de E / S não utilizados devem ser configurados no ATMega328P para menor consumo de energia?

15

Estou tentando reduzir o máximo de energia possível em uma placa Arduino que eu criei. Como os pinos de entrada não utilizados devem ser configurados? Já existem algumas respostas ( aqui , aqui ), mas estou procurando algo específico para o ATMega328P.

  1. Coloque o pino na entrada, o pino de acionamento alto para ativar a tração interna
  2. Coloque o pino na entrada, pino da unidade baixo
  3. Coloque o pino na entrada, puxe para fora
  4. Coloque o pino na entrada, puxe para baixo externo
  5. Defina o pino para saída baixa
  6. Defina o pino para saída alta
  7. Coloque o pino na saída baixa, puxe para baixo externo
geometrikal
fonte

Respostas:

12

Depois de pesquisar a folha de dados , encontrei o seguinte:

14.2.6 Pinos desconectados

Se alguns pinos não forem utilizados, é recomendável garantir que esses pinos tenham um nível definido. Mesmo que a maioria das entradas digitais esteja desativada nos modos de suspensão profunda, conforme descrito acima, as entradas flutuantes devem ser evitadas para reduzir o consumo de corrente em todos os outros modos em que as entradas digitais estão ativadas (Reset, modo ativo e modo inativo).

O método mais simples para garantir um nível definido de um pino não utilizado é habilitar a tração interna. Nesse caso, o pull-up será desativado durante a redefinição. Se o baixo consumo de energia durante a redefinição for importante, é recomendável usar um pull-up ou pull-down externo. A conexão de pinos não utilizados diretamente ao VCC ou GND não é recomendada, pois isso pode causar correntes excessivas se o pino for configurado acidentalmente como uma saída.

atualização em relação ao comentário / pergunta:

De acordo com a tabela 14-1, o resistor de pull-up estará ativo apenas quando as seguintes condições forem atendidas:

  1. O pino é definido como entrada (o bit DDxn é lógico baixo)
  2. PORTxn é definido com lógica alta
  3. O PUD é lógico baixo

A única maneira de obter uma corrente significativa fluindo através do resistor de pull-up é se o pino apresentar um nível baixo com o pull-up ativado. Isso significa que o Atmel estragou muito (improvável) ou você tem o pino configurado como entrada com o pull-up ativado e o pino está de alguma forma conectado ao terra.

A seção 14.2.5discute os modos de ativação e suspensão da entrada digital. Para resumir, a entrada digital é presa ao terra na entrada do Schmitt Trigger para evitar um nível flutuante enquanto estiver no modo de suspensão, a menos que o pino esteja configurado como uma interrupção externa. Não sei dizer se a saída digital está desativada no modo de suspensão. Não parece que está desativado, conforme a figura 14-2, embora eu não ficasse muito surpreso se estivesse. A melhor aposta é usar um resistor de pull-up interno ou externo.

helloworld922
fonte
obrigado, você acha que isso é melhor do que definir uma saída, em termos de energia usada? Alguma corrente flui através da tração interna? O dispositivo estará no modo de suspensão durante a maior parte do tempo.
geometrikal
resposta atualizada. Eu não acho que você terá muitos problemas com isso, mas a melhor aposta é seguir o conselho de Atmel.
precisa
10
  1. Coloque o pino na entrada, o pino de acionamento alto para ativar a tração interna : Acho que deve ler-se: " faça a entrada alta ativando a tração interna ". (Eu usaria a palavra "unidade" apenas se você o fizer ativamente, por meio de um FET para Vcc ou terra.) É claro que você deseja um nível definido, e a solicitação cuida disso. Certifique-se de que ativar a pull-up seja uma das primeiras coisas que você faz após a redefinição. Isso vale para a inicialização de E / S em geral. A única corrente será a corrente de fuga do NFET do par push-pull e o vazamento da porta do FET de entrada. Menos de 1 µA: OK.
  2. Coloque o pino na entrada, pino da unidade baixo : não é uma boa ideia. Se o software for bananas e mudar o pino para uma saída alta, você está fazendo um curto-circuito, danificando o PFET do par complementar.
  3. Coloque o pino na entrada, puxe para fora : é o mesmo que 1), apenas mais caro. Mas tem a vantagem de que o pull-up sempre estará lá; você pode esquecer de ativar a pull-up interna (que está desativada por padrão). Se a E / S alternar acidentalmente para saída baixa, você terá um pequeno consumo de corrente.
  4. Coloque o pino na entrada, puxe para baixo o externo : Novamente, o custo de um resistor (sim, eu sei que eles são baratos, mas baratos + desnecessários = caros.) A mesma corrente que em 3) se o pino ficar ativo alto.
  5. Defina o pino como saída baixa : possui uma corrente de fuga maior do que quando configurada como entrada, mas ainda abaixo de 1 µA, portanto não há com que se preocupar. Eu ainda permitiria o pull-up interno. Ele não estará ativo com a E / S como saída, mas se for acidentalmente alternado para entrada, o pino não permanecerá flutuando.
  6. Defina o pino como saída alta : o mesmo que 5)
  7. Defina o pino para saída baixa, pull-down externo : O resistor pull-down é um custo desnecessário: reduziria a saída, que já é baixa. Mas comparado a 5) tem a vantagem de ter certeza de que o pino não flutuará se não intencionalmente alternar para entrada.

Eu iria para 1): entrada com pull-up interno; não são necessárias peças externas. Em um FMEA 5), você pode se sair melhor, mas isso depende de quão alto você estima o risco de se esquecer de ativar a flexão interna. Uma revisão por pares de design de software deve oferecer seguro.

stevenvh
fonte
1

Os pinos geralmente não fazem uma enorme diferença. Você verá que cada pino também possui uma função específica - desative a função do pino

volatile uint8_t timer2sum; // see interrupt handler

void Initialize()
{
    // configure pin for output
    DDR_LED |= LED;

    // set Power Reduction Register
    PRR = (1<<PRTWI)     // turn off TWI
        | (1<<PRTIM0)    // turn off Timer/Counter0
        | (1<<PRTIM1)    // turn off Timer/Counter1 (leave Timer/Counter2 on)
        | (1<<PRSPI)     // turn off SPI
        | (1<<PRUSART0)  // turn off USART (will turn on again when reset)
        | (1<<PRADC);    // turn off ADC

    // select POWER SAVE mode for sleeping, which allows Timer/Counter2 to wake us up
    set_sleep_mode(SLEEP_MODE_PWR_SAVE);

    // configure Timer/Counter2 to wake us up as infrequently as possible
    TCCR2B |= (1<<CS22) | (1<<CS21) | (1<<CS20); // clock at 14400 Hz
    TIMSK2 |= (1<<TOIE2);                        // interrupt on overflow, 56.25 Hz
    timer2sum = 0;                               // see interrupt handler
    sei();                                       // enable interrupts
}

extraído de http://www.nerdkits.com/library/lowpowerexample/, que também usa os mesmos chips.

exussum
fonte