RGB saat

Başlatan efor, 18 Mart 2012, 18:55:58

Mucit23

Hocam Ben yine bi denemek istiyorum.
Teoride bana çok akıcı geliyor döngü. Deneyip size durumu videolarla destekli bir şekilde bildiririm. Aslında PWM sinyalinde bir problem çıkmayacağını düşünüyorum. Kesme frekansındada bir sıkıntı olmazsa bu iş olur kanaatindeyim.

Hocam neden bi araba dolusu kod yazmak lazım dediniz. Anlamadım doğrusu. Yapılması gerkenler sırasıyla PWM kurulacak Sanırım 1Khz uygun olur. Daha sonra timer kesmesi kurulacak ve her 2ms de bir kesme kesme oluşması sağlanacak. Kesme alt programda  ise sıra sıra her renge ait duty değerleri pwm registerine verilip renkler tarancak. Ana program içerisinde ise artık her renge ait duty değerleriyle oynanır. Ben biraz uğraşayım.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Bir araba kod terimini bizim yapacağımız iş için kullandım. Yoksa bir sinyali multiplexlemek uzun kod gerektirmez.

Ete

efor

benimson yazdıgım mesaja birşey dememişsinzi hocam :)

ete

O kadar fazla mesaj trafiği altındayımki hangisine cevap yazacağımı şaşırdım artık.
Senin yazdıklarında teorik olarak olur. Ancak yazılımla PWM üretecek olursak haberleşme anında kesintiler olabilir.
Sonuçta PWM sinyalleri kesme ile oluşacak haberleşmede kesmeye bağlanacak. Birinden birisi sıkıntı yaratacaktır.
Eniyisi 3 adet donanımsal PWM çıkışı olan 16F777 kullanarak bu işin üstesinden gelinebilir. 2 adet 16F777 ve 1 adet saat için 16F88 kullanılarak bu iş yapılabilir. Çok zorlanırsa saat sistemi de belki birinci 16F777 ye yüklenirse 2 pic ile bu iş yapılmış olur.

Ete

efor

anlaşıldı hocam. 16f777 ler 3 pwm için gerekli olan picler. saat için neden 16f88? bunu hiç kullanmadıgım için soruyorum hocam.  pcb çizimine bu bahsı gecen picleri ilave ediyorum ozman hocam. isiste simüle edelim diyecektim fakat 16f777 yok.

ete

F88 dedim çünki son yaptığım saat de hafıza yetmediği için mecburen F88'e geçmiştim. Aynı sebebeple F88 dedim.

Ete

efor

 heralde bu picte 7 kb  hafıza var. saat işlemcisi olarakta 16f88 i kullanıyorum hocam tamam . ledler için mosfeti ne kullanmalıyım ? picin sürebilecegi şekilde. 

ete

Nmoslar için IRF540 Pmoslar için IRF9540

Ete

efor

Ledleri TPIC ile kontrol edecegim için RGB nin ortak ucuna tpic ten voltaj gelecek. diger R G B  uclarına ise mos üzerinden  + gerilim verecegim bunun için n kanalmı p kanalmı hocam ?

ete


Mucit23

#100
Merhabalar Ete hocam

Hocam dediğim gibi multiplex pwm yöntemini gerçekte uyguladım.
16F628 Kullandım. PWM frakansını 4Khz ye ayarladım.
Her 2ms de bir kesme oluşturup her kesmeye gittiğinde duty registerine yeni bir led verip bir sonraki ledi aktif ettim. Simülasyonda osiloskopla baktığımda herşey çok iyi görünüyor.Tam istediğim gibi herşey. Hesaplarımın hepsini gerçekte olması gerektiği gibi görüyorum fakat aksi bir durum var. Gerçekte ledlerde hiç titreme yok pwm oranlarını değiştirdiğimdede kısmen renk değerleri değişiyor fakat prüzsüz değil.
Bakın bu simülasyonda osiloskopla baktığım zaman gördüklerim.

image hosting adult
Osiloskopta bakıldığında sarı kanal kırmızı led, mavi kanal yeşil led ve kırmızı kanal ise mavi ledin aktif olduğunu gösteriyor. İlgili kanal 1 ise led aktif demektir.
En altta görülen yeşil kanal ise ise RB3 pininden aldığım PWM sinyalidir. Watch windowda duty oranlarını görebilirsiniz.

Bu Resim ise gerçekte gördüğüm sinyaller. Logic analyser ile bu sinyalleri gözlemledim.

image hosting adult
Sıralama yine aynı şekildedir. Kanal 0 kırmızı ledi, Kanal 1 Mavi, kanal2 Yeşil, Kanal4 ise PWM sinyalini gösteriyor.
Gördüğüm sinyaller böyle ama nedense gerçekte akıcı sinyaller alamıyorum. Dolayısıyla Renk geçişleri düzgün değil Hatta hiç renk geçisi doğru düzgün olmuyor.

