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/WFEtalimatları veSLEEPONEXITbiti ile kesme bittikten sonra doğrudan uykuya dönmek.- Polling yerine kesme / olay tabanlı tasarım; busy-wait
delaydö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 (
DBGMCUayarları 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();İlgili Mikrodenetleyiciler soruları
- Kesme (interrupt) nedir? ISR yazarken nelere dikkat edilir?
- Watchdog timer nedir, ne işe yarar?
- Bir bootloader nasıl çalışır? Uygulamaya atlama ve güvenli firmware güncellemesi nasıl tasarlanır?
- Mekanik bir butonun debounce işlemi neden gereklidir ve yazılımda nasıl yapılır?
- DMA nedir, ne zaman kullanılır? DMA kullanırken cache coherency ve double buffering gibi konularda nelere dikkat edilmelidir?
- ADC çözünürlüğü, referans voltajı ve örnekleme hızı nedir? ADC okumasında doğruluğu etkileyen faktörler nelerdir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.