Estou tentando fazer com que um ATTiny85 fique sem bateria. Eu tenho clock de um cristal de 16.384 MHz, com o fusível de divisão por 8. Vcc é 3,3 volts. A Figura 22-7 na folha de dados diz que em modo inativo ( set_sleep_mode(SLEEP_MODE_IDLE); sleep_mode();
), ele deve consumir cerca de 300 µA. Na verdade, eu vejo isso se aproximando de 850 µA. Não consigo descobrir por que o consumo de energia é o dobro esperado. Desliguei tudo no PRR, exceto o timer0, que configurei para interromper a cada 25 ms. Portanto, ele deve passar a grande maioria de seu tempo no estado ocioso, o que é o melhor que posso fazer, pois ainda quero que os temporizadores sejam contados.
Os fusíveis são 0x7f, 0xdf, 0xff.
Aqui está o código que está sendo executado para este teste:
#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() {}
Respostas:
Você diz que, de acordo com a Figura 22-7 na folha de dados, ele deve consumir apenas 300µA, mas esse gráfico mostra o consumo atual para operação sem divisão de relógio. Um oscilador de cristal funcionando a 16MHz é obrigado a consumir mais corrente do que um funcionando a 2MHz, e o divisor de 3 estágios adicionará um pouco mais. A questão é - quanto mais?
A folha de dados também sugere que a corrente inativa pode ser reduzida dividindo o relógio, mas, novamente, não diz quanto será reduzido. Extrapolar a linha de 3,3V sugere que normalmente consumiria cerca de 1,5mA a 16,4MHz, e 850µA é uma redução significativa - mas deveria ser menor?
Se você não pode usar um cristal de frequência mais baixa nas placas que você vem, pode não haver nada que você possa fazer. No entanto, enquanto você tem o circuito em uma placa de ensaio, você pode pelo menos experimentar um cristal de 2 MHz, para ver se esse é realmente o problema.
fonte
Eu tive um problema semelhante com esse chip. O consumo de energia foi 30% superior ao esperado.
Os problemas não foram utilizados GPIO!
Eles foram configurados como entradas e deixados flutuando. A falta de um estado de entrada definido e claro fez o driver GPIO consumir muito mais do que o especificado.
A resposta foi ativar os pull-ups ou configurar pinos não utilizados como saídas.
Você tem certeza de que os pinos estão definidos corretamente? No seu código, parece que sim, mas você verificou?
fonte
pinMode(P_UNUSED, INPUT_PULLUP);
não for suficiente, então o WTF?pinMode(3, INPUT_PULLUP);
e o mesmo para 4 e 5 não fez nada.Gostaria de acrescentar que, para um projeto separado, fiz essa pergunta e a resposta também impactou dramaticamente essa pergunta. a limpeza
ADCSRA
reduziu o consumo inativo ao que a figura 22-6 diz que deveria levar - cerca de 100 µA a uma taxa de clock do sistema dividido de 500 kHz - e essa é a frequência de clock pós-dividida, não a freqüência de cristal.fonte