Merhaba, bu yazımızda da PIC16F628'in CCP(Yakala-karşılaştır-üret) modülünü kullanarak PWM çıkış alacağız. Bu çıkışı bir lede bağlayıp çıkıştaki değişiklikleri izleyeceğiz. PWM'in ne olduğu hakkında bir bilginiz yok , yahut az ise şöyle kısa bir açıklama yapmakta fayda var: PWM ingilizce kökenli "Pulse-width modulation" kelime grubunun kısaltılması olup , çıkışta üretilecek sinyalin ya da analog değerin darbe genişliğini kontrol etme yöntemidir.
Şöyle bir örnek verirsek. Bir kare dalga düşünebilirsiniz. Kare dalga peryodun yarısında +5V yarısında 0 Volt ise siz böyle bir kare dalgayı multimetre yardımıyla ölçtüğünüzde , ekranda 2.5V değerini görürsünüz. Buna elektronikde Doluluk Oranı demekteyiz. Yani doluluk oranı ne kadar fazla ise +5V'a o kadar yakın bir değer, doluluk oranı ne kadar az ise 0V'a o kadar yakın bir değer alırız.

Örnek vermek gerekirse yukardaki dalga şekillerine baktığımızda. Kare dalganın doluluk oranı farklılıklarını görebiliyoruz. Üstteki grafik doluluk oranı az, ortadaki grafik doluluk oranı ondan biraz daha fazla, alttaki grafik de doluluk oranı diğerlerinden biraz daha fazla bir dalga şeklidir.
Şimdi bu dalga şeklini PIC16F628 ile oluşturmaya bakacağız.
Öncelikle Board üzerine devremizi kuruyoruz.
Devre elemanları çok da bulunan cinsten ve bir o kadar da az elemanlar: 1 adet PIC16F628,1adet 220ohm direnç, 1 adet 100nF kondansatör(zorunlu değil), 2 adet buton, 1 adet LED, 2 adet 10K direnç, 2 adet 1K direnç ve tabiki gerilim kaynağı(+5V).
Devreyi aşağıdaki gibi kurduktan sonra
NOT defterine aşağıdaki kodları yapıştırıyoruz ve MPASM programı ile derliyoruz. Sonra IC-PROG adlı PIC programlayıcımız yardımıyla( siz başka bir program da kullanıyor olabilirsiniz) programı, PIC içerisine atıyoruz ve deniyoruz. İlk Programda butonlar aktif edilmedi gördüğünüz gibi. PWM 0 ile 255 arasında zamanlama yardımıyla değiştiriliyor. İkinci programda ilse PWM'i biz ARTIR ve AZALT butonlarımız yardımıyla ayarlıyoruz.
Kodlarımız da şu şekilde
ilk program:
===============================================================;
;====PWM Örneği===24.02.2008======
;==================================
LIST P=16F628A
INCLUDE "P16F628A.INC"
__CONFIG _INTRC_OSC_NOCLKOUT &_WDT_OFF &_PWRTE_ON &_MCLRE_ON &_BODEN_OFF &_LVP_OFF &_DATA_CP_OFF &_CP_OFF
;==================================
SAYAC1 EQU h'20'
SAYAC2 EQU h'21'
DEGER EQU h'22'
ORG h'00'
CLRF PORTB
BANKSEL PR2 ;BANK1'e e geç
MOVLW h'FF' ;PWM PERFODU
MOVWF PR2 ;belirlemek için PR2=255
CLRF TRISB ;
BANKSEL PORTB ;
MOVLW h'0C' ;PWM modu seç
MOVWF CCP1CON ;
MOVLW h'01' ;
MOVWF CCPR1L ;
BSF T2CON,2 ;TMR2 yi çalıştırmaya başla
ARTIR
INCF CCPR1L,F
CALL GECIKME
MOVWF h'FE'
SUBWF CCPR1L,W
BTFSC STATUS,C
GOTO AZALT
GOTO ARTIR
AZALT
DECF CCPR1L,F
CALL GECIKME
MOVLW h'01'
SUBWF CCPR1L,W
BTFSS STATUS,C
GOTO ARTIR
GOTO AZALT
;gecikme alt programı
GECIKME
MOVLW h'30'
MOVWF SAYAC1
DONGU1
MOVLW h'60'
MOVWF SAYAC2
DONGU2
DECFSZ SAYAC2,F
GOTO DONGU2
DECFSZ SAYAC1,F
GOTO DONGU1
RETURN
END
===========================================================
Bu da ikinci programımız:
===========================================================
;====PWM Örneği===24.02.2008======
;==================================
LIST P=16F628A
INCLUDE "P16F628A.INC"
__CONFIG _INTRC_OSC_NOCLKOUT &_WDT_OFF &_PWRTE_ON &_MCLRE_ON &_BODEN_OFF &_LVP_OFF &_DATA_CP_OFF &_CP_OFF
;==================================
SAYAC1 EQU h'20'
SAYAC2 EQU h'21'
DEGER EQU h'22'
ORG h'00'
CLRF PORTB
BANKSEL PR2 ;BANK1'e e geç
MOVLW h'FF' ;PWM PERFODU
MOVWF PR2 ;belirlemek için PR2=255
CLRF TRISB ;PORTB çıkış
MOVLW h'03' ;RA0-RA1 Giriş
MOVWF TRISA ;PORTA ilk iki pini giriş-diğerleri çıkış
BANKSEL PORTB ;BANK0'A GEÇ
MOVLW h'07'
MOVWF CMCON ;bütün girişler Digital I/O
;======PWM MODU AYARLARI================
MOVLW h'0C' ;PWM modu seç(CCPR1L0~CCP1M0=b'00') ve doluluk oranı
MOVWF CCP1CON ;en düşük bitleri b'00000001'
MOVLW h'00' ;PWM=0 olarak programa başla
MOVWF CCPR1L
BSF T2CON,2 ;TMR2 yi çalıştırmaya başla
;======PWM MODU AYAR SONU===============
BUTONKONTROL1 ;artır butonu
BTFSS PORTA,0 ;RA0'a bak set mi?
GOTO BUTONKONTROL2 ;hayır 2. butonu kontrol et
CALL GECIKME
GOTO ARTIR ;evet set. Artırmaya git
BUTONKONTROL2 ;azalt butonu
BTFSS PORTA,1 ;RA1'a bak set mi?
GOTO BUTONKONTROL1 ;hayır 1. butonu kontrol et
CALL GECIKME
GOTO AZALT ;evet set. Azaltmaya git
ARTIR
MOVWF h'FE'
SUBWF CCPR1L,W
BTFSC STATUS,C
GOTO BUTONKONTROL1 ;maksimum PWM'e ulaşılmış. Butonu sorgulamaya devam et
INCF CCPR1L,F ;artır
CALL GECIKME ;gecikme kadar PWM gönder
GOTO BUTONKONTROL1 ;Yine Butonu kontrol et
AZALT
MOVLW h'01'
SUBWF CCPR1L,W
BTFSS STATUS,C ;pwm=0 mı diye kontrol et
GOTO BUTONKONTROL2 ;evet sıfırlanmış bUTONU kontrol etmeye git
DECF CCPR1L,F ;hayır sen azaltmaya devam et bacım :)
CALL GECIKME ;gecikme kadar PWM gönder
GOTO BUTONKONTROL2 ;Hala butona basılımı diye direk 2. Butonu kontrol et
;gecikme alt programı===============
;===================================
GECIKME
MOVLW h'30'
MOVWF SAYAC1
DONGU1
MOVLW h'60'
MOVWF SAYAC2
DONGU2
DECFSZ SAYAC2,F
GOTO DONGU2
DECFSZ SAYAC1,F
GOTO DONGU1
RETURN
END
============================================
Kodlar karşıbilir düşüncesiyle PDF yapıp [şuraya] atıyorum. Kodları açıklama gereği duymadım çünkü açıklamalar zaten kodların yanlarında
Aklınıza gelen her soruyu sorabilirsiniz. Bu arada ışığın sönmem efekti bi yerden tanıdık geliyor değil mi? Nokia telefonlar...
İşte Video:
© HRMNKY (http://www.harmankaya.org)