16X32 RGB Panel hakkında

Başlatan Mucit23, 10 Ekim 2014, 10:56:41

Mucit23

#90
Hocam yok mantıktada bir terslik var. Lojik analyser ile inceledim öyle görünüyor.

İlk başta 2ms lik süre içerisinde pwm sinyalinin az uygulandığını gördüm. PWM sinyalini 16Khz ye çıkardım.

hocam bilgisayarınızda saleae logic analyserin yazılımı kurulu ise çıktıyı incelemeniz çok rahat olur. Sağ üst kısımda options menüsü altında open sessions diye bir seçenek var. Ona tıklayıp verdiğim dosyayı seçince doğrudan çıktılar ekranda olacak.
Aşağıdaki linkte yükledim dosyayı. İncelerseniz sevinirim.
https://yadi.sk/d/YPIBpBqOcVYMK

Benim gözlemlerimle şöyle bir durum var. HC595'in DATA girişli lojik 1 de bekliyorken OE den uyguladığımız PWM çıkışa yansımıyor her nedense. Bizim döngümüzdede gönderilen son bit lojik 1 ise data girişi bir sonraki döngüye kadar hep lojik 1 de kalıyor. Çalışmada ciddi anlamda terslik var.
Ben HC595'in datasheetini biraz inceleyeyim.

iyildirim

Logic analizör çıktısına baktım.
Bu çıktı en son verdiğiniz koda mı ait.?
Öyleyse analizör çıktısına ve son bitin high da kalması durumuna göre  led_duty dizisinin 0. elemanı  255 7 elemanı da 128 sanırım. En son verdiğiniz koda göre tabii.

Son bitten sonra data pininin High da kalması durumu için latch dan önce data pinini low a çekebilirsiniz. son verdiğim örnek te olduğu gibi.

Dediğiniz gibi 0 kanala basılan veri ya  dediğiniz gibi çıkışa yansımıyor yada bağlantılarda bir hata var yada HC595CH0 diye isimlendirdiğiniz kanalda 7 bite bastığınız veri görüldüğüne göre isimlendirmede hata var. Sizin örneğe göre Bit_Count döngüsünü 7 den 0 a azalan şekilde   kurarsanız düzelir sanırım.

HC595CH7 diye isimlendirilen kanal da direkt PWM i görebildiğime göre ve döngü yapısı bu şekilde iken 7 kanalda aslında 0 kanala  bastığınız veri görüneceğine göre burada sorun yok.

Latch pinini on-off dan önce data pinini resetleyip,  Bit_count döngüsünü de 7den 0 a  azalan yapıda yaparsanız  istediğiniz şekilde  çalışacak diyorum.

Mucit23

#92
Hocam gerekli duzenlemeler akşam yapacağım.  Ben dikkat etmedim ama görünüşe göre sadece veri ters gidiyor. Döngüyü tersine çalıştırmak gerekiyor. Bunu hallederim. Benim aklıma min parlaklık konusu takılıyor.  Akşam olmadı bi resimde ekleyeyim.  Parlaklık konusunda logic çıktıya bakarak yorum yapabiliyormusunuz?

Birde şöyle bir durum var. OE girişi 0 iken çıkışlar aktif oluyor. Dolayısıyla verdiğimiz PWM sinyalinin tam tersi çıkışta görünüyor. Bunuda dikkate almak lazım.

Mucit23

Arkadaşlar yok, bu dediğiniz algoritmada ciddi anlamda sıkıntılar var. Az önce birkaç test daha yaptım. Ama sonuç alamıyorum.

Yaptığım işlemi uzun uzadıya anlatayım. Mantık hatası var ise belli olur.

8 adet Duty değişkenimiz var. Bu değişkenleri LED_Duty[8] diye tanımlamışım.

Yaptığımız işlem sırasıyla aşağıdaki gibi.

İlk önce 8 adet LED_Duty değişkenimizin 0 bitinlerini Shift registere gönderiyoruz. Bu işlem sonucunda LED_Duty[0] değişkeninin 0. biti, SR nin 0. bitinde olurken, LED_Duty[7] değişkenimizin 0. biti, SR nin 7. bitine gönderilmiş oluyor.
Burada sıkıntı yok. Bundan sonra PWM değerini yüklememiz gerekiyor. En düşük değerli bitler için 1, en yüksek değerli bitler için pwm değerini 128 yapmak gerekiyor. 0. Bitleri gönderdiğimiz için PWM değerini 1 yapıyoruz.

