¿Cuánta corriente se supone que debe tomar un ATtiny84 apagado?

2

Sé que esto suena como una pregunta estúpida, pero me pregunto si la hoja de datos tiene un error o algo así.

Tengo un ATtiny84 conectado a la fuente de alimentación de mi banco para 3 voltios. Está fusionado para el oscilador RC interno de 8 MHz y un reloj de división por 8. Sin perro guardián, sin detector de apagón.

8 de los pines de E / S están conectados a ánodos LED, con los cátodos conectados a tierra a través de resistencias de 0 ohmios (sí, el ciclo de trabajo es bajo. No teman). Uno de ellos está conectado a un botón con el otro lado conectado a tierra. Dos de ellos (compartidos con MOSI y SCK del ISP) no están conectados (aparte del ISP que está desconectado para esta prueba).

configuración:

void setup() {

  power_adc_disable();
  power_usi_disable();
  power_timer1_disable();
  ACSR = _BV(ACD);
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);

  pinMode(BUTTON_PIN, INPUT_PULLUP);
  pinMode(UNUSED_1, OUTPUT);
  digitalWrite(UNUSED_1, LOW);
  pinMode(UNUSED_2, OUTPUT);
  digitalWrite(UNUSED_2, LOW);
  for(int i = 0; i < 8; i++) {
    pinMode(LED_PINS[i], OUTPUT);
    digitalWrite(LED_PINS[i], LOW);
  }
  while(1) sleep_mode();
}

El resultado es 240 µA de consumo de corriente. Esto se mide con un µCurrent Gold, por lo que tengo confianza en la precisión.

La hoja de datos (figura 21-1) dice que al apagar a 25 ° C, el chip debería tomar más como 100 nA.

WTF?

Para referencia, aquí está la función de suspensión real utilizada por el código (pero no es parte de esta prueba):

void sleepNow() {
  // All LEDs off
  for(int i = 0; i < 8; i++) {
    digitalWrite(LED_PINS[i], LOW);
  }
  cli();
  power_timer0_disable();
  PCMSK0 |= _BV(PCINT5);
  GIMSK |= _BV(PCIE0);
  sleep_enable();
  sei();
  sleep_cpu();
  sleep_disable();
  PCMSK0 &= 0xff ^ _BV(PCINT5);
  GIMSK &= 0xff ^ _BV(PCIE0);
  power_timer0_enable();
  button_debounce_time = millis();
  ignoring_button = 1;
  place_in_pattern = -1;
  milli_of_next_act = 0;
}

Produce el mismo consumo de corriente, por lo que reduje esta prueba a solo poner el chip a dormir en el menor código posible.

El esquema:

Para esta prueba, la batería está ausente y se están alimentando 3.00 voltios a los pines Vcc y GND del encabezado del ISP. No hay otros pines ISP conectados.

He repetido este experimento con un ATTiny85 en una placa de pruebas. Lo programé con esto:

#include <avr/sleep.h>
#include <avr/power.h>

void setup() {
  PRR = 0xff;
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);

  pinMode(0, OUTPUT);
  digitalWrite(0, LOW);
  pinMode(1, OUTPUT);
  digitalWrite(1, LOW);
  pinMode(2, OUTPUT);
  digitalWrite(2, LOW);
  pinMode(3, OUTPUT);
  digitalWrite(3, LOW);
  pinMode(4, OUTPUT);
  digitalWrite(4, LOW);
  while(1) { sleep_mode(); digitalWrite(2, HIGH); }
}

void loop() {}

Luego lo fusioné para un reloj interno de 1 MHz y luego lo desconecté todo, excepto la alimentación y la conexión a tierra. El resultado: 240 µA.

Ahora, todo esto se explicaría si el gráfico en la figura 22-11 (esta es la hoja de datos ATTiny85 ahora) tuviera el eje mal etiquetado y estuviera realmente en mA en lugar de µA. La corriente de apagado frente a Vcc y la temperatura que estoy usando las líneas a la derecha con el gráfico 3 órdenes de magnitud más alta.

¿ alguien ha conseguido que un ATTiny extraiga menos de un micro-amplificador (aparte de desconectar la alimentación)? ¿Alguien puede escribir un boceto que haga que ATTiny no haga nada, sino simplemente irse a dormir de forma permanente, consumiendo la menor cantidad de energía posible sin nada conectado, excepto energía y tierra? Eso es lo que he estado tratando de hacer, y claramente hay algo que me estoy perdiendo y me condenarán si puedo averiguar de qué se trata.

    
pregunta nsayer

3 respuestas

2

Este comentario en reddit me señaló a esta página , que dice que borrar el bit ADEN en ADCSRA arroja tantos µA como el exceso actual en mis equipos de prueba . Estoy lejos del laboratorio ahora mismo, pero cuando llegue a casa esta noche, eso es lo primero que intentaré. Soy optimista. Sé que el bit ADEN se establece en init() en wiring.c ...

Si está confirmado, la lección es que PRR no es suficiente para desactivar el ADC por completo.

EDITAR: Está confirmado. La única advertencia añadida es que el orden importa. ADCSRA debe escribirse antes PRR .

Mi boceto sleep_tiny_sleep (último arriba) ahora toma < 100 nA.

    
respondido por el nsayer
1

¿Está seguro de que sleep_mode() puede poner todo en ese modo de apagado de 100 nA?

Una explicación simple es que no va tan profundo.

dice

  

Como la macro sleep_mode () puede causar condiciones de carrera en algunos   Situaciones, los pasos individuales de manipulación del permiso de sueño (SE).   bit, y en realidad la emisión de la instrucción SLEEP, se proporcionan en el   macros sleep_enable() , sleep_disable() y sleep_cpu() much.

Por lo tanto, desaconsejan el uso de sleep_mode()

Incluso si sleep_mode() regresa con un error, está en un while(1) por lo que podría estar dando vueltas y vueltas.

Tal vez cambie while (1) sleep_mode (); en algo como

while(1) {
    sleep_mode();
    blink LED
}

y ver si el LED está encendido. Si tiene un osciloscopio, mire el pin y vea qué sucede.

Editar:
Un enfoque sería mirar la hoja de datos de ATTiny84 y ver qué periférico podría estar consumiendo tanta corriente.

240µA es tan grande, puede ser más de una causa; ningún periférico en la hoja de datos parece lo suficientemente grande como para consumir tanto.

Los resensadores de extracción de pin de E / S internos podrían tener fugas suficientes para alcanzar ese orden de magnitud, así que trate de asegurarse de que estén apagados.

    
respondido por el gbulmer
0

Esto no me parece la secuencia de sueño adecuada ...

  1. Establece el modo de suspensión
  2. deshabilitar interrupciones globales
  3. condición para dormir (si ...)
  4. habilitar el sueño
  5. habilitar interrupciones globales
  6. dormir cpu
  7. deshabilitar la suspensión (esto se ejecuta después de una interrupción externa)

Intenta esto e informa de nuevo.

    
respondido por el user34920

Lea otras preguntas en las etiquetas