E

PWM RGB Led Chaser( Kara Simsek) basic kodlu

Başlatan Erata, 17 Kasım 2012, 09:33:25

entegre46

ete hocam acemice ekteki gibi bir kod yazdım ama dediğiniz gibi titremeler var MIBAM konusunu bir örnek kodla açıklayabilirmisiniz bu konuyu micro c de de çok araştırdım ama donanımsal pwm örneği çok ama yazılımsal pwm örneği hiç bulamadım yardımlarınız için şimdiden teşekkürler

ete

Bu tür mantıkla istediğini elde etmen zor. Mibam konusu bilen için basit bilmeyen için zor bir konu. Şu anda yurt dışı seyehatteyim. Dönünce bir şeyler yapmaya çalışırım.
Yazdığın kodda pwm komutlarında sonda verdiğin 1 rakamını artırıp karşılığında pause 60 komut satırını silmen gerekir 1 yerine kaç yazman gerektiğini deneyerek bulmaya çalış.
Ete

entegre46

Teşekkürler hocam . Geldiğinizde yardımlarınızı bekliyorum hocam bu konu üzerinde uzun zamandır uğraşıyorum penimle pic arasında izzeti nefis meselesine dönüştü ;D bu işi çözmeden de başka projelere elim varmıyor pes etmek gibi geliyor bana bende öğretmen olduğum için bilgi yaymanın önemini iyi biliyorum

AB ELEKTRONİK

SELAM arkadaşlar

bir konuda yardıma ihtiyacımvar yardımcı olursanız sevinirim kafam durdu resmen calışmıyor bir türlü
sorunum şu iki adet butonumuz var bu butonlarla şerit led in ışıgını kısıp acmak istiyorum birtanede acma kapama butonumuz olacak komple acıp kapayacak oda bukonuda yardımcı ola bilir misiniz lütfen şimdiden sonsuz teşekkürler

ete

Yapman gereken , bir tane hpwm çıkışı olan pic alacaksın. 16f628 veya 12F683 olabilir.
Hpwm frekansını yaklaşık 1 khz dolayında ayarlayacaksın. İki buton bağlayıp bunları giriş olarak ayarlayacaksın. Normal şartlarda ışığın kısılıp açılması iki butonla yapılır biri kısar diğeri açar. Bir üçüncü buton ise sistemi açıp kapatır. Sistemi açıp kapatmaya çok gerek varmı bilemem. Sonuçta ışığı iyice kısmak demek sistemi kapatmak demek olacak sonuçta.
Madem iki butonla bu işi yapacaksın butonun birisi bastıkça duty değerini artıracak ve maksimuma ulaşınca başlayacak düşürmeye. Diğer
Adı üzerinde açıp kapatacak.

Ders notlarımda buna ait çalışma örneği mevcut.

Ete

AB ELEKTRONİK

selam
hocam verdiginiz acıklayıcı bilgiden dolayı son suz teşekkürler hocam verdiginiz fikir dogrultusunda yaptım oldu allahım sızden razı olsun

Mucit23

#21
ETE hocam Selamlar,

Belki görmüşsünüzdür, RGB iç ortam P6 modüller var. Bu modülleri mikrodenetleyici ile sürmek için uğraşıyorum.
http://www.picproje.org/index.php/topic,55627.0.html
Bu linkte panel hakkında bilgiler vermiştim.

Panelin çalışması kısaca şöyle, Panelde 6 adet 32 bitlik Shift register düşünün, Bu Shift registerlerin her biri farklı bölgelerdeki ledleri yakıyor. Her bir Shift Registerin Latch ve Clock girişi ortak olmasına karşın Data girişleri ayrı ayrı çıkartılmış. Yani toplamda 6 adet 6 girişi 1 adet clock girişi ve birde latch girişi var.

Tek clockda 6 bit birden göndermek gerekiyor. Bana 192 kanal PWM lazım.

İşin zorluğu şurada. Panelde hedefim Her bir Shift registerin pinlerinden bağımsız olarak 6 bit çözünürlükte pwm sinyali almak. Bu işlem çok zor. Yüksek Hız ve performans istiyor.

