Stop mode mu yoksa Frekans düşürmek mi?

Başlatan mistek, 23 Mayıs 2016, 22:06:50

mistek

Aküden beslenecek bir uygulamada
UART, ADC, TIM, GPIO kullanılıyor.

Sistem sadece 5 saat aktif olarak çalışıyor sonrasında beklemeye geçiyor. Aktif olarak çalışırken işlemciyi yüksek oranda kullanıyorum ancak beklemeye geçtiği sürede birkaç saniye arayla ADC okumak yetiyor ve dışarıdan bilgi talep edilirse uarttan veri gönderiyorum. Butonlar vs okunmaya devam etmeli, Birde zamanlayıcılar var süreyi saymaya devam etmem gerekiyor.

Şimdi güç tüketimi için saat frekansını mı düşürmemi önerirsiniz? Yoksa Low power modeların herhangi birine girmeyi mi?

Aklımdaki ilk düşünce aktif kullanımda frekansı 48MHz olarak ayarlamak sonrasında güç tüketimi için 1MHz e düşürüp tüm birimlerin clock ayarlarını yeniden yapmak.

Faydası zararı ne olur kestiremiyorum. Sürekli olarak frekans değiştirmek soruna yol açar mı, nasıl bir yol izlememi önerirsiniz?
(HSI osilatör kullanılıyor)
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

erdcan

Low power mod daha makul bir çözüm gibi duruyor. Saat frekansı her halukarda işlemcinin çalışmasını devam ettirmesi için düşürüleceğinden veri kaybı, farklı cihazlardan iletişim esnasında bekleme sürelerinde sıkıntı olabilir mi diye düşünüyorum.

Klein

Hangi CPU?
STM32'nin düşük güç modları gayet başarılı.
32L serisinde ADC için 16MHZ HSI  osilatör gerekiyor. MSI osilatörle çalışmıyor. CPU'nun datasheetinden kontrol etmenizi öneririm.
Saniyede bir ADC'yi uyandırıp ölçüm alabilirsiniz. ADC'yi uyutursanız, uyandırdıktan sonra kendine gelmesi için bir kaç milisaniye zamana ihtiyaç duyuyor. Datasheet daha kısa süreler verse de tecrübelerim aksini söylüyor.
GPIO'ları EXTINT alacak şekilde yapılandırırsanız, GPIO hareketinde uyandırabilirsiniz. Uyku modunda Timer saymaya devam eder. Eğer interrupt içerisinde  işlem yapıyorsanız kesme geldiğinde uyanacaktır.

mistek

Stm32f0 kullanıyorum.

Programın bir kısmı kesme içerisinde bir kısmıda genel döngülerde işliyor.

Uart, Timer çalışmaya devam etmeli adc ve dma durabilir ama organizasyonu kuramadım bir türlü.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

X-Fi

Kullandığınız işlemcide LP-Timer olmadığı için stop modunda sadece "wake up timer" saymaya devam edecektir. Bu timer çalışabilmesi içinde 40khz LSI yada 32.768 LSE kurulu ve çalışır durumda olmalı. Wakeup timer maximum 30sn e kadar işlemciyi stop modda tutabilir. (16. ve 17. bitler F0 serisinde varmı bilmiyorum varsa süre artıyor) Bu durumda daha uzun süre stop modda kalabilmek için programın içinde de bir timer saydırıp stop moda tekrar girmeniz gerekecektir. Ayrıca WDT kullanıp reload etme işlemini de bu sırada yapabilirsiniz. Usart interruptlarını kurarsanız start bit,anahtar karakter veya alınan bir byte ile uyanır (anahtar karakter ve 1 byte ile uyanma işlemi STM32L0 serisinde olan LP-Usart donanıma özel olabilir. F0 serisinin datasheetlerine bakınız) . ADC eski serilerde HSI,HSE olmadan çalışmıyordu son üretiminde bu eksiği giderdiler. Artık tüm clock kaynakları ile beslenebiliyor. DMA stop mod içerisinde çalışmaz. işlemci ile aynı adres bus'ı kullandığı için işlemci cloğuna senkron olması şartı var. Stop moda girip çıkma işlemini HAL kütüpanelerine yaptırırsanız sıkıntısız şekilde kullanırsınız.Stop mod içerisinde en az akım sarfiyatı için input pinlerinizi float posizyonda olmaması gerekiyor. Kullanılmayan pinler analog input olarak ayarlanmalı yada pull-up-down bağlı olmalıdır.

iyi çalışmalar.

http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

mistek

@X-Fi hocam söylediğiniz başlıklar için biraz araştırma yaptım sağolun. Stm32f03 serisi için USART event olayı yokmuş. RTC alarm event var bunu kurmam gerekiyor. Bu seferde sürekli olarak stop moddan çıkıp uart kontrolü yapacağım.

