¿Cómo deben configurarse los pines de E / S no utilizados en ATMega328P para el menor consumo de energía?

15

Estoy tratando de reducir la potencia tanto como sea posible en una placa Arduino que he creado. ¿Cómo deben configurarse los pines de entrada no utilizados? Hay algunas respuestas (Ya aquí , aquí ) para esto, pero busco algo específico para el ATMega328P.

  1. Ajuste el pin a la entrada, coloque el pin en alto para activar el pull-up interno
  2. Ajuste el pin a la entrada, el pin de unidad bajo
  3. Ajuste el pin a la entrada, pull up externo
  4. Ajuste el pin a la entrada, extracción externa
  5. Establecer pin para salida baja
  6. Establecer pin para salida alta
  7. Ajuste el pin a salida baja, extracción externa
Geometrikal
fuente

Respuestas:

12

Después de buscar en la hoja de datos , encontré esto:

14.2.6 Pines desconectados

Si algunos pines no se utilizan, se recomienda asegurarse de que estos pines tengan un nivel definido. Aunque la mayoría de las entradas digitales están deshabilitadas en los modos de reposo profundo como se describió anteriormente, se deben evitar las entradas flotantes para reducir el consumo de corriente en todos los demás modos donde las entradas digitales están habilitadas (Restablecer, modo activo y modo inactivo).

El método más simple para garantizar un nivel definido de un pin no utilizado es habilitar el pull-up interno. En este caso, el pull-up se desactivará durante el reinicio. Si el bajo consumo de energía durante el reinicio es importante, se recomienda utilizar un pull-up o pull-down externo. No se recomienda conectar los pines no utilizados directamente a VCC o GND, ya que esto puede causar corrientes excesivas si el pin se configura accidentalmente como una salida.

actualización en relación al comentario / pregunta:

Según la tabla 14-1, la resistencia pull-up solo está activa cuando se cumplen las siguientes condiciones:

  1. El pin se establece como entrada (el bit DDxn es lógicamente bajo)
  2. PORTxn tiene una lógica alta
  3. PUD es lógica baja

La única forma en que obtendrá una corriente significativa a través de la resistencia pull-up es si el pin experimenta un nivel bajo con el pull-up habilitado. Esto significa que Atmel está muy mal (poco probable) o que tiene el pin configurado como entrada con el pull-up habilitado y el pin está conectado de alguna manera a tierra.

La sección 14.2.5trata sobre la activación de entrada digital y los modos de suspensión. Para resumir, la entrada digital está sujeta a tierra en la entrada del disparador Schmitt para evitar un nivel flotante mientras está en modo de suspensión, a menos que el pin esté configurado como una interrupción externa. No puedo decir si la salida digital está desactivada en el modo de suspensión. No parece que esté deshabilitado según la figura 14-2, aunque no me sorprendería demasiado si lo fuera. La mejor opción es usar una resistencia pull-up interna o externa.

helloworld922
fuente
gracias, ¿crees que esto es mejor que configurar una salida, en términos de potencia utilizada? ¿Fluye alguna corriente a través del pull-up interno? El dispositivo estará en modo apagado durante la mayor parte del tiempo.
geometrikal
respuesta actualizada No creo que tenga demasiados problemas para que sea una salida, pero la mejor opción es seguir el consejo de Atmel.
helloworld922
10
  1. Ajuste el pin a la entrada, coloque el pin alto para activar el pull-up interno : creo que esto debería leer: " haga que la entrada sea alta al activar el pull-up interno ". (Usaría la palabra "conducir" solo si lo hace activamente, por medio de un FET a Vcc o tierra). Está claro que desea un nivel definido, y el pull-up se encarga de eso. Asegúrese de habilitar el pull-up es una de las primeras cosas que hace después de reiniciar. Eso va para la inicialización de E / S en general. La única corriente será la corriente de fuga del NFET del par push-pull y la fuga de la compuerta de la entrada FET. Menos de 1 µA: OK.
  2. Establezca el pin en la entrada, el pin de la unidad está bajo : no es una buena idea. Si el software se vuelve loco y cambia el pin a una salida alta, está cortando el pin, dañando el PFET del par complementario.
  3. Establezca el pin en la entrada, extracción externa : es lo mismo que 1), solo que más caro. Pero tiene la ventaja de que el pull-up siempre estará ahí; puede olvidarse de habilitar el pull-up interno (que está deshabilitado de manera predeterminada). Si la E / S cambiara accidentalmente a salida baja, tendrá un pequeño consumo de corriente.
  4. Establezca el pin en la entrada, extracción externa : nuevamente el costo de una resistencia (sí, sé que son baratos, pero baratos + innecesarios = caros). La misma corriente que en 3) si el pin iría a activo alto.
  5. Establezca el pin en salida baja : tiene una corriente de fuga más alta que cuando está configurada como entrada, pero aún por debajo de 1 µA, por lo que no hay nada de qué preocuparse. Todavía habilitaría el pull-up interno. No estará activo con la E / S como salida, pero si se cambiara accidentalmente a entrada, el pin no permanecería flotando.
  6. Establezca el pin en salida alta : igual que 5)
  7. Establezca el pin en salida baja, extracción externa : la resistencia de extracción es un costo innecesario: haría una salida baja, que ya es baja. Pero en comparación con 5) tiene la ventaja de que está seguro de que el pin no flotará si se cambia a la entrada sin querer.

Yo iría por 1): entrada con pull-up interno; No se requieren piezas externas. En un FMEA 5) puede que le vaya mejor, pero eso depende de qué tan alto calcule el riesgo de que se olvide de habilitar el pull-up interno. Una revisión por pares de diseño de software debería brindarle un seguro.

stevenvh
fuente
1

Los pines generalmente no hacen una gran diferencia. Verá que cada pin también tiene una función específica: deshabilite la función del pin

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
}

tomado de http://www.nerdkits.com/library/lowpowerexample/ que también usan los mismos chips.

exussum
fuente