STM32F10X Çalışmalarım

Başlatan Mucit23, 12 Mart 2012, 11:17:48

Burak B

#270
TFT kullanma methodolojiniz hatalı demek istiyorum. Bahsettiğim yöntemi kullanmazsanız Flicker dediğimiz etkinin önüne geçemezsiniz. @Elektroemre' nin verdiği linkteki kitte kullanılan MCU' ya EMC (External Memory Controller) koyulmuş olmasının en önemli sebeplerinden biri de bu zaten.

Frame buffer niye kullanılır ?
Double buffer, Tripple Buffer nedir ? Ne işe yarar ?
Görüntü yırtılması nedir ?
Flicker nedir nasıl engellenir ?
Eski CRT sistemlerde Vertical Retrace nedir ? Günümüz sistemlerinde bunun karşılığı nedir ?
Bresenham, Wu v.b. çizim algoritmaları nasıl işler ? Aralarındaki farklar nedir ?
Supersampling, Antialiasing, Oversampling, Halftoning Nedir ?
Partikül sistemleri nasıl çalışır ?

ve bunlar gibi grafik işleme algoritmalarını ve yöntemlerini bir araştırın bence.

Yada hiç uğraşmayın gidip @yamak' ın bahsettiği gibi bir hazır bir grafik işleme kütüphanesi kullanın.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

Mucit23

Dediğiniz gibi çizgi çizerek olacak gibi bir iş değil. Çok yavaş çalışır. Uğraşmama değmez.  Daha önce proton ve pic ile böyle bir uygulama yapmıştım ama yavaş çalışıyordu tabiki.
ADC_Grafik
Belki Farklı bir fikir gelir diye düşünmüştüm. @ByteMaster'ın dediklerine bakayım.

Aslında amacım şuydu, ADC den okuduğum değerin odak noktasını arttırıp ekranda grafik olarak çizebilmekti. EMG kas kasılma sensörü var. Ondan çıkan ADC değerini incelemeye çalışıyorum. Kas kasılmalarında çıkışta voltaj değişimi oluyor. Fakat oluşan değişiklikler çok küçük. Ancak osiloskop ile görünüyor.

Simdilik okuduğum değeri seri porttan bilgisayara aktarıp, bilgisayar üzerinde grafik çizdireceğim. 

Emwin'i f429'da kullanmayı öğrenebilsem mükemmel olacak. Bu yaz EmWin üzerinde ciddi ciddi uğraşacağım. Sıfırdan nasıl kurulur, nasıl kullanılır vs çözmem gerekiyor. Tam ramazanlık...

yamak

Hocam aşağıda basit bi uygulama üzerinde açıklamıştım zamanında belki işinize yarayabilir.
http://www.yusufyamak.com/stm32f429i-disco-emwin-uygulamasi/

z

Alıntı yapılan: Mucit23 - 30 Mayıs 2014, 11:35:21
Dediğiniz gibi çizgi çizerek olacak gibi bir iş değil. Çok yavaş çalışır. Uğraşmama değmez.  Daha önce proton ve pic ile böyle bir uygulama yapmıştım ama yavaş çalışıyordu tabiki.
ADC_Grafik
Belki Farklı bir fikir gelir diye düşünmüştüm. @ByteMaster'ın dediklerine bakayım.

Aslında amacım şuydu, ADC den okuduğum değerin odak noktasını arttırıp ekranda grafik olarak çizebilmekti. EMG kas kasılma sensörü var. Ondan çıkan ADC değerini incelemeye çalışıyorum. Kas kasılmalarında çıkışta voltaj değişimi oluyor. Fakat oluşan değişiklikler çok küçük. Ancak osiloskop ile görünüyor.

Simdilik okuduğum değeri seri porttan bilgisayara aktarıp, bilgisayar üzerinde grafik çizdireceğim. 

Emwin'i f429'da kullanmayı öğrenebilsem mükemmel olacak. Bu yaz EmWin üzerinde ciddi ciddi uğraşacağım. Sıfırdan nasıl kurulur, nasıl kullanılır vs çözmem gerekiyor. Tam ramazanlık...