Daha sonra yine LED_Duty değişkenlerinin her birinin 1. bitlerini SR lere gönderiyoruz. Yaptığımız işlem sonucunda LED_Duty[0] değişkeninin 0. biti, SR nin 0. bitinde olurken, LED_Duty[7] değişkenimizin 0. biti, SR nin 7. bitine gönderilmiş oluyor. Ardından Duty değerini 2 yapıyoruz.

Bu şekilde bütün bitleri sırayla gönderiyoruz. En son LED_Duty değişkenlerinin sırayla 7. bitlerini gönderiyoruz ve latch işleminden sonra Duty değerini 128 yapıyoruz.Bu durumda PWM duty değeri max. oluyor.

kurduğum algoritma yaklaşık olarak böyle çalışıyor.
En son verdiğim kodlarda ufak tefek değişiklikler yaptım. LED_Duty[7] nin SR tarafında 0. bitte görülmesi olayını döngüyü tersine çevirerek düzelttim.
Kodun en son hali aşağıdaki gibidir. İnterrupt felan kullanmıyorum. Herşey main döngüsü içerisinde çalışıyor.

  while(1)
  {
  
	  for(Duty_Count=0;Duty_Count<8;Duty_Count++)
		{
			 TIM3->CCR3=0;//PWM Disable..
	         PWM_Duty = 1 << Duty_Count;
			 for(Bit_Count=7;Bit_Count>=0;Bit_Count--)//Seri Olarak data gönderiliyor. 
             {
				  GPIOB->BRR=GPIO_Pin_9;//CLK=0;
			      if(PWM_Duty&LED_Duty[Bit_Count]){GPIOB->BSRR=GPIO_Pin_8;}else{GPIOB->BRR=GPIO_Pin_8;}
			      GPIOB->BSRR=GPIO_Pin_9;//CLK=1;
			 }	
			 GPIOB->BRR=GPIO_Pin_8;GPIOB->BRR=GPIO_Pin_9; //Karisiklik olmamasi için DATA ve CLK pinlerini 0 yap1yoruz. 
			 GPIOB->BSRR=GPIO_Pin_10;//Latch=1;
			 __nop();__nop();__nop();__nop();__nop();__nop(); //LATCH islemi çok hizli oldugu için lojik analyser yakalayamiyordu. Araya delay koydum. 
	         GPIOB->BRR=GPIO_Pin_10;//Latch=0;
             TIM3->CCR3=PWM_Duty;//PWM Enable			 
			 delay_ms(2);
		}
      
  }


Kodlar yukarıdaki gibi.

Bu durumdayken duty değerlerini aşağıdaki gibi yaptım. Sonucu gözlemledim.
  LED_Duty[7]=1;   
  LED_Duty[0]=128;

Şimdi Yukarıdaki kodlarda en dıştaki döngü yani Duty_Count 0 iken olan olaylar şöyle, Bu değer 0 iken Bütün LED_Duty değişkenlerini 0. bitleri SR ye gönderiliyordu.

Daha önce PWM çıkışı tersleniyor diye bahsetmiştim. Çünkü OE girişi lojik 0 dayken çıkışlar aktif. Dolayısıyla biz bütün LED_Duty değişkenlerinin 0. bitlerini gönderiyoruz ve PWM değerini 1 yapıyorduk ya işte tam o sırada bizim OE ye uyguladığımız PWM değeri 1 olmasına rağmen çıkışta max. PWM görülüyor. Dolayısıyla LED_Duty[7] nin 0. biti 1 olduğu için SR nin 7. biti max. parlaklıkta yanıyor.

Ardından Duty_Count değeri 7 olduğunda ise LED_Duty değişkenlerinin 7. bitleri SR ye gönderiliyor.

