avatar_Mucit23

Neden MIBAM?

Başlatan Mucit23, 07 Mart 2017, 15:10:46

Mucit23

Selamlar

Bit Anlge Modulation konuları ile ilgileniyorum. Bit Angle modulation konusunu anladım sayılır. Şu anda resimdeki 16X32 RGB P10 Panel üzerinde uğraşıyorum.

PSoC ile Bu modül üzerinde bütün pixellere RGB444 ile 4 bit renk çözünürlüğü elde edebildim. Bu modüllerle uğraşmak çok zor. 32x16=512 tane RGB led var ve bunları iki yönden taramak gerekiyor.

Sadece Bit Angle modulation bile baya kasıyor. Birde bunun MIBAM tarafı var.

MIBAM yönteminin BAM'e göre ne artısı var. Neden böyle bir yönteme ihtiyaç duyulmuş?


Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

#1
Ayrıca Bit Angle Modulation ile ilgili bir problemim var. İşlem yükünü azaltmak için farklı yöntemler deniyorum. Bu yöntemde her bir bit için kesmenin periyodunu değiştiriyorum.

Modülasyon için bir tane timer kullandım. Dediğim gibi Timer'in sürekli periyodunu değiştirerek bit genişliklerini ayarlıyorum. Şöyle bir algoritma kurdum. 4 bit renk çözünürlüğü için uğraşıyorum.

CY_ISR(InterruptHandler)   //Kesme fonksiyonu
{
   Timer_1_STATUS;  //Kesme bayrakları temizleniyor.
   
   LED1_Write(1-LED1_Read());  //Kesme oluşum sürelerini ölçmek için kullandım

   LED2_Write(((Duty_Val>>bitmask)& 0x01));   //Parlaklığını ayarlayacağım led, 1 yazarsam led yanar, 0 yazarsam led söner
   Timer_1_WritePeriod(((uint16_t)1<<bitmask)*100); //Periyot değeri için ((uint16_t)1<<bitmask)*100 işlemini yaptım.
   bitmask++;if(bitmask>3)bitmask=0;  //Bit mask 0 iken periyot değeri 100uS olurken bit mask değeri 3 iken 800uS olur.
}

minimun bit genişliği 100uS olacak şekilde ayarlamam gerekiyor. Bu yüzden Timerin giriş frekansını 1Mhz yaptım. Timer period değerini 100 yaparsam tam 100uS'de kesme oluşuyor. 4 bit için en büyük bit genişliği 800uS olur. buraya kadar sıkıntı yok.

Yukarıdaki kod çalışıyor nispeten ama bitler kaymış olarak çıkıyor

Örneğin Duty_Val=0b00000101 olursa çıkışta 0b00001010 verisini görüyorum.

Aynı işlemi kesme içerisinde değilde ana program döngüsünde yaparsam problem yok.
Ana programda aşağıdaki kodlar tam istediğim gibi çalışıyor. Timer Kullanmak yerine delay fonksiyonu kullandım.
   
   LED1_Write(1-LED1_Read());  //Kesme oluşum sürelerini ölçmek için kullandım

   LED2_Write(((Duty_Val>>bitmask)& 0x01));   //Parlaklığını ayarlayacağım led, 1 yazarsam led yanar, 0 yazarsam led söner
   CyDelayUs(((uint16_t)1<<bitmask)*100); //Periyot değeri için ((uint16_t)1<<bitmask)*100 işlemini yaptım.
   bitmask++;if(bitmask>3)bitmask=0;  //Bit mask 0 iken periyot değeri 100uS olurken bit mask değeri 3 iken 800uS olur.

Kafam durdu resmen. 4 Bit renk çözünürlüğü elde ettiğimi düşünüyordum ama bu problem var. Kesme kullanınca neden bu tür bir kayma olabilir?
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Mibam BAM'ın normal BAM'a aynı bitlerin ayna görüntüsünün eklenmmesi ile oluşturuluyor.
Anladığım kadarı ile BAM sistemi fena çalışmıyormuş ancak az da olsa ledlerde kırpışma (flickering) oluyormuş.
Bunu engellemek için bir yol ararken birisi akıl vermiş. Bitlerin yarıdan sonrasını ters imajını oraya ekle şeklindeki öneri sonucu Mibam ortaya çıkmış ve sonuçta mükemmel olunca bu sistem uygulamaya koyulmuş.

Ete

http://www.picbasic.co.uk/forum/attachment.php?attachmentid=5376
Asıl hikayede şurada;
http://www.picbasic.co.uk/forum/showthread.php?t=7393

Mucit23

Hicam peki kurduğum algoritma hakkında fikir yürütebilirmisiniz?
Neden kesme içinde böyle bir problem yaşanıyor olabilir? Tek led için siz olsaydınız nasıl bir mantık kurardiniz?
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

