ATtiny85 consumo de energia dobro esperado


9

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() {}

11
Você matou o comparador?
Ignacio Vazquez-Abrams

11
Você já deu uma olhada em alguns dos truques que o cara dos jeelabs fez? Veja aqui (comece a ler na parte inferior): jeelabs.org/tag/lowpower
RJR

11
@RJR Dei uma olhada e, infelizmente, muitos de seus truques não funcionam porque eu só posso usar SLEEP_MODE_IDLE porque preciso manter o cronômetro funcionando. Esta aplicação é um relógio.
Nsayer 11/08/14

11
Se for um relógio, posso sugerir que o oscilador interno funcione e use um cristal de relógio no timer 2 para disparar a interrupção do watchdog? Você pode então dormir profundamente. Eu acho que há um post no jeelabs sobre isso em algum lugar também.
RJR

11
Todo o Google que vejo sugere que eles estão usando um módulo RTC externo. Se você possui um RTC, sim, pode usar o watchdog e o oscilador interno porque o relógio da CPU não é importante. Nesse caso, no entanto, quero a precisão do cristal. E também, este é um ATTiny85 - não há cronômetro 2, apenas 0 e 1, e o cronômetro 1 consome uma ordem de magnitude mais potente que o cronômetro 0. Não sei como você ligaria um cristal a um ATTiny sem quaisquer componentes externos extras que não sejam o relógio do sistema.
Nsayer

Respostas:


6

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.

insira a descrição da imagem aqui


Está bem. Eu vou morder. Hoje vou à loja, pego um cristal de 2 MHz e re-funde o chip para não haver divisão de clock e verificá-lo.
Nsayer

Outra dificuldade é a necessidade de 2 ^ x frequências de cristal. Fui à loja e encontrei uma de 4.096 MHz, mas é difícil encontrar 1.024 e 2.048. Mas não usar um relógio 2 ^ x torna difícil escolher um valor de pré-escala e OCR0A que resulta em frações pares de segundos. Mas se 8.192 MHz dividido por 16 economiza energia significativa, eu certamente ser feliz com que mais de 16.384 dividido por 32.
nsayer

2
Com um cristal de 4.096 MHz no lugar e um valor de pré-escala de clock da CPU de 8, ele agora extrai cerca de 450 µA.
Nsayer 12/08/14

alguns anos atrasado, mas por que não comprar um RTC e usá-lo em PPS, dorme duramente o processador e deixa-o acordar apenas com interrupção.
HilarieAK

3

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?


Bem, merda. Se pinMode(P_UNUSED, INPUT_PULLUP);não for suficiente, então o WTF?
Nsayer

Sim, mas às vezes isso não é suficiente. Por exemplo, você pode ter pinos que são entrada ADC ou entrada analógica por padrão, independentemente da direção programada. Lá, você primeiro precisa desativar a função secundária. Isso é o que eu quis dizer com "checando".
precisa saber é o seguinte

Este é um ATTiny85. Existem 6 pinos, mas 3 deles são RESET e os dois pinos xtal. Dois deles são saídas e um é P_UNUSED. Todo o ADC foi explicitamente desligado. Vou tentar o truque INPUT_PULLUP nos outros 3 pinos, mas suspeito que não mude nada. Há uma errata para o Tiny45 que fala em não definir os pinos xtal como OUTPUT devido ao consumo de energia.
Nsayer

Adicionar pinMode(3, INPUT_PULLUP);e o mesmo para 4 e 5 não fez nada.
Nsayer

1

Gostaria de acrescentar que, para um projeto separado, fiz essa pergunta e a resposta também impactou dramaticamente essa pergunta. a limpeza ADCSRAreduziu 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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.