Bagaimana pin I / O yang tidak digunakan harus dikonfigurasi pada ATMega328P untuk konsumsi daya terendah?

15

Saya mencoba mengurangi daya sebanyak mungkin di papan Arduino yang saya buat. Bagaimana seharusnya pin input yang tidak digunakan dikonfigurasi? Ada beberapa jawaban (di sini , sini ) sudah untuk ini, tapi saya sedang mencari sesuatu yang spesifik untuk ATMega328P.

  1. Atur pin ke input, drive pin tinggi untuk melakukan pull-up internal
  2. Setel pin ke input, pin drive rendah
  3. Atur pin ke input, tarik eksternal
  4. Atur pin ke input, tarik eksternal ke bawah
  5. Setel pin ke output rendah
  6. Setel pin ke output tinggi
  7. Atur pin ke output rendah, tarik eksternal ke bawah
geometrikal
sumber

Jawaban:

12

Setelah menggali datasheet , saya menemukan ini:

14.2.6 Pin Tidak Terhubung

Jika beberapa pin tidak digunakan, disarankan untuk memastikan bahwa pin ini memiliki level yang ditentukan. Meskipun sebagian besar input digital dinonaktifkan dalam mode tidur nyenyak seperti dijelaskan di atas, input mengambang harus dihindari untuk mengurangi konsumsi saat ini di semua mode lain di mana input digital diaktifkan (mode Reset, mode aktif dan mode diam).

Metode paling sederhana untuk memastikan level pin yang tidak terpakai, adalah mengaktifkan pull-up internal. Dalam hal ini, pull-up akan dinonaktifkan selama reset. Jika konsumsi daya rendah selama reset penting, disarankan untuk menggunakan pull-up atau pull-down eksternal. Menghubungkan pin yang tidak digunakan secara langsung ke VCC atau GND tidak disarankan, karena ini dapat menyebabkan arus berlebih jika pin secara tidak sengaja dikonfigurasi sebagai output.

pembaruan terkait dengan komentar / pertanyaan:

Menurut tabel 14-1, resistor pull-up hanya aktif ketika kondisi berikut dipenuhi:

  1. Pin diatur sebagai input (bit DDxn adalah logika rendah)
  2. PORTxn disetel ke logika tinggi
  3. PUD adalah logika rendah

Satu-satunya cara Anda akan mendapatkan arus signifikan mengalir melalui resistor pull-up adalah jika pin mengalami level rendah dengan pull-up diaktifkan. Ini berarti Atmel kacau (tidak mungkin) atau Anda memiliki pin yang dikonfigurasi sebagai input dengan pull-up diaktifkan dan pin entah bagaimana terhubung ke ground.

Bagian 14.2.5membahas input digital memungkinkan dan mode tidur. Untuk meringkas, input digital dijepit ke tanah di input Schmitt Trigger untuk mencegah tingkat mengambang saat dalam mode tidur, kecuali pin dikonfigurasi sebagai interupsi eksternal. Saya tidak tahu apakah output digital dinonaktifkan dalam mode tidur. Sepertinya tidak dinonaktifkan menurut gambar 14-2, meskipun saya tidak akan terlalu terkejut jika itu. Taruhan terbaik adalah dengan menggunakan resistor pull-up internal atau eksternal.

