Basic pwm sorunu

Başlatan yildizelektronik, 01 Ocak 2012, 19:32:58

yildizelektronik

Merhabalar,
Pic Basicte 12F675 ile bir pwm uygulaması yapıyorum, ancak bir yerde takıldım size sormak istiyorum.
Kullandığım kod aşağıda tek kanaldan pwm sinyalini 5. bacaktan alabiliyorum, yani bir mosfete power led bağladığım zaman yavaş yavaş yanıp söndüğünü görebiliyorum.
Program şu şekilde ;
TRISIO =%00000000                    
    ANSEL = 0                          
WPU = %00000000                         
    OPTION_REG=%00000000                
CMCON=7                                
    GPIO=0                              
B0 VAR BYTE   
'
BASLA:          
    FOR B0 = 0 TO 255 STEP 1            
    PWM 5,B0,1  
NEXT
    FOR B0 = 255  TO 0 STEP-1       
    PWM 5,B0,1 
NEXT
GOTO BASLA
END         


Yaşadığım sorun ise, birden fazla pwm çıkışı almak istediğimde program çalışmıyor. Yani 5,4,2 veya daha fazla porttan pwm çıkışı almak istediğim zaman çıkışa normal led bağladığım zaman ledler yavaş yavaş yanıp sönüyor ancak çıkışa bir mosfet bağlayıp bu mosfetlere de power led bağladığım zaman power ledler sürekli yanıyor yani yavaş yavaş yanıp sönmüyor.
Birden fazla pwm çıkışı almak için yazdığım program aşağıda. Galiba ufak bir yerde hata yapıyorum, yardımcı olursanız sevinirim.
Program şu şekilde;
TRISIO =%00000000                    
    ANSEL = 0                          
WPU = %00000000                         
    OPTION_REG=%00000000                
CMCON=7                                
    GPIO=0                              
B0 VAR BYTE   
'
BASLA:          
    FOR B0 = 0 TO 255 STEP 1            
    PWM 5,B0,1  
    PWM 4,B0,1
    PWM 2,B0,1
NEXT
    FOR B0 = 255  TO 0 STEP-1       
    PWM 5,B0,1 
    PWM 4,B0,1
    PWM 2,B0,1
NEXT
GOTO BASLA
END 

yildizelektronik


aslan_korhan

Bu şekilde tek Kanalı ayni anda PWM yapabilirsin.

Kırmızı Kanalı 0'dan 255'e PWM yap.
Kırmızı'yı High yap.
Yeşil'i 0'dan 255'e PWM yap.
Yeşil'i High yap.
Kırmızı'yı 255'den 0'a PWM yap.
Kırmızı'yı Low yap......
Ancak bu şekilde çalışır...
Dünyada 10 çeşit insan vardır. Binary bilen ve bilmeyenler.

Mucit23

#3
Hocam PWM komutu birden fazla çıkışkullanılacaksa devrenin çalışmasını engeller. Sadece tek çıkış için kullanılabilir. Birden fazla pwm çıkışı için mutlaka kesme kullanmanız gerekiyor. Daha önce ben RGB ledlerle bir gece lambası benzeri birşey yapmıştım. 12F675 ile 3 adet pwm çıkışı alarak RGB ledde renk kontrolü yaptım. Bayağıda iyi olmuştu. Ete hocada buna benzer bir uygulama yapmıştı(Ben biraz ondan esinlendim :)) Kodlar iyileştirilebilir elbet. Ne zaman yaptığımı hatırlamıyorum :D Ama çalışıyor.
@ DEVICE pic12F675                      'işlemci 12F675                               
@ DEVICE pic12F675, WDT_ON              'Watch Dog timer açık
@ DEVICE pic12F675, PWRT_ON             'Power on timer açık
@ DEVICE pic12F675, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic12F675, MCLR_off            'MCLR pini kullanılMIYOR.
@ DEVICE pic12F675, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak 

