ATtiny85 consumo de energía doble esperado

9

Estoy tratando de hacer que un ATTiny85 funcione con una batería. Lo tengo sincronizado con un cristal de 16.384 MHz, con el conjunto de fusibles dividir por 8. Vcc es 3.3 voltios. La Figura 22-7 en la hoja de datos dice que en inactivo ( set_sleep_mode(SLEEP_MODE_IDLE); sleep_mode();), debería 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 doblemente esperado. Apagué todo en PRR excepto el timer0, que configuré para interrumpir cada 25 ms. Por lo tanto, debería pasar la gran mayoría de su tiempo en el estado inactivo, que es lo mejor que puedo hacer dado que todavía quiero que cuenten los temporizadores.

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() {}
nsayer
fuente
1
¿Mataste al comparador?
Ignacio Vazquez-Abrams
1
¿Has echado un vistazo a algunos de los trucos que hizo el tipo jeelabs? Vea aquí (comience a leer en la parte inferior): jeelabs.org/tag/lowpower
RJR
1
@RJR Eché un vistazo, y desafortunadamente muchos de sus trucos no funcionarán porque solo puedo usar SLEEP_MODE_IDLE porque necesito mantener el temporizador en funcionamiento. Esta aplicación es un reloj.
nsayer
1
Si se trata de un reloj, ¿puedo sugerir que se salga del oscilador interno y se use un cristal de reloj en el temporizador 2 para disparar la interrupción del perro guardián? Entonces puedes usar el sueño profundo. Creo que también hay una publicación de blog de jeelabs sobre eso en alguna parte.
RJR
1
Todos los google que veo sugieren que están usando un módulo RTC externo. Si tiene un RTC, entonces, sí, puede usar el watchdog y el oscilador interno porque el reloj de la CPU no es importante. En este caso, sin embargo, quiero la precisión del cristal. Y también, este es un ATTiny85: no hay un temporizador 2, solo 0 y 1, y el temporizador 1 consume un orden de magnitud más potencia que el temporizador 0. No sé cómo conectarías un cristal a un ATTiny sin cualquier componente externo adicional que no sea el reloj del sistema.
nsayer

Respuestas:

6

Usted dice que de acuerdo con la Figura 22-7 en la hoja de datos, solo debería extraer 300 µA, pero ese gráfico muestra el consumo actual para la operación sin división de reloj. Un oscilador de cristal que funciona a 16MHz está destinado a generar más corriente que uno que funciona a 2MHz, 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 se puede reducir dividiendo el reloj, pero nuevamente no dice cuánto se reducirá. La extrapolación de la línea de 3.3V sugiere que normalmente consumiría aproximadamente 1.5mA a 16.4MHz, y 850µA es una reducción significativa, pero ¿debería ser menor?

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

ingrese la descripción de la imagen aquí

Bruce Abbott
fuente
Okay. Morderé. Iré a la tienda hoy y recogeré un cristal de 2 MHz y volveré a fusionar el chip sin división de reloj y lo comprobaré.
nsayer
Otra dificultad es la necesidad de 2 ^ x frecuencias de cristal. Fui a la tienda y encontré uno de 4.096 MHz, pero 1.024 y 2.048 son difíciles de encontrar. Pero no usar un reloj 2 ^ x hace que sea difícil elegir un valor de preescala y OCR0A que dé como resultado fracciones pares de una segunda interrupción. Pero si 8.192 MHz dividido por 16 ahorra una potencia significativa, ciertamente estaría contento con eso sobre 16.384 dividido por 32.
nsayer
2
Con un cristal de 4.096 MHz en su lugar y un valor de preescala de reloj de CPU de 8, ahora consume alrededor de 450 µA.
nsayer
Unos años más tarde, pero ¿por qué no comprar un RTC y usar su PPS?
HilarieAK
3

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

El problema fue GPIO no utilizado!

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

La respuesta fue habilitar los pull-ups o configurar 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ó?

Blup1980
fuente
Pues mierda. Si pinMode(P_UNUSED, INPUT_PULLUP);no es suficiente, entonces WTF?
nsayer
Sí, pero a veces esto no es suficiente. Por ejemplo, puede tener pines que son entrada ADC o entrada analógica por defecto, independientemente de la dirección que programe. Allí, primero debe deshabilitar la función secundaria. Eso es lo que quise decir con "comprobación".
Blup1980
Este es un ATTiny85. Hay 6 pines, pero 3 de ellos son RESET y los dos pines xtal. Dos de ellos son salidas y uno está P_UNUSED. Todo el ADC ha sido explícitamente apagado. Probaré el truco INPUT_PULLUP en los otros 3 pines, pero sospecho que no cambiará nada. Hay una errata para el Tiny45 que habla de no configurar los pines xtal a OUTPUT debido al consumo de energía.
nsayer
Sumar pinMode(3, INPUT_PULLUP);y lo mismo para 4 y 5 no hizo nada.
nsayer
1

Me gustaría agregar que para un proyecto separado, hice esta pregunta , y la respuesta también impactó dramáticamente esta pregunta. La compensación ADCSRAredujo el consumo inactivo a lo que la figura 22-6 dice que se supone que debe tomar, alrededor de 100 µA a una frecuencia de reloj del sistema dividida de 500 kHz, y esa es la frecuencia de reloj posterior a la división, no la frecuencia de cristal.

nsayer
fuente