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.