Bu yöntemi EKG cihazlarında kullanıyorduk. Ama farkımız grafik rutinleri de dahil herşeyi ASM ile yazmamız.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Mucit23

Alıntı yapılan: z - 30 Mayıs 2014, 12:08:10
Bu yöntemi EKG cihazlarında kullanıyorduk. Ama farkımız grafik rutinleri de dahil herşeyi ASM ile yazmamız.

Yapmayın hocam ya, Ben C ile mutluyum :D

Burak B

#275
Şöyle kullanacağın MCU STM32F1 ailesinden ise bu iş için yeterli olmayabilir. Ancak FSMC+DMA ile yapacaksan sana bir performans artısı getirebilir bu MCU ile. Yoksa en az STM32F2 veya STM32F4 MCU kullan derim. Diğer yandan bu mcularda SDRAM kullanımı biraz kısıtlı. Kullanılacak kılıfa göre değişiklik gösteriyor. SRAM satın alabilirim dersen yeterli kapasitede bir SRAM kullanabilirsin. SRAM' ler pahalıdır SDRAM' e göre. 

Sorun olan nokta şurası frame buffer kullanacaksan bu büyüklükteki veriyi ekrana ne hızda taşıyabiliyorsun/basabiliyorsun ? Buna göre MCU seçmelisin. Aksi halde frame buffer kullansan bile ekranda flicker görme ihtimalin var.

Aslında senin yapacağın uygulamada daha etkili bir yöntemde kullanılabilir bunun için partikül sistemi oluşturup bu partikül sistemini yaptığın örneklemeye göre güncellemelisin. Böylece veri yükün azalacaktır. 320x240 bir LCD kullanıyor olsan yatay eksende sana 320 adet partikül yetiyor demektir. Her partikül için sürekli okuma ve yazma yapacak bir task ile bu işi yapabilirsin. Okuma pikselin altındaki eski bilgiyi okuyacak ve saklayacak yazma yeni bilgiyi yazacak. Bu partiküle yapılacak bir sonraki güncellemede eski bilgi yerine yazılacak ve yeni konumdaki bilgi saklanacak.

Bu iş böyle sürekli devam edecek.

"... a healthy dose of paranoia leads to better systems." Jack Ganssle

z

Alıntı yapılan: Mucit23 - 30 Mayıs 2014, 12:22:35
Yapmayın hocam ya, Ben C ile mutluyum :D

Grafik rutinleri hız isteyen rutinlerdir. C kullanıyor olmak çözüm değil. Kodlamayı mükemmel yapmak zorundasın.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Burak B

Gerekiyorsa C içerisinde inline ASM kullanabilirsin.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

Mucit23

Şuanda STM32F103 ile yapmaktan ciddi manada vazgeçtim. Hız çok düşük, Ram yok, Kullandığım kitte LCD bağlantıları FSMC olmadan yapılmış. vs vs.. Ben Verimi Usart ile bilgisayara aktarıp orda grafiğe aktaracağım.

Grafik çizmek için Harcayacağım zamanı EmWin'e harcamayı tercih ederim.

Üstelik ARM'nin ASM komut seti hakkındada bilgim yok, Birazcık pic assembly biliyorum okadar(Aslında Z hocaya buradan iş çıkar)

z

ASM kullan demiyorum ama C'yi efektif kullanmak lazım. Forumda sorulan yada cevap verilen farklı konulardaki kodları açıkcası hiç beğenmiyorum.

Tamam hız istemeyen uygulamalar için uzun uzun kodla ama grafik gibi hız isteyen uygulamalarda C kodlama çok iyi yapılmalı.

Hız optimizasyonu maksimuma ayarlamakla olmaz bu işler. Bizzat kodlamayı yapanın optimize kod yazması lazım.

Aynı durum ASM yazımda da geçerli. Grafik rutinlerini ASM ile yazdık diye yan gelip yatamayız. ASM yazımın da çok optimize olması gerekiyor. Bunun için de kullanılan grafik algoritmalarını iyi anlamak şart.