Aslında bu tür panellerin sürüldüğü kartların hepsinde FPGA var. Dolayısıyla FPGA larda paralel işlem vs gibi durumlar olduğu için SR lerden PWM uygulamak eziyet haline gelmiyor. FPGA bu iş için biçilmiş kaftan. Bende kullandığım mikrodenetleyicilerdeki hızlardan faydalanarak bu açığı kapatmaya çalışıyorum.

Picprojede bu konuyu çok konuştuk. Birçok yöntem denedim.(Suanda 74HC595 ile deniyorum :) )Mesela ilk başta 8 bit pwm sinyalinde 1 periyot için 256 kesme gereken yöntemi denedim gayet güzel sonuç aldım.
http://arectron.com/yazilim/stm32f103-74hc595-ile-shift-pwm.html
Fakat tek bir 74HC595 8 kanal ve 8 bit pwm üretiyordum. Kanal sayısını 6*32'den 192 ye çıkarmak gerekince 72Mhz de çalışan STM32F103 yetersiz geldi.

Sonuç olarak döndüm dolaştım mibam denen yönteme denk geldim. Bunuda öğrenmem lazım.

Amacım 6 adet Shift registerin her bir kanalından ayrı ayrı pwm oluşturabilmek. Bu gözünüzü korkutmasın 74HC595'de bu işi düzgün bir şekilde yaparsam Panel üzerindede yapabilirim.

PicBasic Sitesindeki konuyu biraz inceledim. Sistem gerçekten karmaşık duruyor. Bir türlü arkada oluşan olayları aklımda canlandıramadım. 

Bu yötemde açıkçası aklıma süreler felan takılıyor.  Timer'i kesmesini nasıl kullanmam gerekiyor? 74HC595 üzerinden bu iş nasıl yapılır.
Yöntem hakkında müsait bir vaktinizde biraz açıklama yapabilirmisiniz? BAM denen olayı gerçekleştirmek için yapılması gerekenleri adım adım yazarsanız gerçekten memnun olurum.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Mibam kelimesi Mirror Bit Angle Modulation kelimelerinden üretilmiştir.
İşin aslı Artistic License firmasına aittir. Onlar bu işi BAM yani Bit İmaj Modulasyon olarak yapmışlar.
MIBAM işini Darrel Taylor geliştirdi.

http://www.picbasic.co.uk/forum/showthread.php?t=10564

İşin temeli PWM yerine bit lerin durumlarına göre modulasyon oluşturmaya dayanıyor.
Aslında karşılaştırma yapmak için şöyle bir mantık da yürütülebilir.
Peryodu 10 ms olan bir HIGH peryodu ile peşine 10ms LOW peryodu olan bir sinyalimiz olsa buna 50 hz de %50 duty değeri olan bir PWM sinyali diyebiliriz.
Aynı imajı yakalamak için 20 ms içinde toplam HIGH süresi yine 10 ms olacak şekilde birden fazla kare dalgamız olsa bizim sinyalin duty değeri yine %50 olacaktır.
Çok derinlemesine bilmesemde okudaklarımdan edindiğim bilgiye göre Bir Mibam sinyali bitlerin adetleri hesaplanarak sinyal haline dönüştürülüyor.
Örnekle açıklamaya çalışayım, %1001 şeklinde bir 4 bitlik değerimiz olsun. Bunun BAM karşılığı 8peryot * HIGH + 4 peryot LOW + 2 peryot LOW + 1 Peryot HIGH şeklinde olacaktır. 1peryot= 10us ise, Bu sinyalde HIG lerin toplamı 81us low ların toplamı ise 60 us olacaktır.
Bu sistemin asıl bulunma amacı veya sebebi ise birden fazla pinden kesme yolu ile PWM sinyalinin titreme olmaksızın elde edilmesine yöneliktir.
8-bit PWM, yaratmak için çevrim başına 256 defa kesme yaratman gerekir. Bu ise yaklaşık 100 Hz yenileme frekansı ile saniyede 25600 kesme yaratılması anlamına gelir.

BAM kullandığın zaman her çevrim için yalnızca 8 kesme (her bir bir çözünürlük için) ve 100 hz frekans için 1 sn de 800 kesme yaratman yeterli olacaktır.

http://www.artisticlicence.com/app%20notes/appnote011.pdf<!-- BitAngleModulation.pdf -->
Görünüşe göre asıl avantaj yartılacak kesme sayısında. Bu nedenle Mibam ile gerçekten kesintisiz yada titreşimsiz led dimlemek mümkün olabiliyor.