LED_Duty[0] değişkeninin değerini 128 yaptım. Bu durumdayken bütün LED_Duty değişkenlerinin 7 bitleri SR ye gönderilir. Ardından PWM duty değeri max değer olan 128 değerini alır. Fakat OE girişi PWM sinyalini terslediği için SR nin 0. biti min. parlaklıkta yanar. Öylede oluyor. SR nin 0. bitindeki led  o kadar düşük yanıyor ki LEDin merkezine baktığın zaman ancak görebiliyorsun. Sönecek olan bir mum gibi titreye titreye yanıyor.  :)

Herşey iyi güzel terste olsa min.ve max. parlaklığı alıyoruz. Fakat bu algoritmanın bana göre ters bir tarafı var. Örneğin LED_Duty[0] değerini 127 yapalım. Bu durumdayken LED_Duty[0] değişkeninin içeriği binary olarak 01111111 olur. Bu durumdayken ilk 7 bit lojik 1 olduğu için sürekli SR ye gönderilir ve PWM değerlerinden 1-2-4-8-16-32-ve 64 değerlerini çıkışa yansıtır.

Gerçekte bu kodu deniyorum LED_Duty[0] değeri 127 iken SR nin 0. bitindeki led bayağı parlak yanıyor. LED_Duty[0] değerinin 128 yapıyorum. Yanabilecek en düşük parlaklıkta yanıyor.

Böyle tezatlıklar var işin içinde. Dolayısıyla sistemi henüz tam manasıyla çözebilmiş değilim. Açıkçası LED_Duty[0] değişkenini 0-255 arası aldığı değerleri nasıl 8 kademede yani LEDlere 8 farklı parlaklık uygulayarak yansıtabileceğiz anlamış değilim.

En son yaptığım uygulamada yani   LED_Duty[7]=1, LED_Duty[0]=128 iken Lojik analyser'dan aldığım çıktılar aşağıdaki linkte
https://yadi.sk/d/tR5d-8k8cW9kG
Saleae'nin Programı bilgisayarında kurulu olan herkes açıp bakabilir.

Hasan hocam, iyildirim hocam , Yanlış yaptığım veya yanlış düşündüğüm nokta neresi. Dediğim gibi Bu 74HC595'de bu işi düzgün yapamazsam panelde hiçbir şey yapamam.

İlgilenenlere Teşekkürler.







iyildirim

Alıntı yapılan: Mucit23 - 05 Kasım 2014, 13:32:18
Arkadaşlar yok, bu dediğiniz algoritmada ciddi anlamda sıkıntılar var. Az önce birkaç test daha yaptım. Ama sonuç alamıyorum.

......................

Gerçekte bu kodu deniyorum LED_Duty[0] değeri 127 iken SR nin 0. bitindeki led bayağı parlak yanıyor. LED_Duty[0] değerinin 128 yapıyorum. Yanabilecek en düşük parlaklıkta yanıyor.

Böyle tezatlıklar var işin içinde. Dolayısıyla sistemi henüz tam manasıyla çözebilmiş değilim. Açıkçası LED_Duty[0] değişkenini 0-255 arası aldığı değerleri nasıl 8 kademede yani LEDlere 8 farklı parlaklık uygulayarak yansıtabileceğiz anlamış değilim.

Hocam PWM polaritesini terlememişsiniz.
Duty 128 iken PWM çıkısı buna uygun ama SR çıkışına bakarsanız ancak PWM in off zamanı kadar yanabiliyor ledler.. 127 de parlak yanmasının nedeni de aynı. 
TIM3->CCR3=PWM_Duty;//PWM Enable       
satırını
TIM3->CCR3=129-PWM_Duty;//PWM Enable
şeklinde değiştirip denermisiniz.  Yada timer-OC modülüne PWM i ters polarite de istediğinizi de söyleyebilirsiniz.
32F103 mü kullanıyorsunuz?.
Bu hatanın dışında, verdiğiniz bu duty değerleri ile bakılınca çıktıda herşey algoritma ile uyumlu görünüyor. Led parlaklıklarının farklılaşmasını sizde gözlemişsiniz. Algoritmada, mantıkta bir sorun yok hocam.

RaMu

Alıntı yapılan: bocek - 04 Kasım 2014, 15:46:08
@mucit, nette dolanırken bir şeylere rastladım belki işine yarar (ucu cevhere çıkıyor).

http://www.mikrocontroller.net/topic/346057#new