Eğer LCD ile işlemci arasındaki veri iletişim hızı düşükse zaten yapacak bir şey yok. Eğer hızı düşükse o LCD durağan görüntü uygulamaları için tasarlanmış demektir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Mucit23

Dediğim ADC datalarını gibi Seri porttan bilgisayara aktarıp meseleyi çözdüm. Ama içimde ukte kaldı. Boş bir vakitte efektif bir şekilde grafik oluşturmaya çalışacağım.

Başka bir konuya geçmek istiyorum

STM32F103'üme Optik Rotary Encoder bağlayıp timer ile konum ölçmeye çalışacağım. Bu sayede Timer'in Encoder modunuda öğrenmiş olurum.

Enkoder' 5V ile çalışıyor dolayısıyla A ve B çıkışlarıda 5V.

MCU'nun girişleri input_floating modunda, direk 5V giriş sinyali uygulayamam girişlerim bozulur. Gelirim bölücü veya 74LS244 gibi bir tampon kullanmak gerekir.

Siz olsaydınız hangisini kullanırdınız. Reelde ne gibi bir farklar yaratır? 

Klein

Eğer hızın düşükse ve  mcu girişi schmitt trigger ise reelde hiç fark yok.
Ama hız artınca işler değişir.  Eğer gerilim bölücü yaparsan,  direnç ve  pinin iç kapasitesi alçak geiren filtre gibi davranacaktır.  Direnç değerine göre kesim frekansı aşağılara doğru düşecektir.
Eğer  kodlayıcı çıkış frekansın  MHz seviyelerinde değilse, bir sıkıntı yaşayacağını düşünmüyorum.  2-3KOhm değerinde  bir bölücü ile 250KHz civarında sorun yaşamadım.

Mucit23

Klein Hocam merhaba,

Hocam encoderim Mhz seviyesinde sinyal çıkartacak kadar yüksek çözünürlüklü değil ama ben işimi sağlama bağlayayım deyip 74LS244 kullandım. 5V -> 3V3 Dönüşümü problemsiz çalışıyor.

Şimdi Encoder okuması için ufak bir kütüphane yazdım.
STM32F103'de Timer3'ün CH1 ve CH2 kanallarını Encoder interface için yönlendirme yaptım. Encoderden gelen palsler ile Timer Değeri Artıp azalıyor. Yani timerin çalışmasında sıkıntı yok. Ama şunu merak ediyorum. Açıkçası Referance manual'dede bu konuda yeterli bilgi edinemedim.

Timerin Encoder interface modu ile yapılabilecekler sadece bu kadarmı? Örneğin Donanımsal olarak yön tespiti yapılamıyormu? Yada BLDC motor sürmek istersek Quadrature encoderi, PWM modülü ile ilişkilendirebiliyormuyuz? Referance manual'de hall sensörlerle ilgili bilgi var ama quadrature encoderler ile ilgili bilgi bulamadım.

Fikriniz varmı?

Klein

"RM008 Reference manual" dokümanının 337. Sayfasında  incrimental encoder için dönüş yönüne göre counter'in hangi yöne sayacağı gösterilmiş. Hız bilgisi ile birlikte yön bilgisine mi ihtiyacın var?

Mucit23

Hocam 337. sayfada TIMx_CCMR2 Registeri var. Ama siz galiba 316. Registerdeki aşağıdaki tablodan bahsediyorsunuz.

Bu tabloda anlatılanlar gerçekleşiyor. Yani şuanda timerin değeri artıp veya azalıyor.

Encoderin Ne tarafa döndüğünü donanımsal olarak nasıl tespit ederim diyordum. Denemedim ama galiba TIMx_CR1 registerinin 4. biti DIR(Direction) ile tespit ediliyor. Hatta açıklamada not düşmüşler, Bu bit Center-Aligned veya Encoder modundayken sadece okunur demişler.

Benim asıl merak ettiğim aslında şuydu, Diyelim BLDC motor süreceğiz. Motor miline incremental encoder bağlayabiliyoruz. Bu durumda STM32'nin encoder ile birlikte donanımsal olarak faz sinyallerini oluşturması mümkünmü?