Ete


Mucit23

#23
Hocam süre meselesini anladım. Her bir bitin basamak değeri kadar 1 yada 0 yapıyoruz.  Ozellikle 8 bit için bu nasıl uygulanacak anlayamadım.  Gercekten peryot başına 256 kesme yerine 8 kesme cok cazip geliyor. Heleki çözünürlüğümü 6 bit yaparsam 1 peryot için 6 adet kesme yeterli olur. Mantığı koda dökemiyorum bir türlü. 

Hocam mümkünse eğer 1 peryot luk pwm olusturmak için döngünün nasıl kurulduğunu anlayabilecegim örnek bir kod parçası verebilirmisiniz.

Birde hocam pdf de sorun var açamadim.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Bu konuda yardımcı olamam. Ben genelde Darrel'in hazır kodlarını kullanıyorum.
Aslında onu incelesen belkide senin için daha uygun olacak.
Verdiğim linkte örnekleri var. Orada kendi hazırladığı bir MIBAM isimli include dosyası var.
Detay orada vardır.
Ama C de yazacaksan işin mantığını iyice kavramak gerekir.

Ete

Mucit23

Anladım hocam. Fonksiyonu c de yazmam gerekiyor. Sıkıntıda burada. İşin bel kemiği olan 1 peryotluk süreyi oluşturma konusunda sıkıntı yaşıyorum.  Bu kısmı bir türlü anlayamadım.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

#26
Aslında işin mantığını anladım ama bunu program mantığına çevirmekte zorlanıyorum.
Ben biraz anlatayımda sen belki bir yol bulursun.
Öncelikle işin tekniğine bakmak gerekiyor. Bunu örnekleme ile anlatmak daha doğru olacak.
8 bitlik bir sistem üzerinden konuşuyorum. 8 biti oluşturan rakamın bitlerinin desimal çevriminde 1-2-4-8-16-32-64-128 rakamlarını kullanıyoruz. Bu durumda kesme oluştuğunda her bitin karşılığı ilk bitin bekleme süresi ile bitin desimal karşılığını çarpımına eşit olmalı. Diyelimki bit0 yada karışmasın diye onada bit1 diyelim son bit de bit8 olsun. Bit1 süresi=10us olsun.
bit2=2*10=20us olacak , bit3=4*10=40us olacak bu şekilde bit8=128*10=1280us olacaktır.
şimdi belirli aralıklarla 8 kesmelik bir sistem yaratsak. Her kesmede bir index değişkenide bir artırılsa sonra her bir pine ait duty değerinin bitlerini index kullanarak porta versek. Sonra index değerine bağlı süre kadar bekleyip yeniden kesmeye gitsek bu iş olur gibime geliyor. Biraz daha açarsak; Diyelimki 4 bitlik bir MIBAM sinyalini PORTC.0-PORTC.1,-PORTC.2 Portc.3 den çıkartacağız.  Bit0 bekleme süresi 30us olsun.
-kesme oluştu
-Index=0
  PORTC.0=duty0.0[INDEX]
  PORTC.1=Duty1.0[INDEX]
  PORTC.2=Duty2.0[INDEX]
  PORTC.3=Duty3.0[INDEX]
  Pauseus  SURE[INDEX]  'yani 30us
  PORTC=0
  kesmeden çıktık
- Ikınci kesme oluştu, Index=Index+1=1 oldu 
  PORTC.0=duty0.0[INDEX]
  PORTC.1=Duty1.0[INDEX]
  PORTC.2=Duty2.0[INDEX]
  PORTC.3=Duty3.0[INDEX]
  Pauseus  SURE[INDEX]  'yani 60us
  PortC=0
  Kesmeden çıktık
- Üçüncü kesme oluştu, Index=2
  PORTC.0=duty0.0[INDEX]
  PORTC.1=Duty1.0[INDEX]
  PORTC.2=Duty2.0[INDEX]
  PORTC.3=Duty3.0[INDEX]
  Pauseus  SURE[INDEX]  'yani 120us
  PortC=0
  Kesmeden çıktık
- Dördüncü kesme oluştu Index=3
  PORTC.0=duty0.0[INDEX]
  PORTC.1=Duty1.0[INDEX]
  PORTC.2=Duty2.0[INDEX]
  PORTC.3=Duty3.0[INDEX]
  Pauseus  SURE[INDEX]  'yani 120us
  PortC=0
  Kesmeden çıktık
