ATtiny85 se espera un doble consumo de energía

9

Estoy intentando que un ATTiny85 funcione con una batería. Lo tengo cronometrado desde un cristal de 16.384 MHz, con el conjunto de fusibles dividir por 8. Vcc es de 3,3 voltios. La figura 22-7 en la hoja de datos dice que en reposo ( set_sleep_mode(SLEEP_MODE_IDLE); sleep_mode(); ), debe dibujar alrededor de 300 µA. De hecho, lo veo dibujando más como 850 µA. No puedo entender por qué el consumo de energía es el doble esperado. He desactivado todo en PRR excepto el timer0, que he configurado para interrumpir cada 25 ms. Por lo tanto, debería pasar la mayor parte de su tiempo en estado inactivo, que es lo mejor que puedo hacer ya que todavía quiero que los temporizadores cuenten.

Los fusibles son 0x7f, 0xdf, 0xff.

Aquí está el código que se está ejecutando para esta prueba:

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

#define P0 0
#define P1 1
#define P_UNUSED 2

ISR(TIMER0_COMPA_vect) {
  // do nothing - just wake up
}

void setup() {
  power_adc_disable();
  power_usi_disable();
  power_timer1_disable();
  //PRR = _BV(PRADC) | _BV(PRTIM1) | _BV(PRUSI); // everything off but timer 0.
  TCCR0A = _BV(WGM01); // mode 2 - CTC
  TCCR0B = _BV(CS02) | _BV(CS00); // prescale = 1024
  // xtal freq = 16.384 MHz.
  // CPU freq = 16.384 MHz / 8 = 2.048 MHz
  // count freq = 2.048 MHz / 1024 = 2000 Hz
  OCR0A = 50; // 25 msec per irq
  TIMSK = _BV(OCIE0A); // OCR0A interrupt only.

  set_sleep_mode(SLEEP_MODE_IDLE);

  pinMode(P_UNUSED, INPUT_PULLUP);
  pinMode(P0, OUTPUT);
  pinMode(P1, OUTPUT);
  digitalWrite(P0, LOW);
  digitalWrite(P1, LOW);

  while(1) { sleep_mode(); }
}
void loop() {}
    
pregunta nsayer

3 respuestas

1

Me gustaría agregar que para un proyecto separado, le pregunté a esta pregunta , y la respuesta también impactó dramáticamente esta pregunta. eliminar ADCSRA redujo el consumo de inactividad a lo que en la figura 22-6 dice que se supone que debe tomar - alrededor de 100 µA a una velocidad de reloj de sistema dividida de 500 kHz - y esa es la frecuencia de reloj dividida, no la frecuencia de cristal. p>     

respondido por el nsayer
6

Dice que de acuerdo con la Figura 22-7 en la hoja de datos, solo debe dibujar 300µA, pero esa gráfica muestra el dibujo actual para la operación sin división de reloj. Un oscilador de cristal que se ejecuta a 16 MHz está obligado a consumir más corriente que uno que se ejecute a 2 MHz, y el divisor de 3 etapas agregará un poco más. La pregunta es: ¿cuánto más?

La hoja de datos también sugiere que la corriente inactiva puede reducirse dividiendo el reloj hacia abajo, pero de nuevo no dice cuánto se reducirá. La extrapolación de la línea de 3.3 V sugiere que normalmente consumiría aproximadamente 1.5 mA a 16.4MHz, y 850µA es una reducción significativa, pero ¿debería ser menos?

Si no puede usar un cristal de baja frecuencia en las tarjetas que viene, es posible que no haya nada que pueda hacer. Sin embargo, mientras tiene el circuito en una placa de pruebas, al menos podría probar un cristal de 2 MHz, para ver si ese es realmente el problema.

    
respondido por el Bruce Abbott
3

Tuve un problema similar con ese chip. El consumo de energía fue un 30% más de lo esperado.

¡Los problemas no fueron utilizados por GPIO!

Se configuraron como entradas y se dejaron flotando. La falta de un estado de entrada claramente definido hizo que el controlador GPIO consumiera mucho más de lo que se especifica.

La respuesta fue habilitar los pull-ups o configurar los pines no utilizados como salidas.

¿Estás seguro de que los pines están configurados correctamente? En su código parece que sí, pero lo comprobó?

    
respondido por el Blup1980

Lea otras preguntas en las etiquetas