DEFINE OSCCAL_1K 1
DEFINE OSC 4
CMCON = 7
ANSEL=0
OPTION_REG=%10001000 'Pull up dirençleri İPTAL- Bölme oranı 1/1
INTCON=%10100000 'Kesmeler aktif ve TMR0 kesmesi aktif
TRISIO=%00000100
ON INTERRUPT GOTO KESME
GPIO=0
SYMBOL RED=GPIO.0
SYMBOL GREEN=GPIO.1
SYMBOL BLUE=GPIO.4
SYMBOL TUS=GPIO.2
X     VAR WORD
Z     VAR BIT
W     VAR BYTE
I     VAR BYTE
R     VAR BYTE
G     VAR BYTE
B     VAR BYTE
HR    VAR BYTE   
LR    VAR BYTE
HG    VAR BYTE
LG    VAR BYTE
HB    VAR BYTE
LB    VAR BYTE
BASLAGIC:
r=1:g=1:b=1
hr=r:hg=g:hb=b
lr=100-hr
lg=100-hg
lb=100-hb
Z=0

BASLA:
GOSUB GOKKUSAGI
GOSUB BEYAZ
GOSUB RASTGELE
GOTO BASLA

'------------GOKKUŞAĞI-----------------------
GOKKUSAGI:
Z=1
FOR R=1 TO 99   'KIRMIZI ARTTIR
GOSUB DELAY
NEXT
Z=0:R=99 
GOSUB BEKLE  'BEKLE
Z=1
FOR G=1 TO 99 'YESIL ARTTIR
GOSUB DELAY
NEXT
Z=0:G=99
GOSUB BEKLE 'BEKLE
Z=1
FOR R=99 TO 1 STEP-1  'KIRMIZI AZALT
GOSUB DELAY
NEXT
Z=0:R=1
GOSUB BEKLE 'BEKLE
Z=1
FOR B=1 TO 99   'MAVİ ARTTIR.
GOSUB DELAY
NEXT
Z=0:B=99
GOSUB BEKLE 'BEKLE
Z=1
FOR G=99 TO 1 STEP-1   'YESIL AZALT
GOSUB DELAY
NEXT
Z=0:G=1
GOSUB BEKLE  'BEKLE
Z=1
FOR B=99 TO 1 STEP-1   'MAVİ AZALT
GOSUB DELAY  
NEXT
Z=0:B=1:R=1:G=1
GOSUB BEKLE
RETURN

BEYAZ:
FOR W=0 TO 1
  Z=1
  FOR R=1 TO 99   'KIRMIZI ARTTIR
    GOSUB DELAY
  NEXT
  R=99
  FOR G=1 TO 99   'YESIL ARTTIR
    GOSUB DELAY
  NEXT
  G=99 
  FOR B=1 TO 99   'MAVI ARTTIR
    GOSUB DELAY
  NEXT
  Z=0:B=99
  GOSUB BEKLE
  Z=1
  FOR R=99 TO 1 STEP-1  'KIRMIZI AZALT
    GOSUB DELAY
  NEXT
  Z=0:R=1
  GOSUB BEKLE1
  Z=1
  FOR B=99 TO 1 STEP-1  'KIRMIZI AZALT
    GOSUB DELAY
  NEXT
  Z=0:B=1
  GOSUB BEKLE1
  Z=1
  FOR G=99 TO 1 STEP-1  'KIRMIZI AZALT
    GOSUB DELAY
  NEXT
  Z=0:G=1
  GOSUB BEKLE
NEXT W
RETURN

RASTGELE:Z=1
R=99:Z=0:GOSUB BEKLE1:Z=1
DEVAM:
FOR W=1 TO 2
G=99:Z=0:GOSUB BEKLE1:Z=1
R=1:Z=0:GOSUB BEKLE1:Z=1
B=99:Z=0:GOSUB BEKLE1:Z=1
G=1:Z=0:GOSUB BEKLE1:Z=1
R=99:Z=0:GOSUB BEKLE1:Z=1
B=1:Z=0:GOSUB BEKLE1:Z=1
NEXT W
RETURN