yazdığın kodlar benim anlama sınırımı aşmış durumda. Zaten C dili yazım mantığı bana ters geliyor.
Pek çok projede MİBAM kullandım. Ama hep Darrel Taylorun hazır modülünü kullandığım için gerisine çok fazla kafa yormuyorum.

Ete

Mucit23

#5
Hocam Yaptığım işlemleri yazıya dökeyim belki göze çarpan birşey çıkar.


  • Timer'i ilk başta çalıştırmadan önce preload değerini 100 yapıyorum ki 100uS sonra kesme oluşsun.
    Bu arada bitmask değeri 0 dır. 
  • 100uS sonra kesme oluşunca Duty değerinin 0. bitini LED'e gönderiyorum. (bitmask=0) İlgili kodlar LED2_Write(((red_bits[0]>>bitmask)& 0x01));
    bitmask değeri artınca gönderilen bit de değişiyor.
  • Bitmask değeri hala 0 iken Timer preload değerini ayarlıyorum.    Timer_1_WritePeriod(((uint16_t)1<<bitmask)*100); bitmask değeri 0 için preload değeri 100 olurken bitmask değeri 3 iken preload değeri 800 olması lazım. Lojik analyser'da gecikme değerlerini doğruluyorum.
  • bitmask değerini kesmeden çıkmadan önce 1 arttırıyorum. Eğer bitmask değeri 3'den büyük olursa bitmask değerini sıfırlıyorum.    bitmask++;if(bitmask>3)bitmask=0;

Ben bu şekilde bir algoritma kurdum. kesme tam istediğim gibi 100, 200 400 ve 800us aralıklarla oluşuyor. Bit gönderme işlemide çalışıyor ama bir bit kayarak gerçekleşiyor. Sorunum budur.

Hocam Darel bu işi nasıl yapıyor? Anlatmanız mümkünmüdür?
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

#6
Aslında bu konu ile ilgili 2014 yılında epeyce bir inceleme yapmışız.
Örnek programda vermişim.
Darrel'in nasıl yaptığını anlamak zor saatlerce çalışıp ne yaptığına bakmak lazım. Ama işin prensibi belli zaten.

http://etepic.com/index.php/topic,723.0.html

Aslında anlayabilirsen örnek programlar içinde MIBAM.PBP diye bir dosya var. Include dosyası bu. Her şey orada hallediliyor.
İncele istersen.

Ete

Mucit23

Hocam ben sorunumu anladım sayılır. Şuan nasıl efektif bir çözüm üretirim onu düşünüyorum.

Hocam PBP deki Bit Angle Modulation tekniğinde min. bit genişliği ne kadar?

Mesela ben 0. bit için 100uS kullandım, 1. bit için 200uS, 2. bit için 400uS, 3. bit için 800uS şeklinde devam ediyor.  Toplam 800+400+200+100=1500uS yapıyor. Yani bu iş için test edilmiş efektif bir değer varmıdır?

Tarama frekansı ise 1/1.5mS den 666Hz tarama frekansı yapar.

Şimdilik bit çözünürlüğünü 4 bitte tuttum çünkü panelde çok fazla led var. Aynı anda RGB olmak üzere 32 ledin birden Bit genişliğini ayarlamam gerekiyor.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Mucit, dedim ya hazır olan include dosyasını kullanıyorum. Uzun uzadıya incelemedim. Bu nedenle bit genişliği ne kadar tam olarak bilemiyorum.

Ete

Mucit23

Anladım hocam. Ben kendi ihtiyaçlarıma göre deneme yanılma usülü deneyeceğim o zaman.
Teşekkürler.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

Bit Angle Modution yönteminde şöyle bir sorun tespit ettim.

Işık değişimi lineer bir şekilde değişmiyor.  Yani çıkıştaki veri 0b00000100 iken 0b00000101 olduğunda ışık şiddeti gözle farkedilmeyecek kadar az değişiyor. aynı şekilde 0b00000110 olduğunda da çok az bir değişim gözlemleniyor.

4 bit için toplam periyot 1.5ms idi
0b0001 verdiğimde ledin yanık kalma süresi 100uS
0b0010 verdiğimde ledin yanık kalma süresi 200uS
0b0011 verdiğimde ledin yanık kalma süresi 100+200=300uS
0b0100 verdiğimde ledin yanık kalma süresi 400us
.
.
.0b1111 verdiğimde ledin yanık kalma süresi 1500uS
Normalde yanık kalma sürelerine baktığımda lineer bir değişim olduğu görülüyor ama gerçekte böyle olmuyor. Bunu çözmem lazım.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Powered by EzPortal