Çalışma esnasında işlemci frekansını değiştirmeyi düşünüyorum. 500kHz e kadar düşürdüğümde baudrate 9600 olabiliyor.
Frekans değiştirme konusunda ne düşünüyorsunuz hocam?

boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

Klein

Neden stop yapıyorsun? Sleep yaparsan, herhangi bir kesme ile uyandırabilirsin.

mistek

Sleep modda tüketim çok az fark ediyor hocam.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

Klein

Hedef uyku akımın nedir?
F0 ile hiç çalışmadım. Ama L0 ile WFI modda LSE ve RTC açık iken 1uA civarına inebiliyor. Çoğunu da RTC çekiyor. RTC kapalı iken 300nA görmüşlüğüm var.  Ölçü aletinden kaynaklanan hataları da eklersek  400 nA diyelim. 10dakikada bir ADC ile örnek alıp Flasha yazan bir uygulamam yaklaşık 1 yıldır CR2016 pille çalışıyor. Pil voltajı da halen 2.7V civarında. Saniyede bir ADC uyandıracaksanız, uyku modunda harcayacağınız güç onun yanında devede kulak kalır bence. Ama F0 dokümanını incelemediğim için de yanlış yönlendirme yapmak istemem.

mistek

Hocam Normal çalışmada tüm devre 10mA akım çekiyor. İşlemci payına düşen kısmı yaklaşık 6-8mA. Toplam akım tüketimini 4-6mA arasına düşürmek istiyorum. Akü ile beslendiği için nA seviyesi çok lüks olur bana. Çokta önemli değil birkaç miliamper ama düşürebilirsem düşüreceğim.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

Klein

#10
Stop , Standby gibi modlara bulaşmadan halledeyim istiyorsun anladığım kadarıyla.  Eğer hız düşürmek işini görüyorsa Düşür.  Eğer hiç PLL bölücülerine bulaşmadan AHB ve APB bölücülerini değiştirerek halledebiliyorsan bir sorun çıkacağını zannetmem. Ama bu durumda akım düşüşü yeterli olmazsa mecburen PLL bölücülerine bulaşman gerek. Eğer pll ayarlama rutinlerini düzgün yaparsan, pll'in oturması vs.. gibi beklemeleri kuralına göre yaparsan, yine bir sıkıntı çıkacağını sanmam.
@X-Fi nin belirttiği gibi boş pinleri float bırakmamak da ciddi akım düşüşü sağlar. Bunu da dikkate al.

mistek

@Klein hocam evet hiç low power modlara bulaşmadan yapayım istiyorum. İşlemci uyandı uyanmadı derdim olmasın bilgide kaçmasın istiyorum. 
Şuan hiç PLL kullanmıyorum. Son olarak tüm işlemlerimi HSI 8 MHz kullanarak yapabilir hale getirdim. AHB bölücüyü kullanarak 500kHz ile 8MHz arasında geçiş yapmak işimi görüyor. Uzun vadede sorun çıkarmı diye düşünüyordum.

Boş pinlerden kasıt hiç clock aktif edilmemiş pinleride Pull down yapmaktan bahsediyorsunuz değil mi? Tüm GPIOları aktif edip Pull down yapacağım doğru mu?
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

mistek

Low power modlarla ilgili bişey dikkatimi çekti.



Programı 8Mhz de işletiyorum. Toplamda çekilen akım 9.25mA

PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI);

Yazılım en başında GPIO haricinde hiçbir donanımı init etmeden Stop moda giriyorum ve pine bağlı butona basarak harici kesme ile uyandırıp tekrar kaldığı yerden devam ederek init kodlarımı işletip ana programa gidiyorum.

Toplam çekilen akım: 5.42mA

İki durum arasındaki tek fark stop moda girmek veya girmemek. Stop mod benim kapatmadığım bazı donanımlarıda kapatıyor sonrasında ben sadece lazım olanları açıyorum diye düşünüyorum.

Bu aradaki güç sarfiyatı nereye gidiyor olabilir?
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

mistek

STM32F0 çipinde işlemci AHB frekansını çalışma anında değiştirdiğim zaman ADC tamamen duruyor. Tekrar init etsem bile reset atmadan çalışmıyor.

Başka bir yol olarak HSI14 osilatörü kullanmak istedim.

HSI14 RC osilatörden besleme veriyorum. DMA ile ADC çevrimlerini okuyorum. Ne zaman işlemci frekansını değiştirsem ADC tamamen duruyor diğer donanımlar normal çalışıyor görünüyor. Yine çözüm bulamadım.

@X-Fi @Klein hocam neyi gözden kaçırıyor olabilirim ?
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

Klein

Muhtemelen ADC hata bayraklarınden birisi  çekiliyor.