Mesela bu iş için aşağıdaki kodları yazdım.
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [Ferhat YOL]                                      *
'*  Notice  : Copyright (c) 2012 [Mucit23]                      *
'*          : All Rights Reserved                               *
'*  Date    : 23.05.2012                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
DEFINE OSC 4

@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_off & _LVP_OFF & _CP_OFF

TRISA=%00001111
TRISB=%11000000
PORTA=0:PORTB=0

CMCON=7                 ;Comparatör kapatıldı
T2CON = %00000100      ;Timer2 aktif edildi bölücü oranı 1/1
INTCON= %10100000       ;Tüm Global kesmeler aktif edildi.
OPTION_REG=%00000011    ;Timer0 bölücü oranı 1/16 olarak ayarlandı.
TMR0=131                ;2ms de bir kesme oluşması için gerekli TMR0 Ön Değeri
PR2=249                 ;Timer2 1Khz Frekans için gerekli olan değer
ON INTERRUPT GOTO INT   ;Kesme oluşursa kesme isimli etikete git

DEFINE CCP1_REG   PORTB 
DEFINE CCP1_BIT   3

SYMBOL RLED=PORTB.0
SYMBOL GLED=PORTB.2
SYMBOL BLED=PORTB.4
symbol RART=PORTA.0
SYMBOL RAZT=PORTA.1
SYMBOL GART=PORTA.2
SYMBOL GAZT=PORTA.3
SYMBOL BART=PORTB.6
SYMBOL BAZT=PORTB.7

DLY     VAR WORD        ;DELAY Sayacı
DUTY    VAR WORD        ;PWM registerine yazılacak duty değeri
RDUTY   VAR WORD        ;Kırmızı lede ait duty değeri
GDUTY   VAR WORD        ;Yeşil Lede ait Duty değeri
BDUTY   VAR WORD        ;Mavi Lede Ait duty değeri
X       VAR BYTE
gosub PWM_ON
BASLA:
IF RART=0 THEN
  RDUTY=RDUTY+1
  IF RDUTY=>1000 THEN RDUTY=1000
  GOSUB DELAY
ENDIF

IF RAZT=0 THEN
  RDUTY=RDUTY-1
  IF RDUTY>1000 THEN RDUTY=0
  GOSUB DELAY
ENDIF

IF GART=0 THEN
  GDUTY=GDUTY+1
  IF GDUTY=>1000 THEN GDUTY=1000
  GOSUB DELAY
ENDIF

IF GAZT=0 THEN
  GDUTY=GDUTY-1
  IF GDUTY>1000 THEN GDUTY=0
  GOSUB DELAY
ENDIF

IF BART=0 THEN
  BDUTY=BDUTY+1
  IF BDUTY=>1000 THEN BDUTY=1000
  GOSUB DELAY
ENDIF

IF BAZT=0 THEN
  BDUTY=BDUTY-1
  IF BDUTY>1000 THEN BDUTY=0
  GOSUB DELAY
ENDIF

GOTO BASLA

DELAY:
   for DLY=0 TO 8:PAUSEUS 1:NEXT
RETURN

DISABLE
INT:
PORTA.0=1
X=X+1:IF X=>3 THEN X=0
  SELECT CASE X
  CASE 0
    BLED=0
      DUTY=RDUTY
      CCP1CON.4=DUTY.0
      CCP1CON.5=DUTY.1
      CCPR1L=DUTY>>2
    RLED=1
  CASE 1
    RLED=0
      DUTY=GDUTY
      CCP1CON.4=DUTY.0
      CCP1CON.5=DUTY.1
      CCPR1L=DUTY>>2
    GLED=1
  CASE 2
    GLED=0
      DUTY=BDUTY
      CCP1CON.4=DUTY.0
      CCP1CON.5=DUTY.1
      CCPR1L=DUTY>>2
    BLED=1
  END SELECT
INTCON.2=0
TMR0=131
RESUME
ENABLE

PWM_YAZ:
  CCP1CON.4=DUTY.0
  CCP1CON.5=DUTY.1
  CCPR1L=DUTY>>2
RETURN

PWM_ON:
  CCP1CON.2=1       ;PWM ON
  CCP1CON.3=1       ;PWM ON
RETURN

END


Duty oranlarını butonlarla arttırıp azaltıyorum. Aslında elimde çok pinli bir işlemci yoktu. 16F877 gibi bir işlemci kullanıp birde lcd takıp duty değerlerini anlık olarak izlemek daha iyi olur. En azından duty değerlerini bildiğimiz için çıkıştan aldığımız sinyaller ile karşılaştırabiliriz hocam.

Bilmiyorum ben ilk başta hiç verim alamadım ama yazılım prüzsüzleştirilirse çok iyi bir yöntem haline gelebilir.
Aslında hocam PWM çıkışını logic analyserde izledim Duty geçişleri arasında hiç boşluk yok bence oralarda ölü süreler olmalı. Bakıyorum bir diğer renk çıkışı aktif edildikten sonra yeni duty değeri çıkışa yansıyor. Bir şekilde PWM çıkışındaki duty değeri ile renk çıkışı aynı anda aktif olmalı.

