Elektronik / Mikrodenetleyici Projeleri/

Picbasic pro ile PWM ve örnek uygulamalar

Sponsorlu Bağlantılar

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

Uygulamalara ait PICBasic pro kaynak yazılım dosyaları ve proteus isis simülesyon dosyaları: Picbasic pro ile PWM ve örnek uygulamalar

Dosya indirme LINK listesi (TXT formatında) link-10901.zip şifre-pass: 320volt.com

PWM uygulama 1

picbasic-pro-pwm-pic16f628


'****************************************
'*  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

picbasic-pro-rgb-3-pwm-pic16f628


'********************************************
'*  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