BEKLE:     'GECIKME
IF X<20000 THEN BEKLE
RETURN
BEKLE1:
IF X<10000 THEN BEKLE1
RETURN

DELAY:
      FOR I=0 TO 255:NEXT 
      FOR I=0 TO 255:NEXT 
      FOR I=0 TO 255:NEXT 
      FOR I=0 TO 255:NEXT 
      FOR I=0 TO 255:NEXT
RETURN
DELAY1:
      FOR I=0 TO 255:NEXT 
      FOR I=0 TO 255:NEXT
RETURN


DISABLE
KESME:

IF red=1 THEN
hR=hR-1
  IF hR=0 then 
    RED=1-RED:hR=R
  endif
ELSE
lR=lR-1
  IF lR=0 THEN
    red=1-red:lr=100-hr
  ENDIF
ENDIF
       
IF green=1 THEN
hg=hg-1    
  IF hg=0 then 
    green=1-GREEN:HG=G
  ENDIF
ELSE
lg=lg-1
  IF lg=0 THEN
    green=1-green:lg=100-hg
  ENDIF         
ENDIF
        
IF blue=1 THEN
hb=hb-1
  IF hb=0 then
    blue=1-blue:hb=B
  ENDIF
ELSE
lb=lb-1
  IF lb=0 THEN
    blue=1-blue:lb=100-hb
  ENDIF         
ENDIF  
X=X+1 
IF Z=1 THEN X=0

TMR0=254
INTCON.2=0    
RESUME 
ENABLE
END

yildizelektronik

Alıntı yapılan: aslan_korhan - 01 Ocak 2012, 23:17:54
Bu şekilde tek Kanalı ayni anda PWM yapabilirsin.

Kırmızı Kanalı 0'dan 255'e PWM yap.
Kırmızı'yı High yap.
Yeşil'i 0'dan 255'e PWM yap.
Yeşil'i High yap.
Kırmızı'yı 255'den 0'a PWM yap.
Kırmızı'yı Low yap......
Ancak bu şekilde çalışır...

Peki hocam o zaman atıyorum 5 kanaldan aynı anda pwm çıkışı yapamazmıyız. İllaki tek tek mi yapmamız gerekiyor yada hepsini yapmamız için kesme mi kullanmamız gerekli ?

@mucit23 hocam verdiğin örnek iyi oldu bir deneme yapayim.

Mucit23

Aslında aslan_korhanın da dediği gibi olabilir fakat eğer öyle yapıcaksan sana tavsiyem Dahili pwm modülü bir pic kullanman olacaktır. Çümkü devre multiplex olarak çalışacağı için aynı anda hem pwmi üretmek hemde çıkışları taramak bayağı işleri çok zorlaştırır. Ben olsaydım 12F683 alıp dahili pwm modülünü ayarlayıp pwm sinyalimi alırdım. Kesmeylede ledleri tarardım. Daha prüzsüz renk geçişleri olacağına eminim

yildizelektronik

Alıntı yapılan: Mucit23 - 01 Ocak 2012, 23:40:46
Aslında aslan_korhanın da dediği gibi olabilir fakat eğer öyle yapıcaksan sana tavsiyem Dahili pwm modülü bir pic kullanman olacaktır. Çümkü devre multiplex olarak çalışacağı için aynı anda hem pwmi üretmek hemde çıkışları taramak bayağı işleri çok zorlaştırır. Ben olsaydım 12F683 alıp dahili pwm modülünü ayarlayıp pwm sinyalimi alırdım. Kesmeylede ledleri tarardım. Daha prüzsüz renk geçişleri olacağına eminim

