Konsumsi daya ATtiny85 dua kali lipat diharapkan

9

Saya mencoba untuk mendapatkan ATTiny85 untuk menjalankan baterai. Saya memilikinya clock dari kristal 16,384 MHz, dengan set sekering divide-by-8. Vcc adalah 3,3 volt. Gambar 22-7 dalam datasheet mengatakan bahwa saat idle ( set_sleep_mode(SLEEP_MODE_IDLE); sleep_mode();), ia harus menggambar sekitar 300 μA. Sebenarnya, saya melihatnya menggambar lebih seperti 850 μA. Saya tidak tahu mengapa konsumsi daya dua kali lipat dari yang diharapkan. Saya telah mematikan semuanya dalam PRR kecuali untuk timer0, yang telah saya konfigurasikan untuk menginterupsi setiap 25 ms. Jadi itu harus menghabiskan sebagian besar waktunya dalam keadaan diam, yang merupakan yang terbaik yang bisa saya lakukan mengingat saya masih ingin penghitung waktu menghitung.

Sekeringnya adalah 0x7f, 0xdf, 0xff.

Berikut kode yang sedang dijalankan untuk tes ini:

#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() {}
tidak doa
sumber
1
Apakah Anda membunuh pembanding?
Ignacio Vazquez-Abrams
1
Pernahkah Anda melihat beberapa trik yang dilakukan pria jeelab itu? Lihat di sini (mulai membaca di bagian bawah): jeelabs.org/tag/lowpower
RJR
1
@RJR Saya melihatnya, dan sayangnya banyak trik mereka tidak berfungsi karena saya hanya dapat menggunakan SLEEP_MODE_IDLE karena saya perlu menjaga timer tetap berjalan. Aplikasi ini adalah jam.
nsayer
1
Jika ini adalah jam, dapatkah saya menyarankan menjalankan osilator internal dan menggunakan kristal arloji pada timer 2 untuk menyalakan interupsi pengawas? Anda kemudian dapat menggunakan tidur nyenyak. Saya pikir ada posting blog jeelab tentang itu di suatu tempat juga.
RJR
1
Semua googling yang saya lihat menunjukkan bahwa mereka menggunakan modul RTC eksternal. Jika Anda memiliki RTC, maka, ya, Anda dapat menggunakan watchdog dan osilator internal karena jam CPU tidak penting. Namun dalam hal ini, saya ingin keakuratan kristal. Dan juga, ini adalah ATTiny85 - tidak ada timer 2, hanya 0 dan 1, dan timer 1 mengkonsumsi urutan kekuatan yang lebih besar daripada timer 0. Saya tidak tahu bagaimana Anda akan menghubungkan kristal ke ATTiny tanpa setiap komponen eksternal tambahan selain sebagai jam sistem.
nsayer

Jawaban:

6

Anda mengatakan bahwa menurut Gambar 22-7 dalam lembar data, ia seharusnya hanya menggambar 300μA, tetapi grafik itu menunjukkan gambar saat ini untuk operasi tanpa pembagian jam. Osilator kristal yang berjalan pada 16MHz terikat untuk menarik lebih banyak arus daripada yang berjalan di 2MHz, dan pembagi 3 tahap akan menambah sedikit lebih banyak. Pertanyaannya adalah - berapa banyak lagi?

Datasheet juga menunjukkan bahwa saat ini idle dapat dikurangi dengan membagi jam ke bawah, tetapi sekali lagi ia tidak mengatakan berapa banyak itu akan berkurang. Mengekstrapolasi garis 3.3V menunjukkan bahwa biasanya akan menarik sekitar 1.5mA pada 16.4MHz, dan 850μA adalah pengurangan yang signifikan - tetapi haruskah itu kurang?

Jika Anda tidak dapat menggunakan kristal frekuensi yang lebih rendah pada papan yang Anda miliki maka mungkin tidak ada yang bisa Anda lakukan. Namun, saat Anda memiliki sirkuit di papan tempat memotong roti, Anda setidaknya bisa mencoba kristal 2MHz, untuk melihat apakah itu benar-benar masalahnya.

masukkan deskripsi gambar di sini

Bruce Abbott
sumber
Baik. Saya akan gigit. Saya akan pergi ke toko hari ini dan mengambil kristal 2 MHz dan menggabungkan kembali chip tanpa pembagian jam dan memeriksanya.
nsayer
Kesulitan lain adalah kebutuhan frekuensi kristal 2 x x. Saya pergi ke toko dan menemukan yang 4.096 MHz, tetapi 1.024 dan 2.048 sulit ditemukan. Tetapi tidak menggunakan jam 2 ^ x membuatnya sulit untuk memilih nilai prescale dan OCR0A yang menghasilkan fraksi genap dari interupsi kedua. Tetapi jika 8.192 MHz dibagi dengan 16 menghemat daya yang signifikan, saya pasti akan senang dengan itu lebih dari 16.384 dibagi dengan 32.
nsayer
2
Dengan kristal 4.096 MHz di tempatnya dan nilai prescale clock CPU sebesar 8, sekarang menarik sekitar 450 μA.
nsayer
beberapa tahun terlambat, tetapi mengapa tidak membeli RTC dan menggunakan PPS itu, sulit tidur prosesor dan hanya membangunkan pada interupsi.
HilarieAK
3

Saya punya masalah serupa dengan chip itu. Konsumsi daya adalah 30% lebih dari yang diharapkan.

Masalahnya adalah GPIO yang tidak digunakan!

Mereka dikonfigurasikan sebagai input dan dibiarkan mengambang. Kurangnya keadaan input yang jelas tidak membuat driver GPIO mengkonsumsi lebih banyak dari yang ditentukan.

Jawabannya adalah untuk mengaktifkan pull-up atau mengkonfigurasi pin yang tidak digunakan sebagai output.

Apakah Anda yakin pin diatur dengan benar? Dalam kode Anda sepertinya begitu, tetapi apakah Anda memeriksa?

Blup1980
sumber
Yah, sial. Jika pinMode(P_UNUSED, INPUT_PULLUP);tidak cukup, lalu WTF?
nsayer
Ya, tapi terkadang ini tidak cukup. Misalnya, Anda mungkin memiliki pin yang merupakan input ADC atau input analog secara default, terlepas dari arah yang Anda program. Di sana, Anda harus terlebih dahulu menonaktifkan fungsi sekunder. Itulah yang saya maksud dengan "memeriksa".
Blup1980
Ini adalah ATTiny85. Ada 6 pin, tetapi 3 di antaranya adalah RESET dan dua pin xtal. Dua di antaranya adalah output dan satu adalah P_UNUSED. Seluruh ADC telah dimatikan secara eksplisit. Saya akan mencoba trik INPUT_PULLUP pada 3 pin lainnya, tetapi saya curiga tidak akan mengubah apa pun. Ada errata untuk Tiny45 yang berbicara tentang tidak mengatur pin xtal ke OUTPUT karena konsumsi daya.
nsayer
Menambahkan pinMode(3, INPUT_PULLUP);dan yang sama untuk 4 dan 5 tidak melakukan apa pun.
nsayer
1

Saya ingin menambahkan itu untuk proyek yang terpisah, saya menanyakan pertanyaan ini , dan jawabannya secara dramatis mempengaruhi pertanyaan ini juga. kliring ADCSRAmembawa konsumsi idle ke apa yang menurut angka 22-6 mengatakan itu seharusnya mengambil - sekitar 100 μA pada laju jam sistem terbagi 500 kHz - dan itulah frekuensi jam pasca-dibagi, bukan frekuensi kristal.

tidak doa
sumber