Bence bu mesajdaki link arada kaynamasın,
detaylı bakmadım ama hazır örnek var stm32 ile ve 24bit rgb.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Mucit23

Hocam şimdi okuldayım, Akşam deneyeceğim. Parlaklıkta lineer bir artış sağlayabilirsem zaten iş bitmiş olur. :D

@Ramu o linkide inceledim. Adam M4 ile yapmış. OE den pwm uyguladığına göre Mantık olarakda şuanda uğraştığımız yöntem ile yapmış. Aslında F4 serisiyle uğraşsam 1. yöntem bile iş görebilirdi. Ama F4 kullanamam. Bu işi STM32F103 ile yapmam lazım.

Mucit23

iyildirim hocam, Gerekli düzenlemeyi yaptım. Şuanda PWM tersleme sorunu yok. Kanallarda ters değil. Birkaç problem kaldı onlarıda halledersem ilerlemeye devam edebilirim herhalde.

Şuanda en büyük sorun Duty seviyesini aşağı çektikçe titreme yapması. LED çok sönük bir şekilde yanıyor. Bu sırada titreme yapıyor. PWM frekansını arttırıp bir deneyeyim dedim çözüm olmadı. Bu neden kaynaklanır?

Diğer bir sorun ise Duty değeri 128'den büyük olsa bile parlaklık artmıyor. Daha önce max. %50 parlaklık alınır gibi bir ifade geçmişti. Ozaman bu durummu kastedilmişti? Bunun sebebi nedir?

Ben internetteki videoları izliyorum ve hala bu işi adam akıllı beceremediğimi düşünüyorum.

iyildirim

Titremenin nedeni şu andaki sürme frekansının düşüklüğü olabilir.
Kodun bu haliyle 2ms-8 bit için 16 ms toplam zamandan 62.5 hz tazeleme frekansı oluyor.
Panel için konuşursak 2ms de  aslında 8 satır için 8 kere güncelleme yapıyoruz. Yani 1 bit için 250 us kalıyor. Delay kısmını 250usec yapıp denerseniz belki faydası olur. Gerçi tek bir ledin yanma frekansı değişmeyecek panel için konuşursak. Ama titreme için fikir verir. Yani panel de daha da kötü olabilir, özellikle parlaklık konusunda.

Parlaklık konusunda ise PWM olmaksınız elde edilecek parlaklığın 1/4 elde edilebilir ancak. 8 bitlik çevrimde toplam süre 16ms,  Duty ON  süresi ise max 4 ms.
Bi bakın olmazsa her bir bit için 2ms değil, bit değerine uygun şekilde 2 nin katları şeklinde süreleri tanımlamak gibi birşeyler yapma yoluna gidilebilir.
 

iyildirim

@Mucit23 hocam, delay(2ms) yerine delay(16us * duty)  yapıp OE pinini sürekli aktif ederseniz parlaklıkta ve titremede bir fark oluyor mu? Bi denermisiniz. ?


Mucit23

#100
Hocam denedim, ama sadece işler biraz hızlandı. Değişen hiç bir şey olmadı. Yaptığım tespitlere göre genellikle Duty %10'dan sonra titreme olmuyor.

Parlaklık konusu aklıma takıldı, Şöyle bir ifadeniz var.
Alıntı YapParlaklık konusunda ise PWM olmaksınız elde edilecek parlaklığın 1/4 elde edilebilir ancak.
Bu OE'ye hiç PWM uygulamıyorken(Lojik 0 iken) Led'in verebileceği max. Parlaklığın 1/4'ü alınır şeklinde algıladım. Dolayısıyla Duty Değerleri %128'den büyük olsa bile parlaklık açısından birşey ifade etmeyecek.

Ben birde ilk yöntemde çözünürlüğü 5 bit yapmayı deneyeceğim. Hatta 4 bit bile olur. O yöntemin çalışması nedense bana daha mantıklı geliyor. Daha problemsiz çalışıyor.

Herneyse, Şu işlemleri Döngüden kurtarıp timer üzerine çalışacak şekilde ayarlayayım. Sonra döngüden bağımsız olarak parlaklıklar ile oynayıp ledlerdeki değişimin videosunu çekeceğim. Sonra sonuca göre tekrar yorum yapalım.

iyildirim

