PWM oluşturmada bir soru

Başlatan kostebek, 24 Şubat 2008, 16:16:10

kostebek

Merhaba arkadaşlar. Yeni yeni başlıyordum PIC'e PWM bacağını kullanarak çıkış almak istedim de merak ettiğim bir soru olacak.

PWMde maksimum doluluk oranında RB3 den 5V almam gerekmiyor mu?

Programı aşağıya koyuyorum. Ben Maksimuma getirdiğimde 2V civarı bir değer okuyorum voltmetrede. Problem nerede sizce.

Teşekkürler.

;====PWM alıştırmam :D===23.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

bigbey

ARTIR rutininde MOVWF yerine MOVLW olmalı.
bu nedenle artırma işlemi yapılamıyor.
TA6R

kostebek

Alıntı yapılan: "bigbey"ARTIR rutininde MOVWF yerine MOVLW olmalı.
bu nedenle artırma işlemi yapılamıyor.

Enteresan hiç dikkatimi çekmemişti ama işin garibi artırma işlemi yapıyor :)

http://www.youtube.com/watch?v=1w-fcGneRIQ

Çünkü ben PWM=h'FF' olmuşmu diye kontrol ediyorum eğer olmuş ise artık artırma yapmayı kabul etmiyorum o yerde. Yani sadece kontrol kısmı bozukmuş.

Ama hiç yoksa doluluk oranı max. olup 5V' görmem gerekmezmiydi ?

bigbey

Programı denedim PWM değeri %40 olabiliyor. daha fazla artmıyor.
5v %40 = 2 volt eder.
o anda W register içeriğini direk alıyor.
TA6R

bigbey

Bu dosyayı bir dene durumu anlayacaksın.
http://rapidshare.com/files/94555754/pwm.rar
yazılımda hatalı satırı yazıp denersin.
TA6R

kostebek

Alıntı yapılan: "bigbey"Programı denedim PWM değeri %40 olabiliyor. daha fazla artmıyor.
5v %40 = 2 volt eder.
o anda W register içeriğini direk alıyor.

