Bu projede PortA.6 ve POrtA.7 de bağlı iki buton yardımı ile PortB nin tamamına PWM uyguluyoruz. Butonlar yardımı ile Duty değeri değiştirilebiliyor. Şimdi birazda siz çalışın ve butonlar olmadan PWM değerini bir aşağı bir yukarı nasıl değiştiririz düşünün bakalım. Aslında işlem çok basit. Biraz mantık kullanmakla bu soruyu aşabilirsiniz. Son olarak PWM çalışma prensibini burada açıklayayım.
PWM sinyalinin Duty dediğimiz iş zamanını Yüzde olarak değerlendiriyorum. Şayet Duty=100 (programda maksimum 99 aldım) ise maksimum iş zamanı Duty=0 (programda 1 aldım) ise minimum iş zamanı anlamına gelmektedir.Butonlar Duty değerini 1-99 arasında değiştirmektedir.
Her 20 us de bir kesme oluşturuyoruz. Uyguladığımız PWM frekansında bir T peryodu (High+Low süresi) yaklaşık 4000 us dir. %50 duty değerinde high yada low süresi ise 2000 ms olacaktır. İşte birinci önemli sayımız budur. Bu süreyi 100 e bölerseniz size yaklaşık oluşturmanız gereken kesme süresini verecektir. 2000/100=20 çıkar ve bende her 20 us de bir kesme oluşturuyorum.
Peki neden her 20 us de bir kesme oluşturuyorum. Şayet 2000 us lik bir süreyi 100 gibi düşünürseniz %1 lik süreniz 20 olurda onun için. Bu şu demek. %1 duty değerinide bu şekilde gösterebilirim demektir. Şimdi gelelim nasıl oluyorda PWM sinyali duty değeri kesme sayısına göre değişiyor ,Onu açıklayayım .
Diyelimki Duty değerimiz 30 ohalde ben 30 adet kesmede port pinlerini HIGH da tutacağım 100-30=70 adet kesmede ise port pinlerini LOW da tutacağım demektir. Bu kadar basit. Bu işi tek pine verirseniz tek pinden çok pine verirseniz çok pinden PWM sinyali alabilirsiniz. Bu projede yalnızca B portukullanıldı. Buna A portunun kullanılmayan pinlerinide ekleyebilirsiniz. Onuda size bırakıyorum.
Bu benim kullandığım mantık. Yukarıda açıklanan projede nasıl mantık kullanılmış henüz bakmadım ama benzer bir mantık olması gerekir başka yoluda yok zaten. Görmeniz açısından birde RGB çıkış veren bir projede ilave ediyorum her birinin Duty değeri 3 ayrı butonla değiştirilebilmektedir.
Kolay Gelsin
ETE
PWM uygulama 1
'**************************************** '* Name : PWM-TMR0.BAS * '* Author : [ETE-EROLEC-ERO] * '* Notice : Copyright (c) 2007 [E.T.E]* '* : All Rights Reserved * '* Date : 3/2/2007 * '* Version : 1.0 * '* Notes : * '* : * '**************************************** define osc 4 PORTA=0:portb=0 TRISB=%00000000 ' TRISA=%11000000 ' '----------------------------------- @ DEVICE pic16F628 'işlemci 16F628 @ DEVICE pic16F628, WDT_OFF 'Watch Dog timer kapalı @ DEVICE pic16F628, PWRT_ON 'Power on timer açık @ DEVICE pic16F628, PROTECT_OFF 'Kod Koruma kapalı @ DEVICE pic16F628, MCLR_off 'MCLR pini kullanılmıyor. @ DEVICE pic16F628, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak '------------------------------------ '----------------------------------- ON INTERRUPT GoTo KESME 'kesme oluşursa KESME adlı etikete git. OPTION_REG=%00001000 'Pull up dirençleri İPTAL- Bölme oranı 1/1 INTCON=%10100000 'Kesmeler aktif ve TMR0 kesmesi aktif CMCON=7 '16F628 de komparatör pinleri iptal hepsi giriş çıkış '----------------------------------- R var byte G var byte B VAR BYTE RH VAR BYTE GH VAR BYTE BH VAR BYTE RL VAR BYTE GL VAR BYTE BL VAR BYTE I VAR BYTE W var bit '------------------------------------ CLEAR 'tüm değişkenler sıfırlandı 'PAUSE 200 TMR0=243 R=50 G=50 B=50 RH=r:RL=100-rH gh=g:gl=100-gH bh=b:bl=100-bH 'PORTA=%00000111 '------------------------------------ BASLA: IF PORTA.7=0 THEN R=R+1:IF R=100 THEN R=99 GOSUB DELAY ENDIF IF PORTA.6=0 THEN R=R-1:IF R=0 THEN R=1 GOSUB DELAY ENDIF GOTO BASLA 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 DISABLE KESME: IF PORTB=255 THEN RH=RH-1 IF RH=0 then PORTB=255-PORTB RH=R endif ELSE RL=RL-1 IF RL=0 THEN PORTB=255-PORTB RL=100-Rh ENDIF ENDIF TMR0=243 INTCON.2=0 'TMR0 Kesme bayrağı sıfırlanıyor RESUME ENABLE END
PWM uygulama 2
'******************************************** '* Name : PWM-TMR0.BAS * '* Author : [ETE-EROLEC-ERO] * '* Notice : Copyright (c) 2007 [E.T.E] * '* : All Rights Reserved * '* Date : 3/2/2007 * '* Version : 1.0 * '* Notes : * '* : * '******************************************** define osc 4 PORTA=0:portb=0 TRISB=%00111111 ' TRISA=%00000000 ' '---------------------------------------------- @ DEVICE pic16F628 'işlemci 16F628 @ DEVICE pic16F628, WDT_OFF 'Watch Dog timer kapalı @ DEVICE pic16F628, PWRT_ON 'Power on timer açık @ DEVICE pic16F628, PROTECT_OFF 'Kod Koruma kapalı @ DEVICE pic16F628, MCLR_off 'MCLR pini kullanılmıyor. @ DEVICE pic16F628, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak '----------------------------------------------- '----------------------------------------------- ON INTERRUPT GoTo KESME 'kesme oluşursa KESME adlı etikete git. OPTION_REG=%00001000 'Pull up dirençleri İPTAL- Bölme oranı 1/1 INTCON=%10100000 'Kesmeler aktif ve TMR0 kesmesi aktif CMCON=7 '16F628 de komparatör pinleri iptal hepsi giriş çıkış '----------------------------------------------- R var byte G var byte B VAR BYTE RH VAR BYTE GH VAR BYTE BH VAR BYTE RL VAR BYTE GL VAR BYTE BL VAR BYTE I VAR BYTE W var bit '--------------------------------------------- CLEAR 'tüm değişkenler sıfırlandı 'PAUSE 200 TMR0=243 R=50 G=50 B=50 RH=r:RL=100-rH gh=g:gl=100-gH bh=b:bl=100-bH PORTA=%00000111 '---------------------------------------------- BASLA: IF PORTB.0=0 THEN R=R+1:IF R=100 THEN R=99 GOSUB DELAY ENDIF IF PORTB.1=0 THEN R=R-1:IF R=0 THEN R=1 GOSUB DELAY ENDIF '--------------------------------------R + ve - sonu IF PORTB.2=0 THEN G=G+1:IF G=100 THEN G=99 GOSUB DELAY ENDIF IF PORTB.3=0 THEN G=G-1:IF G=0 THEN G=1 GOSUB DELAY ENDIF '--------------------------------------G + ve - sonu IF PORTB.4=0 THEN B=B+1:IF B=100 THEN B=99 GOSUB DELAY ENDIF IF PORTB.5=0 THEN B=B-1:IF B=0 THEN B=1 GOSUB DELAY ENDIF '--------------------------------------B + ve - sonu GOTO BASLA 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 DISABLE KESME: IF PORTA.0=1 THEN RH=RH-1 IF RH=0 then PORTA.0=1-PORTA.0 RH=R endif ELSE RL=RL-1 IF RL=0 THEN PORTA.0=1-PORTA.0 RL=100-Rh ENDIF ENDIF IF PORTA.1=1 THEN GH=GH-1 IF GH=0 then PORTA.1=1-PORTA.1 GH=G ENDIF ELSE GL=GL-1 IF GL=0 THEN PORTA.1=1-PORTA.1 GL=100-Gh ENDIF ENDIF IF PORTA.2=1 THEN BH=BH-1 IF BH=0 then PORTA.2=1-PORTA.2 BH=B ENDIF ELSE BL=BL-1 IF BL=0 THEN PORTA.2=1-PORTA.2 BL=100-Bh ENDIF ENDIF TMR0=243 INTCON.2=0 'TMR0 Kesme bayrağı sıfırlanıyor RESUME ENABLE END
Uygulamalara ait PICBasic pro kaynak yazılım ve proteus simülasyon dosyaları;
Şifre-Pass: 320volt.com
Yayım tarihi: 2010/08/01 Etiketler: microchip pic projeleri, pic basic pwm, picbasic pro pwm, pwm bilgisi, pwm örnek
hocam pic basic pro hala kullanışlı mı? yoksa önerdiğiniz başka proglar var mı?