bu aşamadan sonra index yeniden sıfıra döner ve döngü tekrarlanır.
Buraya kadar anlattıklarımı anladın ise yapmak çok zor gözükmüyor. Ancak MIBAM denilen sistem birde mirror imajı var.
Yani BAM sisteminde %1100 şeklinde verilen bir bilgi MIBAM da %1100 0011 olarak veriliyor. Bitlerin pozisyonu değiştirilerek neyle başlanmış ise onunla bitiriliyor. Bu yüzden adına Mirror (yani bitlerin ayna görüntüsü demek daha doğru olur) denilmiş.
Anlaşılayan bir yer var ise tartışalım. Benim anlattıklarımda kafama oturmayan tek yer kesmeyi hangi sıklıkta oluşturmak gereğidir.  Onuda deneme yanılma ile mi buluruz yoksa bir hesap mantığımı kurarız henüz düşünemedim. Onun dışındakiler gayet güzel çalışır diye düşünüyorum.

İlişikte basit bir çalışmam var bunu durdura durdura çalıştırıp incele istersen işin mantığını göresl olarak da anlayabilirsin.

Ete

Mucit23

Hocam mantığı biraz anladım.

Sadece şu kısım biraz sıkıntılı
  PORTC.0=duty0.0[INDEX]
  PORTC.1=Duty1.0[INDEX]
  PORTC.2=Duty2.0[INDEX]
  PORTC.3=Duty3.0[INDEX]


PORTC.0=duty0.0[INDEX]
Buradaki ifadeyi anlayamadım. Portc.0'a Duty0 değişkeninin index'inci biti mi atanıyor. Anladığım kadarıyl böyle birşey olması gerekiyor.

BAM ile MIBAM arasındaki farkı anladım ama neden böyle birşeye ihtiyaç duyuluyor? Bu işlem yükünü arttırmazmı?

Birde şöyle birşey var. Hiç bahsetmedim. Aslında yeni aklıma geldi.

Panelde Yatay taramada yapıyoruz. Paneli 16 satırdan oluşuyor. Tarama iki  bir şekilde ABC pinlerinden yapılıyor.
ABC=000 ise aktif olan satırlar 1-9
ABC=001 ise aktif olan satırlar 2-10
.
.
.
ABC=111 ise aktif olan satırlar 9-16

Yatay tarama bu şekilde yapılıyor.
Her bir satırın aktif olma süresi 2ms civarı olması gerekiyor.

Benim yapılacak olan herşeyi 2ms içerisinde halletmem lazım. Çünkü 2ms sonra aynı işlemleri bir sonraki aktif olacak satır üzerinde yapmam gerekiyor.

İşin en büyük zorluğu burası olduğunu söyleyebilirim. Bu yüzden 20 30-us gibi bekleme süreleri benim için çok büyük süreler.

Ben birde şunu bir türlü kestiremedim. Yukarıda anlattığınız işlemleri ShiftRegister ile nasıl yapacağım bunu düşünüyorum. Diyorumki Ben mibam işlemini doğrudan port'un ilgili bitlerine yazmaktansa ilk önce geçici değişkenler üzerinde yapıp sonra bu veriyi hızlıca Shift register'a göndermek.
Yani PORTC.0=duty0.0[INDEX] yerine temp.0=duty0.0[INDEX] şeklinde birşey yapıp temp değişkeninin Shift Registera göndermek. Bu olabilir.

Benim aklıma takılan konu gecikme meselesi.
Hocam aşağıda bir tablo var geçenlerde hazırlamıştım.
https://docs.google.com/spreadsheets/d/1gA3L6CRhEZvIhVJTa0HUKi5sRIYGjjGNbhoRD920g1M/edit#gid=496249709
Panelin veri yapısı bu şekilde

6 Adet Shift Register var. Her bir Shift Register'a peş peşe iki adet 16 bitlik veri gönderiyoruz. Toplamda 32 bitlik veri ediyor.
6 adet 32 bitlik datayı benim panele göndermem önceki ölçümlerimde 40us sürdüğünü öğrenmiştim.

Burada sıkıntı olan şey tüm işlemlerin 2ms içerisinde yapmak gerekmesi. Bu konuyu bir türlü kafamda kuramıyorum. Yukarıdaki 40uS seri olarak veri basma süresi 8 bit duty için 8 defa çalışacak