Enteresan ya niye 5V olmuyor anlamıyorum :(

Alıntı Yap
Bu dosyayı bir dene durumu anlayacaksın.
http://rapidshare.com/files/94555754/pwm.rar
yazılımda hatalı satırı yazıp denersin.

PARDON bunu yeni gördüm bakıyorum hemen 5V luk bi gerilim kaynağım yok işte evde işin kötüsü :(

Neyse nokia şarj aleti + 7805 kullanayım :D

kostebek

Evet ya hatadan kaynaklanıyormuş.

Teşekkür ederim ilgin için.

Küçük bir aksaklık nelere mal oluyor :)

ninsu07

Arkadaşlar YARDIIIIIM, Lütfen!!!!!!!!!!
Daha önce "köstebek" arkadaşımız PWM Doluluk Oranını maximum yapma konusuna değinmiş, ama sorununu çözebilmişmi anlayamadım. Hem Linklerde kırık, takip edemedim.

Acaba PWM doluluk oranını olması gereken max seviyeye getirebilen .asm kodlubir program parçası varmı?

Bildiğim kadarıyla, CCPR1H Register'a birşey yazamıyoruz ! Bu durumda CCP1CON' ın 4. ve 5. bitlerine direkmi değer atayacağız?  CCPR1L Register PWM max'un  sadece 255 adımlık doluluk oranını ( %20 sini) yapabiliyor. 1023'ncü doluluk oranına kadar nasıl çıkabilirim ?????

Logan

ninsu07, öncelikle aramıza hoş geldin. Keşke ilk mesajında probleminden bahsetmeden evvel "Merhaba arkadaşlar" tarzı bir giriş yapsaydın. Neyse, kullandığın işlemciyi belirtmemişsin fakat 10 bit PWM'den bahsettiğin için örnek olarak 18f452'yi ele alıyorum. Datasheet'i inceleyecek olursan PWM başlığı altında şu satırlara rastlayacaksın.

Alıntı Yap
These bits are the two LSbs (bit1 and bit0) of the 10-bit PWM duty cycle.

Burada CCP1CON registerinin 4. ve 5. bitleri olan DCxB0 ve DCxB1 bitlerinden bahsediyor ve diyorki bu bitler, 10 bitlik PWM sinyalinin en küçük 2 bitini oluşturur. Senin yapman gereken oluşturmak istediğin sinyalin ilk iki bitine DCxB1 ve DCxB0'ı, diğer 8 bitine ise CCPR1L registerinin değerini atamaktır. Umarı açıklayıcı olmuştur, iyi günler iyi çalışmalar.
İmza.

ninsu07

Logan Arkadaşım, öncelikle cevaben ayırdığınız zaman için çok teşekkür ederim. Form'a kendimi tanıtmadan direk daldığım için sizlerden özr. Benimki tamamen acemilik, sizleri saymamak değil.

Üzerinde çalıştığım controler PIC16F628A (ilk-başlangıç için). Sizin verdiğiniz " 16F452 için CCP1CON Reg'in 5. ve 4. bitlerini yazdırmak"  paralelindeki bilgileri ben 628A için okumuştum. Ama uygulaması ile ilgili hiçbir bilgi bulamadım; sorunum bu :(  Bunu bir program yazarken nasıl yaparım? )

Benim istediğim bir PWM periodunu 10-bit çözünürlükte (1024-step) kullanabilmek.

Şöyle desem belki daha açıklayıcı olacak:

*********************
.....
....
.....
INCF   VARIABLE,F   ;   4 Cycles
MOVF  VARIABLE,W
CALL   TABLE
MOVWF CCP1CON ; b'00011100' ; sonraki çevrimlerde b'00101100' ,
....                                               b'00101100' ve b'00111100'
....
...
**************  ;

Yani program içerisinde CCP1CON special register' bu şekilde kullansam iş yaparmı?
[araştırdığım tüm program örneklerinde, başlarken CCP1CON'u PWM için birkez setleniyor ve ondan sonra ona hiiiç dokunulmuyor, yasakmı acaba!!!] : 8O

Evet!

Peşinen yardımlarınız için çook teşekkürler :oops:

Tagli

Bu şekilde tablo kullanabilirsin. Ama sadece büyük 8 biti ayarlamış olursun. Yani kaba bir ayar olur, ama belki de ihtiyacını karşılar, bunu ancak sen bilebilirsin.

Küçük bitleri de ayarlamak için biraz daha uzun ve karmaşık bir kod yazman gerekecek. Zaten 10 bitlik bir ayarı yapmak için bir yerlerde 10 bitlik bir değişkenin olmalı. Bunu arttırıp azaltmak carry bit ile uğraşmayı gerektirecek. Ayrıca bir tablo da yeterli olmaycak, ikinci bir tablo gerekecektir. Bu tablodan alacağın 2 bitlik değer ile CCP1CON'un diğer bitlerine dokunmadan sadece 4. ve 5. bitlerini değiştirmek de fazladan bir kaç satır ve fazladan bir kaç dakika düşünme gerektirecektir.

Bu sitede PWM ile ilgili bir örnek var. Ama ayarları bir kez için yapmış. Yani değişimle ilgili bir örnek değil.

Bu arada, bu şekilde değiştireceğin şey PWM'nin periyodu değil iş zamanıdır (duty cycle). Periyod için PR2 register'ı ve TMR2 prescale değeri ile oynamalsın.

Datasheet'te geçen bir ayrıntı da PWM iş zamanının değiştirilmesinden sonra, bunun ilk TMR2 - PR2 eşleşmesinden sonra geçerli hale geleceğidir. Çok da önemli değil sanırım.
Gökçe Tağlıoğlu

ninsu07

Selam Arkadaşlar

Ben hala aynı noktadayım ve bir gelişme yok!!!! :cry:
ilk 8 bitlik doluluk oranı bir döngü ile yapılıyor ( aşağıdaki gibi ).
********
DONGU
   INCF   CCPR1L,F   
   MOVLW   H'FE'      
   SUBWF   CCPR1L,W      
   BTFSS   STATUS,2
   GOTO   DONGU
*******

Ama geriye kalan 2 bit nasıl dolacak?

Int Oscillator 4 MHz kullanıyorum, (2 üzeri 10) 1024 = Fosc/(Fpwm*4)
ve Fpwm=977 Hz değeri benim için iyi. PWM=256*4*0.25E-6*4=1024 microS
PWMdc=(CCPR1L+CCP1X+CCP1Y)*Tosc*4=1023* 0.25E-6 *4=1023 microS
PWMdc max oranı  PWM periodunu aşmıyor, buda iyi... ve her artış 1mikroSaniye olacak... ; (TMR2 prescale value 1:4 seçtim). Hesaba göre beklentilerim karşılanıyor.

Ama şu 10 bit çözünürlüğe çıkmak için geriye kalan değersiz 2 bit nasıl adım-adım arttırılacak? Bir önceki mesajımda bir yöntem denedim ama... bilemiyorum...

Arkadaşlar affınıza sığınıyorum :oops:

ninsu07

Arkadaşlar Selamlar,

Konuyu bilen-yardımsever bir arkadaş!

:roll:

Tagli

Dediğim gibi, öncelikle bir yerlerde 10 bitlik bir değişkenin olması gerekiyor, yani 2 byte. Düşük byte'ı deger0, büyük byte'ı deger1 olsun. Bunları nasıl arttırıp azaltacağını bildiğini varsayıyorum. Yine de özetlemek gerekirse, düşük byte üzerinde işlem yapıp carry biti kontrol etmeli ve buna göre gerekiyorsa büyük byte üzerinde de işlem yapmalısın.

Arttırma veya azaltmanın yapıldığını varsalım. Elinde 2 registar'a yerleştirilmiş 10 bitlik bir değer var. Öncelikle CCP1CON'a yerleşecek küçük 2 biti belirlemelisin. Bunun için öncelikle bir yedeğini başka bir registar'a almak gerekiyor, orijinalinin bozulmaması için. Daha sonra 4 kez sola kaydırarak CCP1CON'daki gerekli değerlerin üzerine oturacak şekle sok. b'00110000' ile bu değeri AND'leyerek gereksiz bitlerin sıfırlanmasını sağla. Daha sonra CCP1CON'daki bu iki bitin 0 olduğundan emin ol (bunu CCP1CON'u b'11001111' ile AND'leyerek yapabilirsin). Daha sonra bu geçici register ile CCP1CON'u topladığında küçük 2 biti ayarlamış olursun.

Sırada CCPR1L'e yerleşecek büyük 8 biti elde edilmesi var. Yine öncelikle deger1 ve deger0'ı yedek1 ve yedek0 gibi geçici registar'lara kopyala. Daha sonra bu 2 byte'lık değeri iki kez sağa kaydırman gerekiyor. Bunu da önce yedek1, sonra yedek0'ı sağa kaydırarak yapmalısın. Böylece yedek1'den sağa kayınca C'ye yerleşen en sağdaki bit yedek0'ın sağa kaydırılmasıyla yedek0'ın 7. bitine oturabilir. Yani sırayla yedek1, yedek0, yedek1, yedek0'ı sağa kaydırmalısın. Daha sonra yedek0'da kalan değeri CCPR1L'e yüklemek işlemi tamamlayacaktır.
Gökçe Tağlıoğlu