helloworld922
sumber
terima kasih, apakah Anda pikir ini lebih baik daripada mengatur ke output, dalam hal daya yang digunakan? Apakah ada arus yang mengalir melalui internal pull-up? Perangkat akan berada dalam mode tidur mati untuk sebagian besar waktu.
geometrikal
jawaban yang diperbarui. Saya tidak berpikir Anda akan memiliki terlalu banyak masalah dengan itu menjadi output, tetapi taruhan terbaik adalah mengambil saran Atmel.
helloworld922
10
  1. Atur pin ke input, drive pin tinggi untuk melakukan pull-up internal : Saya pikir ini seharusnya berbunyi: " buat input tinggi dengan menggunakan pull-up internal ". (Saya akan menggunakan kata "drive" hanya jika Anda melakukannya secara aktif, melalui FET ke Vcc atau ground.) Jelas bahwa Anda menginginkan level yang ditentukan, dan pull-up menangani itu. Pastikan mengaktifkan pull-up adalah salah satu hal pertama yang Anda lakukan setelah reset. Itu berlaku untuk inisialisasi I / O secara umum. Satu-satunya arus akan menjadi arus bocor dari NFET dari pasangan dorong-tarik, dan kebocoran gerbang dari input FET. Kurang dari 1 μA: Oke.
  2. Setel pin ke input, pin drive rendah : Bukan ide bagus. Jika perangkat lunak menjadi pisang dan akan beralih pin ke output tinggi Anda korslet pin, merusak PFET dari pasangan pelengkap.
  3. Atur pin ke input, tarik eksternal : Sama dengan 1), hanya lebih mahal. Tetapi memiliki keuntungan bahwa pull-up akan selalu ada; Anda mungkin lupa untuk mengaktifkan pull-up internal (yang dinonaktifkan secara default). Jika I / O secara tidak sengaja akan beralih ke output rendah, Anda akan memiliki sedikit arus.
  4. Atur pin ke input, eksternal pull down : Sekali lagi biaya resistor (ya, saya tahu itu murah, tapi murah + tidak perlu = mahal.) Arus yang sama seperti pada 3) jika pin akan aktif tinggi.
  5. Tetapkan pin ke output rendah : Memiliki arus bocor lebih tinggi daripada saat dikonfigurasi sebagai input, tetapi masih di bawah 1 μA, jadi tidak perlu khawatir. Saya masih akan mengaktifkan internal pull-up. Ini tidak akan aktif dengan I / O sebagai output, tetapi jika secara tidak sengaja akan beralih ke input pin tidak akan tetap mengambang.
  6. Setel pin ke output tinggi : Sama seperti 5)
  7. Tetapkan pin ke output rendah, pull-down eksternal : Resistor pull-down adalah biaya yang tidak perlu: itu akan membuat output rendah, yang sudah rendah. Tetapi dibandingkan dengan 5) memiliki keuntungan bahwa Anda yakin pin tidak akan mengambang jika tidak sengaja beralih ke input.

Saya akan memilih 1): input dengan internal pull-up; tidak diperlukan bagian eksternal. Dalam FMEA 5) tarif mungkin lebih baik, tetapi itu tergantung pada seberapa tinggi Anda memperkirakan risiko bahwa Anda lupa mengaktifkan internal pull-up. Rekan sejawat desain perangkat lunak harus memberi Anda asuransi.

stevenvh
sumber
1

Pin biasanya tidak membuat perbedaan besar sendiri. Anda akan melihat setiap pin juga memiliki fungsi spesifik - nonaktifkan fungsi pin

volatile uint8_t timer2sum; // see interrupt handler

void Initialize()
{
    // configure pin for output
    DDR_LED |= LED;

    // set Power Reduction Register
    PRR = (1<<PRTWI)     // turn off TWI
        | (1<<PRTIM0)    // turn off Timer/Counter0
        | (1<<PRTIM1)    // turn off Timer/Counter1 (leave Timer/Counter2 on)
        | (1<<PRSPI)     // turn off SPI
        | (1<<PRUSART0)  // turn off USART (will turn on again when reset)
        | (1<<PRADC);    // turn off ADC

    // select POWER SAVE mode for sleeping, which allows Timer/Counter2 to wake us up
    set_sleep_mode(SLEEP_MODE_PWR_SAVE);

    // configure Timer/Counter2 to wake us up as infrequently as possible
    TCCR2B |= (1<<CS22) | (1<<CS21) | (1<<CS20); // clock at 14400 Hz
    TIMSK2 |= (1<<TOIE2);                        // interrupt on overflow, 56.25 Hz
    timer2sum = 0;                               // see interrupt handler
    sei();                                       // enable interrupts
}

diambil dari http://www.nerdkits.com/library/lowpowerexample/ yang juga menggunakan chip yang sama.

exussum
sumber