Buna göre kesmeyi kaç us aralıklarla oluşturmalıyım? Bu konuyu bir türlü kafamda kuramıyorum.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

Mibam değilde bam ile ilgili ilk testimi yaptım. Sonuç gayet başarılı.  74HC595 in' 8 kanalından 3Khz pwm sinyali alabildim.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

#29
Mibam bence çok fazla pinden çıkış alacak isen ve 8 bit çalışacak isen gerekli.
8 bit duty değerin var ise 8 bit de bekleme süresi çok fazla oluyor. Bu da led lerde titreme yaptırıyormuş bunu önlemek için  normal de bam için kullandığın süreleri ikiye bölüp onu mibam a çevirmiş adam. Böylece aynı süre beklemesine rağmen titreşim yada göz kırpma ortadan kalkmış.
İşin basit açıklaması bu.

Duty değerleri ni sormuşsun ama sonradan anlamışsın galiba ki uygulama yapmışsın.
Pwm de duty değeri ledin parlaklığını vermiyormu?. Pwm sisteminde duty değeri pinden çıkan sinyalin high kısmının %değeri olarak uygulanıyor. Mibam sisteminde ise duty değerinin bitlerini kullanıp onları sırası ile çıkışa verip bit konumları kadar çıkışta kalmalarını sağlıyoruz olay budur.

Sürelere fazladır diye yorum yapmışsın. Ama gerçekte bu böyle değil bence. İşin trick noktasıda burada. Port bitlerine değer verip bit konum süresi kadar bekliyorsunki buda an fazla 1-1,2 ms olur ki sen 2 ms lik bir süre kullanıyorsun. Sorunda burada kesme süren kısa olacak belkide 50 us olur ama kesmede kalma süren uzun olacak yada şöylede olabilir. Kesme içinde bitleri aktif ettin kesmeyi bit süresi kadar sonra oluşturabilirsin buda bir yol. Önceden sabit rakamları belirlersin . 8 ayrı süre için timera ne değer vereceğini tespit edersin. Her kesmeden çıkışta timer ön yükleme değeri olarak bit bekleme süresini verirsin. Bu fikir dahada hoşuma gitti çünki ne aralıkla kesme üreteceğim sorusunada cevap bulmuş olduk. Bence bu iş böyle yapılır.
Sen 6 bit çalışacağına göre Bam sistemi ilede çalışabilirsin sorun olmaz.

Duty değerlerini porta değilde 595 lere vermek de sorun olmaz hatta bence daha kolay bu iş.
Donanımsal Spi kullandığın zaman biliyorsun aktarma çok hızlı oluyor. Orada sorun olmaz geriye 595 lere bilgi yüklemek kalıyor ki buda şöyle olabilir.
Reg_A birinci 595 in register değeri olsun. Elinde 8 adet duty değeri olması gerekiyor. Buna da Duty_A0 , Duty_A1......, Duty_A7 şeklinde isim verirsek her bir pinden çıkacak bam sinyali için değişkenlerimiz ayarlanmış olur. Bu değişkenlerin 0-250 arasında duty değeri alacağını varsayarsak herbirininde farklı değerleri olursa her bir değerin sıralı bit değerlerini Reg_A ya vermen gerekiyor.
Mesela bit sıfır konumu için,
Reg_A nın sıfırıncı biti =Duty_A0 ın sıfırıncı biti şeklinde bir tanımlama ile duty değerlerinin ilk bit lerini Reg_A ya vermiş oldun. Bunu gidip 595 e yazdın ve sıfır bit süresi kadar bir süre sonra kesme oluşacak şekilde ayarladın ve kesmeden çıktın. Bit0 süresi kadar sonra kesme oluşacak ve sen bu sefer, Reg_A ya, duty ların birinci bitlerini vereceksin. Kesmeyi busefer bit1 pozisyonu kadar süreye ayarlayacaksın kesmeden çıkacaksın. Bu işlem 8 bitlik duty değerleri aktarılıncaya kadar devam edecek. Sonunda tekrar başa dönüp bit sıfırdan yeniden başlayacaksın.
Karmaşık gibi görünmesine rağmen bence değil ve bu sistem kesinlikle çalışır.

Ete

Powered by EzPortal