Generador de interrupción de baja potencia

Mi objetivo es generar una interrupción en un procesador Atmega328P cada segundo más o menos, usando un consumo de corriente promedio sustancialmente menor que el temporizador de vigilancia incorporado.


Puede ver en la hoja de datos que con el temporizador de vigilancia activado, el consumo de corriente a 5 V y 25 °C es de alrededor de 6,5 µA:

Actual con vigilancia habilitada

Con él deshabilitado, hemos bajado a alrededor de 100 nA:

Actual con vigilancia desactivada

Algo intermedio, digamos 1 µA, podría resultar en un funcionamiento sustancialmente más prolongado con una batería, pero aún permitir que el procesador se active y verifique cosas como el nivel de luz actual, la temperatura, ese tipo de cosas.


He estado experimentando con esto:

circuito de vigilancia

La idea es que el condensador se cargue rápidamente (50 µs) a través de la resistencia que limita la corriente a unos 22 mA (suponiendo que funcione a 5 V por el momento). Luego, la salida pasa a alta impedancia y esperamos una interrupción descendente para activar el procesador y solucionarlo.


Código de prueba:

const byte capacitor = 2;
const byte LED = 13;

volatile byte fired = true;

void myISR ()
  {
  digitalWrite (LED, HIGH);
  fired = true;
  }

void setup() 
  {
  pinMode (LED, OUTPUT);
  attachInterrupt (0, myISR, FALLING);
  }

void loop() 
{
  if (fired)
    {
    delay (1000);
    digitalWrite (LED, LOW);
    digitalWrite (capacitor, HIGH);
    pinMode (capacitor, OUTPUT);
    delayMicroseconds (50);
    EIFR = bit (INTF0);  // clear flag for interrupt 0
    pinMode (capacitor, INPUT);  // high impedance
    digitalWrite (capacitor, LOW);
    fired = false;
    }  // end of if fired
}

Este código no tiene el código de suspensión, no es realmente relevante para la pregunta.


Las pruebas indican que esto da un retraso de aproximadamente 970 ms desde que empiezo a cargar el capacitor hasta que se dispara la interrupción, que es lo que quiero.


Las preguntas

  • ¿Es esta la mejor manera (o al menos una forma razonable) de generar una señal de despertador temporizada con un consumo mínimo de energía?

  • Calculo que el consumo medio sería:

    22 mA / (1 / 50 µs) = 1.1 µA
    

    ¿Eso parece correcto? ¿O es incluso menos ya que el capacitor tomaría menos corriente mientras se carga? Como, aproximadamente la mitad de eso?

Con su esquema, es probable que el tiempo del flanco descendente varíe mucho, dependiendo de la temperatura del uC, la suciedad en el tablero, etc. Ni siquiera hay una garantía real de que el flanco descendente ocurra, ya que podría haber alguna condición en la que la fuga de VCC domine sobre la fuga a tierra cuando el pin uC está en estado de Z alto.
No estoy demasiado preocupado por la precisión exacta. Siempre podía comprobar un chip RTC de vez en cuando. En cuanto al punto sobre el borde descendente, ¿sería útil tener una resistencia desplegable? Probé 1 M en ese momento, y eso redujo drásticamente el intervalo de tiempo (a 50 ms). Hay otra pregunta relacionada en la que Olin Lathrop dijo que hizo un temporizador con "algunos transistores y resistencias y condensadores de alto valor". Sin embargo, no hay otros detalles.
Los 970 ms que estás midiendo implican una fuga equivalente a unos 4,3 megaohmios; agregar una resistencia adicional de menor valor reducirá al menos a la mitad el tiempo de caída. Pero también debería hacer que la descomposición sea más consistente.

Respuestas (2)

Este esquema no solo depende del voltaje de suministro, como ha notado, sino que también depende de la geometría de nivel atómico precisa de los transistores de entrada, específicamente su umbral de fuga y voltaje.

Si desea una potencia aún más baja que el WDT, entonces debería considerar usar un reloj de cristal y el temporizador asíncrono. La hoja de datos establece el consumo de energía típico para este método en 0,8 µA a 1,8 V y 0,9 µA a 3 V, lo que hace que una extrapolación de 1,1 µA a 5 V sea muy razonable.

Bueno, ahora me siento como un eneldo. Por un lado, mi circuito básicamente estaba midiendo una entrada flotante, lo cual es una idea tonta. También tenía un código para hacer exactamente lo que sugeriste aquí . Se me había olvidado que tiene un rendimiento bastante bueno. Medí un consumo de corriente de 1,46 µA si funciona con una fuente de alimentación de 5 V y 1,1 µA si funciona con una fuente de alimentación de 3,3 V. Aún así, estoy interesado en la afirmación de Olin Lathrop de que "cuando los perros guardianes incorporados tomaban unos pocos µA, hice uno externo que usaba solo unos pocos 100 nA".

Considere usar un procesador separado, como el PIC12LF1571 . Su consumo actual es:

Typical sleep current is 30 nA @ 25 °C (maximum 270 nA @ 85 °C)
Typical WDT takes an additional 550 nA @ 25 °C (maximum 750 nA @ 85 °C)  

Total: typical 850 nA @ 25 °C, and maximum 1.02 µA @ 85 °C.

El WDT puede cronometrar desde 1 ms hasta 256 (1 s es una de las opciones). Todo lo que necesita agregar es una tapa de desacoplamiento. Es una pieza de 3.3V.

El chip cuesta alrededor de 75 centavos y viene en paquetes DIP, SOIC o MSOP de 8 pines .