Bi inceleyebilirmisiniz hocam yorumunuz nedir bu konuda.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

#101
Hocam baya bi gelişme oldu şimdi. Yazılımsal ufak tefek gözden kaçırdığım noktalar varmış. Onları düzeltince şimdi daha iyi oldu. Ama yine problemler var.
Hocam yüklediğim resmi inceleyin problemi hemen anlarsınız

image hosting adult

Sorun şöyle
Diyelim R kanalı Lojik1 deyken lojik 0 a inmesinin hemen ardında G kanalı hemen lojik 1 olması gerekiyor. Ama gerçekte öyle değil. Doğal olrak kod gecikmelerinden dolayı belli bir süre arada gecikmeler yaşanıyor. Uzaktan bakınca anlaşılmıyor ama işin derinlerine girince herşey ortaya çıkıyor. Bu pek problem değil aslı problem şurada.

Tarama işlemlerinde ben şöyle yapıyordum.
Daha önce yaktığımız ledi söndürüyoruz. Sonra PWM kanalına yeni duty değerini yükleyip ardından bir sonraki ledi aktif ediyoruz. İşte problem burada başlıyor. Duty registerine duty değerini hemen yazsak bile çıkışta hemen görünmüyor.
Bu durumu anlatan bir resim daha çektim.


image hosting adult

Bu resimde Yeşil Ve Mavi lede ait duty oranı 0, Sadece Kırmızı led için %33 bir duty değeri çıkışa verdim.

İlk önce Kırmızı ledi Lojik 1 Yapıyorum. Sonra bir miktar süre geçtikten sonra %33 duty değeri çıkışa yansıyor. Ardından kırmızı ledi lojik0 yapıyorum. hemen ardından Duty değerini 0 olarak yazıyorum. Ardından bir sonraki yani yeşil ledi çıkışa yansıtıyorum. Sonra olan biteni izlediğimde gördüğüm resimdeki gibi. Kırmızı led Lojik 0 oluyor. Belli bir süre sonra yeşil led 1 oluyor.  En sonra Yeşil lede ait duty değeri çıkışa yansıyor. Bu işlemlerin sonucu olarakta Tüm renklere ait duty değerini 0 yapmazsam eğer en az iki led kısıkta olsa yanıyor. Çünkü Mavi lede ait duty değerinin bir kısmı kırmızı led'e de kayıyor. Sorun burada hocam.

Aklımda bir iki çözüm yöntemi var.
1. çözüm yöntemi tüm kesme alt programını assembly de yazmak. Bu şekilde komut gecikmelerini azaltmayı düşünüyorum.
2. Çözüm yöntemi ise Araya ölü süreler koymak. Mesela bunu şöyle açıklayabiliyorum. Kırmızı led lojik1 den lojik 0 a inip Ardından yeşil led lojik 1 olana kadar komut gecikmelerinden dolayı 1-2uS gecikme yaşanıyor. Bu arada hem kırmızı led hemde yeşil led lojik 0 da bekliyor ardından yeşil led 1 oluyor. Bu ölü süreler içerisinde PWM sinyalini komple kapatalım. Yeniden açtığımızda ise mutlaka ve mutlaka yeşil lede ait duty oranı pwm çıkışında olsun. Sanırım bunu yapabilmek içinde yine assembly de yazmak gerekiyor.

Bu sorunları çözersek eğer güzel bir yöntem haline gelecek hocam.

Ha bir sorun daha var.
Bendeki ledlerdenmi anlamadım bir türlü. Işık şiddedi biraz azdı. Gerekirse RGB power led ile çıkış sinyallerini güclendirip denemeyi düşünüyorum.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

efor

hocam merhaba,

iş yogunlugundan dolayı projeye pek bakamaz oldum. çizim işlemine devam ediyorum. mosfetleri belirttihginiz molardan kullnacagım fakat bir soruyum akımdakını dedım.  picin dogrudan sürebilecegi mos önerisine p kanal IRF9540 önerdiniz.  bu mosfetten 6 adet kullanılacagı için kart üzerinde biraz yer kaplıyor. yer için sıkıntı degıl ama biraz hoş görunmesı için smd kılıflı mosfet kullanabılırmıyız ? picin dogrudan sürebilecegi ? bildiginiz gibi saat kısmında 5mm 120 adet led var 20ma den  2.4A olacak. picin çıkışı bu akımı surebılecekmıdır  önerecegınız  bu mos yada smd kılıflı olan mosfet ?

ete

Maalesef bu konuda pek bilgim yok. Az kullanıyorum mosfetleri kullanıncada normal kılıf kullanıyorum.

Ete

Mucit23

efor;

Mosfet seçmek için farneli kullanabilirsin. Mosfetler içerisinde filtre bölümünde istediğin özellikleri seçip aratırsan aradığın özelliklere göre mosfetleri sıralar.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Powered by EzPortal