#101
Beklemeyi duty ile orantılı yapıp OE yi sürekli aktif yapmak birinci yöntem zaten. Ledlerin yanma zamanlarını ilgili bitin değerine göre ayarlamış oluyoruz.
4096 + 32f4 ile denediğimde parlaklıkta ciddi artış oldu. Satır lar için 8 lik döngüyü de eklediğimde parlaklık azalsa bile tek satır varmış gibi OE ye PWM uygulamaktan daha parlak.
Bekleme yerine timer kullandım. Tek yaptığım duty değerini timx->CCR1 yerine timx->ARR registerine yüklemek. Ki bu durumda 8 bitlik döngünün toplam süresi 500us oluyor. 62,5 yerine 4 katı tazeleme olmuş oluyor yani. Bu yüzden hiç titreme yok. Yine de büyük ihtimalle 8 bit için düşük değerleri bitleri zamanında basamıyordur mcu.
OE ye pwm uyguladığımız yöntemde de 2ms beklemeyi düşürünce titreme olmaması gerekli. Ama parlaklık için yapılacak bir şey yok.

Mucit23

Alıntı YapBekleme yerine timer kullandım. Tek yaptığım duty değerini timx->CCR1 yerine timx->ARR registerine yüklemek. Ki bu durumda 8 bitlik döngünün toplam süresi 500us oluyor. 62,5 yerine 4 katı tazeleme olmuş oluyor yani. Bu yüzden hiç titreme yok. Yine de büyük ihtimalle 8 bit için düşük değerleri bitleri zamanında basamıyordur mcu.
OE ye pwm uyguladığımız yöntemde de 2ms beklemeyi düşürünce titreme olmaması gerekli. Ama parlaklık için yapılacak bir şey yok.

Hocam peki Burada PWM kullanmadınızmı, Yani OE'den PWM uygulamadınızmı?

Birde ben OE'den PWM uygulanarak PWM çoğullama örneği bulamadım hiç. Bu yöntemin internette yapılmış bir örneği varmı? 

bocek

#103
@mucit Binary Coded Modulation-BCM (diğer adıyla Bit Angle Modulation-BAM) diye bir şey varmış. Şurayı bir incele istersen.

http://www.batsocks.co.uk/readme/art_bcm_1.htm


mesaj birleştirme:: 06 Kasım 2014, 16:55:13

bir de bu var:
https://www.pjrc.com/teensy/td_libs_ShiftPWM.html
1 ya da 0. işte 'bit'ün mesele..

iyildirim

Alıntı yapılan: Mucit23 - 06 Kasım 2014, 12:45:46
Hocam peki Burada PWM kullanmadınızmı, Yani OE'den PWM uygulamadınızmı?

Birde ben OE'den PWM uygulanarak PWM çoğullama örneği bulamadım hiç. Bu yöntemin internette yapılmış bir örneği varmı? 

Duty peryoduna PWM peryodundan daha büyük değer verdiğim için PWM uygulanmadı. Ama uygulanabilirde. Master parlaklık kontolü gibi.

Örnek de, yöntemin adı da varmış zaten. Herşey keşfedildi Truman! durumu..
@bocek hocamın verdiği ilk linkte 3. sayfa  konuştuğumuz en son durumu iyi anlatıyor.

Deneme yaparken kutudan birde ortak anod RGB led çıktı. Gerekli düzenleme leri yapıp test edince, özellikle yeşil renk çok baskın göründü. @bocek hocamın verdiği linklerde de bundan da bahsedilmiş. Kendi adıma her bir rengin dirençleri ile oynamak yeterli olur diye düşünüyorum, ama panel de bu olanak olmayabilir.

Bir diğer konu ben testleri 32f4 ile yaptım. 32f4 bu işe yetsede F103, 24 bit için yeterli gelmeyebilir. F103 de 24 bit olsun durumunda karşılaştırma işlerine hiç girmeden veriyi paralel basılabilecek şekile getirmek aklıma gelen tek yok. 6 bit-pin test edilmeden tek clockda basılabilirse F103, 24 bit için fazla fazla yeter.  Bir de donanıma yüklenilirse tadından yenmez. Zaten hazırı olan bir şey için bu kadar konuştuktan sonra yapılmışı uygulamakla yetinmemeli derim.