ATMega328P'de kullanılmayan I / O pinleri en düşük güç tüketimi için nasıl yapılandırılmalıdır?


15

Oluşturduğum bir Arduino kartında gücü olabildiğince azaltmaya çalışıyorum. Kullanılmayan giriş pimleri nasıl yapılandırılmalıdır? Bunun için birkaç cevap var ( burada , burada ), ancak ATMega328P'ye özgü bir şeyin peşindeyim.

  1. Pimi girişe ayarlayın, dahili pimi çekmek için sürücü pimi yüksek
  2. Pimi girişe ayarlayın, tahrik pimi düşük
  3. Pimi girişe ayarlayın, harici yukarı çekin
  4. Pimi girişe ayarlayın, harici aşağı çekin
  5. Pimi çıkış düşük olacak şekilde ayarla
  6. Pimi çıkış yüksek olacak şekilde ayarla
  7. Pimi düşük, harici aşağı çekme çıkışına ayarlayın

Yanıtlar:


12

Veri sayfasını inceledikten sonra şunu buldum:

14.2.6 Bağlantısız Pimler

Bazı pimler kullanılmıyorsa, bu pimlerin tanımlanmış bir seviyeye sahip olduğundan emin olunması önerilir. Dijital girişlerin çoğu yukarıda açıklandığı gibi derin uyku modlarında devre dışı bırakılsa da, dijital girişlerin etkinleştirildiği diğer tüm modlarda (Sıfırlama, Aktif mod ve Bekleme modu) akım tüketimini azaltmak için değişken girişlerden kaçınılmalıdır.

Kullanılmayan bir pimin belirli bir seviyesini sağlamak için en basit yöntem, dahili çekmeyi etkinleştirmektir. Bu durumda, çekme işlemi sıfırlama sırasında devre dışı bırakılır. Sıfırlama sırasında düşük güç tüketimi önemliyse, harici bir yukarı çekme veya aşağı çekme kullanılması önerilir. Kullanılmayan pimlerin doğrudan VCC veya GND'ye bağlanması önerilmez, çünkü pim yanlışlıkla çıkış olarak yapılandırılırsa aşırı akımlara neden olabilir.

yorum / soru ile ilgili güncelleme:

Tablo 14-1'e göre, çekme direnci sadece aşağıdaki koşullar karşılandığında aktiftir:

  1. Pim giriş olarak ayarlanmıştır (DDxn biti mantık düşüktür)
  2. PORTxn mantığı yükseltir
  3. PUD mantık düşük

Çekme direncinden önemli bir akım akışı elde etmenin tek yolu, pimin çekerek etkin durumdayken düşük bir seviyeyle karşılaşmasıdır. Bu, Atmel'in kötü bir şekilde (olası olmayan) berbat olması veya pimin, çekme etkinken giriş olarak yapılandırıldığını ve pimin bir şekilde toprağa bağlı olduğu anlamına gelir.

Bu bölümde 14.2.5dijital giriş etkinleştirme ve uyku modları açıklanmaktadır. Özetlemek gerekirse, dijital giriş, pim harici bir kesinti olarak yapılandırılmadığı sürece uyku modundayken yüzer bir seviyeyi önlemek için Schmitt Tetikleyicinin girişinde toprağa kenetlenir. Uyku modunda dijital çıkışın devre dışı olup olmadığını söyleyemem. Şekle göre devre dışı bırakılmış gibi görünmüyor 14-2, ancak olsaydı çok şaşırmam. En iyi bahis, dahili veya harici bir çekme direnci kullanmaktır.


teşekkürler, bunun kullanılan güç açısından bir çıktıya ayarlamaktan daha iyi olduğunu düşünüyor musunuz? Dahili pull-up boyunca herhangi bir akım akıyor mu? Cihaz çoğu zaman güç kapalı uyku modunda olacaktır.
geometrikal

güncellenmiş cevap. Bunun bir çıktı olmasında çok fazla sorun yaşayacağınızı sanmıyorum, ama en iyi seçenek Atmel'in tavsiyesini almaktır.
helloworld922

10
  1. Pimi girişe ayarlayın, dahili pimi çekmek için sürücü pimi yüksek : Bunun şunu okuması gerektiğini düşünüyorum: " dahili çekerek geçerek girişi yüksek yapın ". (Ben sadece "aktif", Vcc veya yere bir FET aracılığıyla bunu yaparsanız "sürücü" kelimesini kullanırdım.) Tanımlanmış bir seviye istediğiniz açıktır ve pull-up bununla ilgilenir. Pull-up'ı etkinleştirmenin sıfırlamadan sonra yaptığınız ilk şeylerden biri olduğundan emin olun. Bu genel olarak I / O başlatma için geçerlidir. Tek akım, itme-çekme çiftinin NFET'inin kaçak akımı ve FET girişinin kapı kaçağı olacaktır. 1 µA'dan az: Tamam.
  2. Pimi girişe ayarlayın, tahrik pimi düşük : İyi bir fikir değil. Yazılım muz çıkarsa ve pimi yüksek çıkışa geçirirse, pimi kısaltırsınız ve tamamlayıcı çiftin PFET'ine zarar verirsiniz.
  3. Pimi girişe ayarlayın, harici yukarı çekin : 1) ile aynıdır, sadece daha pahalıdır. Ancak, avantajın her zaman orada olması avantajına sahiptir; dahili çekmeyi etkinleştirmeyi unutabilirsiniz (varsayılan olarak devre dışıdır). G / Ç yanlışlıkla düşük çıkışa geçerse, küçük bir akım gideriniz olur.
  4. Pimi girişe ayarlayın, harici aşağı çekin : Yine bir direncin maliyeti (evet, ucuz olduklarını biliyorum, ama ucuz + gereksiz = pahalı.) Pim aktif yüksek olacaksa.
  5. Pimi çıkış düşük olarak ayarlayın : Giriş olarak yapılandırıldığından daha yüksek bir kaçak akıma sahiptir, ancak hala 1 µA'nın altındadır, bu nedenle endişelenecek bir şey yoktur. Dahili çekmeyi hala etkinleştiririm. Çıkış olarak G / Ç ile aktif olmayacaktır, ancak yanlışlıkla girişe geçirilecekse, pim yüzer halde kalmaz.
  6. Pimi yüksek çıkışa ayarlayın : 5 ile aynı)
  7. Pimi düşük, harici aşağı çekme çıkışına ayarlayın : Aşağı çekme direnci gereksiz bir maliyettir: zaten düşük olan bir çıkışı düşük yapacaktır. Ancak 5 ile karşılaştırıldığında), girişe istenmeden geçildiğinde pimin yüzmeyeceğinden emin olmanız avantajına sahiptir.

1): dahili çekmeli giriş; harici parça gerekmez. Bir FMEA'da 5) daha iyi ücret alabilir, ancak bu, dahili çekmeyi etkinleştirmeyi unuttuğunuz riski ne kadar tahmin ettiğinize bağlıdır. Bir yazılım tasarımı emsal incelemesi size sigorta sağlamalıdır.


1

Pimler genellikle büyük bir fark yaratmazlar. Her iğnenin de belirli bir işlevi olduğunu göreceksiniz - iğnenin işlevini devre dışı bırakın

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
}

aynı yongaları kullanan http://www.nerdkits.com/library/lowpowerexample/ adresinden alınmıştır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.