Pille çalışan bir cihazda MCU güç tüketimini azaltmak için hangi teknikleri kullanırsınız?

Cevap

Temel fikir: İşi mümkün olduğunca hızlı yap ve olabildiğince uzun süre en derin uyku modunda kal. Ortalama akım, aktif ve uyku akımlarının süreye göre ağırlıklı ortalamasıdır.

I_ort = (I_aktif * t_aktif + I_uyku * t_uyku) / T

Örnek: Her saniye 5 ms boyunca 10 mA, kalan sürede 2 µA tüketim: ortalama yaklaşık 52 µA; bunun ~50 µA'i aktif dönemden gelir. Bu örnekte aktif süreyi kısaltmak (daha hızlı iş bitirip uyumak) en büyük kazancı sağlar; uyanma aralığı uzadıkça (ör. dakikada bir) ise uyku akımı baskın hale gelir ve onu düşürmek önem kazanır.

Yazılım teknikleri

  • Uyku modları: STM32 örneğinde Sleep (CPU durur), Stop (saatler durur, RAM korunur, µA seviyesi), Standby/Shutdown (RAM kaybolur, nA seviyesi). Uyanma kaynağı olarak RTC, harici kesme veya LPUART kullanılır.
  • WFI / WFE talimatları ve SLEEPONEXIT biti ile kesme bittikten sonra doğrudan uykuya dönmek.
  • Polling yerine kesme / olay tabanlı tasarım; busy-wait delay döngülerinden kaçınmak.
  • Clock gating: Kullanılmayan çevre birimlerinin saatini kapatmak.
  • Gereken en düşük CPU frekansını ve voltage scaling seviyesini seçmek.
  • Veri transferlerinde DMA kullanıp CPU'yu uyutmak.
  • RTOS kullanılıyorsa tickless idle modunu açmak.

Donanım ve pin seviyesi

  • Kullanılmayan GPIO'ları analog moda almak; floating giriş ekstra akım çeker.
  • Pull-up/pull-down dirençlerinden sürekli akım akmadığından emin olmak.
  • Sensörleri, LDO'ları ve RF modüllerini bir GPIO veya yük anahtarıyla tamamen kapatmak.
  • Debug arayüzünü düşük güç modunda açık bırakmamak (DBGMCU ayarları akımı artırır).

Ölçmek

Tahmin yerine ölçüm yapın: Nordic PPK2, Joulescope veya ST'nin power shield'ı gibi araçlarla akım profilini çıkarın. Uyku akımı beklenenden yüksekse, birimleri tek tek kapatarak kaynağı bulun.

Örnek

HAL_SuspendTick();
HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);   /* RTC alarmı veya EXTI ile uyanır */
SystemClock_Config();                           /* Stop sonrası PLL kapalıdır, yeniden kur */
HAL_ResumeTick();
  1. Kesme (interrupt) nedir? ISR yazarken nelere dikkat edilir?OrtaMikrodenetleyicilerEmbedded
  2. Watchdog timer nedir, ne işe yarar?KolayMikrodenetleyicilerEmbedded
  3. Bir bootloader nasıl çalışır? Uygulamaya atlama ve güvenli firmware güncellemesi nasıl tasarlanır?ZorMikrodenetleyicilerEmbedded
  4. Mekanik bir butonun debounce işlemi neden gereklidir ve yazılımda nasıl yapılır?KolayMikrodenetleyicilerEmbedded
  5. DMA nedir, ne zaman kullanılır? DMA kullanırken cache coherency ve double buffering gibi konularda nelere dikkat edilmelidir?ZorMikrodenetleyicilerEmbedded
  6. ADC çözünürlüğü, referans voltajı ve örnekleme hızı nedir? ADC okumasında doğruluğu etkileyen faktörler nelerdir?OrtaMikrodenetleyicilerEmbedded

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle