Previsto doppio consumo di energia ATtiny85


9

Sto cercando di far funzionare una batteria ATTiny85. L'ho sincronizzato da un cristallo da 16.384 MHz, con il set di fusibili divide per 8. Vcc è 3,3 volt. La Figura 22-7 nel foglio dati dice che al minimo ( set_sleep_mode(SLEEP_MODE_IDLE); sleep_mode();), dovrebbe assorbire circa 300 µA. In realtà, lo vedo disegnare più come 850 µA. Non riesco a capire perché il consumo energetico sia doppio. Ho disattivato tutto in PRR tranne Timer0, che ho configurato per interrompere ogni 25 ms. Quindi dovrebbe passare la maggior parte del tempo nello stato inattivo, che è il massimo che posso fare dato che voglio ancora contare i timer.

I fusibili sono 0x7f, 0xdf, 0xff.

Ecco il codice in esecuzione per questo test:

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

1
Hai ucciso il comparatore?
Ignacio Vazquez-Abrams,

1
Hai dato un'occhiata ad alcuni dei trucchi che ha fatto il ragazzo dei jeelab? Vedi qui (inizia a leggere in basso): jeelabs.org/tag/lowpower
RJR

1
@RJR Ho dato un'occhiata e, sfortunatamente, molti dei loro trucchi non funzioneranno perché posso usare SLEEP_MODE_IDLE solo perché devo mantenere il timer attivo. Questa applicazione è un orologio.
sabato

1
Se questo è un orologio, posso suggerire di scappare dall'oscillatore interno e usare un cristallo dell'orologio sul timer 2 per attivare l'interruzione del watchdog? È quindi possibile utilizzare il sonno profondo. Penso che ci sia anche un post sul blog di jeelab su questo da qualche parte.
RJR,

1
Tutto il google che vedo suggerisce che stanno usando un modulo RTC esterno. Se si dispone di un RTC, quindi sì, è possibile utilizzare il watchdog e l'oscillatore interno perché l'orologio della CPU non è importante. In questo caso, tuttavia, desidero la precisione del cristallo. Inoltre, questo è un ATTiny85: non esiste un timer 2, solo 0 e 1, e il timer 1 consuma un ordine di grandezza in più di potenza rispetto al timer 0. Non so come collegheresti un cristallo a un ATTiny senza eventuali componenti esterni extra diversi da come l'orologio di sistema.
sabato

Risposte:


6

Dici che secondo la Figura 22-7 nel foglio dati dovrebbe essere disegnato solo 300µA, ma quel grafico mostra il disegno corrente per il funzionamento senza divisione del clock. Un oscillatore a cristallo che funziona a 16 MHz è destinato ad assorbire più corrente di uno che funziona a 2 MHz e il divisore a 3 stadi aggiungerà un po 'di più. La domanda è: quanto altro?

Il foglio dati suggerisce anche che la corrente inattiva può essere ridotta dividendo l'orologio, ma ancora una volta non dice quanto sarà ridotto. Estrapolare la linea a 3,3 V suggerisce che normalmente assorbirebbe circa 1,5 mA a 16,4 MHz e 850 µA è una riduzione significativa - ma dovrebbe essere inferiore?

Se non è possibile utilizzare un cristallo a frequenza inferiore sulle schede in arrivo, potrebbe non esserci nulla che si possa fare. Tuttavia, mentre hai il circuito su una breadboard potresti almeno provare un cristallo da 2MHz, per vedere se questo è davvero il problema.

inserisci qui la descrizione dell'immagine


Ok. Mi mordo. Oggi vado al negozio e prendo un cristallo da 2 MHz e ri-fondo il chip per nessuna divisione dell'orologio e lo controllo.
sabato

Un'altra difficoltà è la necessità di 2 ^ x frequenze di cristallo. Sono andato al negozio e ne ho trovato uno a 4.096 MHz, ma 1.024 e 2.048 sono difficili da trovare. Ma non usare un orologio 2 ^ x rende difficile scegliere un valore di rivendita e OCR0A che si traduce in frazioni anche di un secondo interruzioni. Ma se 8.192 MHz diviso per 16 risparmia una potenza significativa, sarei sicuramente contento di quello oltre 16.384 diviso per 32.
oggi

2
Con un cristallo da 4.096 MHz in posizione e un valore di rivendita del clock della CPU di 8, ora assorbe circa 450 µA.
sabato

con qualche anno di ritardo, ma perché non acquistare un RTC e usare il suo PPS, spegnere il processore e farlo svegliare solo in caso di interruzione.
HilarieAK,

3

Ho avuto un problema simile con quel chip. Il consumo energetico è stato del 30% in più del previsto.

Il problema era inutilizzato GPIO!

Sono stati configurati come input e lasciati galleggianti. La mancanza di uno stato di input chiaramente definito ha fatto sì che il driver GPIO consumasse molto di più di quanto specificato.

La risposta è stata abilitare i pull-up o configurare pin inutilizzati come output.

Sei sicuro che i pin siano impostati correttamente? Nel tuo codice sembra di sì, ma hai controllato?


Bene, merda. Se pinMode(P_UNUSED, INPUT_PULLUP);non è abbastanza, allora WTF?
sabato

Sì, ma a volte questo non è sufficiente. Ad esempio, potresti avere pin che sono input ADC o input analogici per impostazione predefinita, indipendentemente dalla direzione programmata. Lì, devi prima disabilitare la funzione secondaria. Questo è ciò che intendevo per "controllo".
Blup1980,

Questo è un ATTiny85. Ci sono 6 pin, ma 3 sono RESET e i due pin xtal. Due di questi sono output e uno è P_UNUSED. L'intero ADC è stato esplicitamente spento. Proverò il trucco INPUT_PULLUP sugli altri 3 pin, ma sospetto che non cambierà nulla. Esiste un'errata per Tiny45 che parla di non impostare i pin xtal su OUTPUT a causa del consumo di energia.
sabato

L'aggiunta pinMode(3, INPUT_PULLUP);e lo stesso per 4 e 5 non hanno fatto nulla.
sabato

1

Vorrei aggiungerlo per un progetto separato, ho posto questa domanda e anche la risposta ha avuto un impatto drammatico su questa domanda. la cancellazione ha ADCSRAportato il consumo inattivo a ciò che la figura 22-6 dice che dovrebbe prendere - circa 100 µA con una frequenza di clock del sistema divisa di 500 kHz - e questa è la frequenza di clock post-divisa, non la frequenza dei cristalli.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.