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() {}
Jawaban:
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.
sumber
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?
sumber
pinMode(P_UNUSED, INPUT_PULLUP);
tidak cukup, lalu WTF?pinMode(3, INPUT_PULLUP);
dan yang sama untuk 4 dan 5 tidak melakukan apa pun.Saya ingin menambahkan itu untuk proyek yang terpisah, saya menanyakan pertanyaan ini , dan jawabannya secara dramatis mempengaruhi pertanyaan ini juga. kliring
ADCSRA
membawa 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.sumber