Aslında yapmak istediğim 5 çıkıştan pwm almak yani 5adet mosfet var diyelim bu moslara power led bağlı aynı anda hepsinin yavaş yavaş yanıp sönmesini istiyorum. Bunu yapmak için bu pic yeterli değilmidir ?

Mucit23

yazılımsal olarak yukarıda verdiğim örnekten ilham alarak 5  adet pwm alabilirsiniz fakat pwm sinyalleri kusursuz çıkmıyor. Osiloskopla incelediğimdedahada belli oluyor. Sanırım kod geciklemelerinde dolayı aksamalar oluşuyor. Bence bir tane 16F628 ile sanki display tararmış gibi pwm çıkışlarını tarayın. 16F628 de 1 adet pwm çıkışı var zaten

yildizelektronik

Yardımların için çok teşekkür ederim. Bir deneme yapayim sonucu bildiririm.

Veli B.

Timer kullanarak kesme oluşturur ve bu kesmeyi OKEK mantığı için taban referans olarak kullanırsanız, 5 kanaldan farklı Duty değerlerine sahip PWM  elde edebilirsiniz. Tavsiyem, kesme rutinini assembly ile yazmanız yönünde olur.

My75

#10
Pwm komutu ile çok kanal yapmak zor oluyor,kendim geliştirdiğim bir yöntem var(yani bir yerde görmedim düşünerek buldum),bu yöntem ile Atmega32 ile 27 kanal pwm led animasyon kartı yapmıştım,bu kadar kanal ve hız için Atmega kullandım,5 kanal için 12F675 ve dahili osc yeterli olur..Yöntem şu..

Kanal1  var byte
Kanal2  var byte
......

Basla:
gpio=1       'tüm çıkışlar aktif

for say=0 to 255   '8 bit çözünürlük,hızdan dolayı titreme olursa bu değer düşürülebilir..

if kanal1=say then gpio.0=0
if kanal2=say then gpio.1=0
if kanal3=say then gpio.2=0
if kanal4=say then gpio.4=0
if kanal5=say then gpio.5=0

next
kanal1=kanal1+1  ' Değişken değerlerini bu bölümde değiştiriyoruz

goto basla

Bu yöntem ile çok düşük 0,1,2,3 gibi değerlerde hızdan dolayı ledlerde hafif bir parlama olabilir,bunuda transistör girişine 100n gibi bir kondansatör ilavesi yaparak yok ediyoruz..


Buda 27 kanal pcb,kondansatör ilavesiz,sonradan gate gnd arasına ilave ettim..

Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

Lütfi AYYILDIZ

#11
@my75  kodlarınız kesme içinde kullanılsa çok güzel olur,kullandığımız mantık aynı ama sizin kodlar daha sade.
DISABLE 
INT:
FOR i=0 TO 255
IF i<=R THEN HIGH RLED
IF i> R THEN LOW RLED

IF i<=G THEN HIGH GLED
IF i> G THEN LOW GLED

IF i<=B THEN HIGH BLED
IF i> B THEN LOW BLED
NEXT
INTCON.2=0           
RESUME 
ENABLE

My75

#12
Evet olabilir,ben tüm kanalları aynı anda aktif yapıyorum ve pwm değerine göre low yapıyorum .10 adet animasyon yazmıştım sırayla geçiyorlardı kesmelik bir durum yoktu..Gayet başarılı bir pwm oluşuyor,şuan bu yaptığım animasyon kartı vitrinimi süslüyor üşenmesem videosunu eklerdim..
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

yildizelektronik

Yardımlarınız için teşekkür ederim.

Yayınlamış olduğunuz kodları referans alarak denemelerimi yapıcam. Gerekirse kesme de kullabilirim. Şu an için sadece yavaş yavaş yanıp sönse yeter  :)

justice_for_all

[IMG]http://img824.imageshack.us/img824/1303/54779862.jpg[/img]

Uploaded with ImageShack.us

yukarida tek pwm icin algoritma isterseniz algoritmaya gore daha fazla pwm yapabilirsiniz..
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay