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() {}
Respuestas:
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.
fuente
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ó?
fuente
pinMode(P_UNUSED, INPUT_PULLUP);
no es suficiente, entonces WTF?pinMode(3, INPUT_PULLUP);
y lo mismo para 4 y 5 no hizo nada.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
ADCSRA
redujo 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.fuente