0

Capture Modu Kullanımı

Başlatan 0nur, 02 Aralık 2013, 17:21:17

0nur

Öncelikle şunu sormak istiyorum, konum kontrolü için kesme kullanarak gelen değeri eğer şu kadar pals gediyse dur şeklinde gerçekleştirmeyi denedim fakat yeteri hızda olmadığından sanırım konumda kaymalar meydana geliyor. 1920 pals gelince dur diyorum 1923 1918 gibi değerlerde duruyor. Bunu hassas şekilde kontrol edebilmek için Capture modunu kullansak daha mantıklı bir çözüm olur mu ?

F®T

capture tabiki daha sağlıklı.ben 18f46k22 serisinde yaklaşık 4 khz sinyali sorunsuz yakalıyorum.neticede capture özelliği donanımsal çalışıyor.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

0nur

Bu konuyla ilgili örnek bir kod varsa ekleyebilir misiniz ?

F®T

*****************************'UZATMA MOTORU PULS OKUMA***********************



UZATPLSSTRT:
IF UPSTRT=0 THEN  'EGER START BITI O İSE START OLSUN
T1CON.0=1  'TMR1  T1CON 0.BİTİ İLE 1 VER DEVREYE AL
UPSTRT=1   'START BITI KURULUR
ENDIF
RETURN

UZATPLSOKU:
UZATPULS.Byte1=TMR1H:UZATPULS.Byte0=TMR1L   'motordan okunan encoder puls sayısı
RETURN


UZATPLSHSP:
UZATMESAFE=UZATPULS/KALIBRE        'UZAMA MESAFE KALİBRASYONU
RETURN


18f46k22 ile ilgili.programda tmr1 aktif ediyorum ve capture özelliği ile gelen pulsleri tmr1 ile sayıyorum.bunu değişkene aktarıyorum.program çok büyük olduğu için tamamını veremiyorum ama prensip bu.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

0nur

Burada T1CON , OPTION_REG registerlarınıda set etmemiz gerekiyor mu? Birde 18f serisi ile 4khzlik sinyal işlenebilir demişsiniz, bunu nereden hesaplıyorsunuz? İşlemci osilatör frekansının kaçta kaçını bu iş için kullanıyor?

ete

Capture (Yakalama) konusu hakkında biraz bilgi vereyim. Bu bir donanımsal özelliktir. Pek çok işlemcide bulunmaktadır.
Kullanım amacı genelde iki olay arasındaki zamanı saymak şeklinde açıklanabilir. İki olay ne anlama geliyor.?
Bir kare dalga sinyalinin düşen kenarı bir olay aynı sinyalin yükselen kenarı ise ikinci olaydır. Bu durumda uygun şekilde kullanırsanız bir kare dalganın düşen kenarı ile yükselen kenarı arasındaki süreyi Capture ile sayabilirsiniz. Bu sinyalin LOW süresi olacaktır. Benzer şekilde aynı sinyalin HIGH süresinide birinci olay olarak Yükselen kenar ve ikinci olay olarak da düşen kenarı vererek saydırmak mümkündür. Ne işimize yarar bu iş derseniz bir frekansı bu şekilde kısa sürede ölçmek mümkündür. Önce sinyalin HIGH süresini sonra LOW süresini yakalar ve bunları toplarsam bana T (peryod) vermiş olur. Buradan Frekans=1000/T=KHz cinsinden frekansı verir. 1.000.000/T=Hz cinsinden frekansı verir.

Yine Devir ölçümlerinde programı uzun süreli puls sayma işlemlerinden kurtarmak üzere Capture kullanılabilir. Çünki devir ölçmede bir puls üreteci kullanmak zorundasınız. Bu üretecin birim zaman içinde verdiği puls sayısı devir frekansını verecektir. Burada da T peryodunu ölçerek kolaylıkla devir hesabını yapabilirsiniz.

Gelelim sistemin nasıl kullanıldığına;
Bu özelliğe sahip işlemcinin bir CCP1  pini bulunur. Bu pini giriş pini olarak ayarlayıp sinyali buradan girmek gerekir.
O halde kullanılacak birinci register TRISx registeridir. Örnekle devam edecek olursak ve 16F628A üzerinden açıklamalarımızı yaparsak işlemcinin CCP1 pini PORTB.3 de bulunur. O halde bu pini giriş olarak ayarlamak gerekecekse TRISB.3=1 demek yeterli olacaktır.
Daha sonra kullanacağımız register CCP1CON registeri olacaktır. Data sheet'e bakarsanız sistemi Capture amaçlı kullanabilmek için öncelikle sinyalin düşen kenarında mı yoksa yükselen kenarındamı işlem yapacağımıza karar vermemiz gerekir. BU aşamada da bir örnek devreye sokarsak konu daha iyi anlaşılacaktır.
Diyelimki Bir kare dalga sinyalinin HIGH peryodunu ölçeceğiz. Bunun için aşağıdakileri sırası ile yapıyoruz.
- TRISB.3=1
- CCP1CON=%00000101  'capture yükselen kenar için ayarlandı
- T1CON=0 'şimdilik sıfır veriyoruz işlem başlayınca aktif edeceğiz
Öncelikle kesme kullanmadan bu işi yapmaya çalışalım.
TMR1L=0
TMR1H=0 'timer değerini sıfırladık
T1CON=%00000001 'timer1 aktif
PIR1.2=0 ' CCP1 kesme bayrağını sıfırladık sıfırlanmaz ise yeniden kesme oluşmaz
While PIR1.2=0:wend   'kesme oluşmadığı sürece bekle
Peryot.Byte0=TMR1L
Peryot.Byte1=TMR1H  'ham süre
CCP1CON.0=0 'şimdi de düşen kenar için capture registerini ayarladık
PIR1.2=0 ' bayrağı sıfırladık
While PIR1.2=0:wend 'kesme oluşuncaya kadar bekle
Sure.Byte0=TMR1L
Sure.Byte1=TMR1H
HIGH_SURE=SURE-Peryot  şeklinde hesaplanmış olacaktır.
Tabiiki süreninin TMR1 sayama sınırları içinde olmasına dikkat etmek gerekiyor. Şayet süreyi kesinlikle bilmiyorsanız o zaman TMR1 bölücülerini devreye almanızda yarar vardır. Örneğin 1/8 bölme oranı ile çalışırsanız yaklaşık 524000 us lik süre aralığında çalışabiilrsiniz. Tabiiki hesaplama için bölücüyü dikkate almanızda yarar vardır.

Aslında daha da iyi bir sistem şöyle olmalıdır diye düşünüyorum. Yükselen kenar için Capture ayarladık. Kesme oluşunca
TMR1'i sıfırlasak daha sonra Capturu düşen kenar için ayarlayıp kesme olduğunda direk TMR1 değerini okusak bize net  HIGH süresini verir diye düşünüyorum.
T1CON=%00000001 'timer1 aktif
PIR1.2=0 ' CCP1 kesme bayrağını sıfırladık
While PIR1.2=0:wend   'kesme oluşmadığı sürece bekle
TMR1L=0
TMR1H =0
CCP1CON.0=0 'şimdi de düşen kenar için capture registerini ayarladık
PIR1.2=0 ' bayrağı sıfırladık
While PIR1.2=0:wend 'kesme oluşuncaya kadar bekle
Sure.Byte0=TMR1L
Sure.Byte1=TMR1H
Sure isimli değişken şu anda HIGH süresini gösteriyor olması gerekir.
Artık bu işin kesme ile nasıl yapıldığını izah etmeme gerek yok sanırım. Bunun için yalnızca PIE1,2 bitini (Capture kesmesi enable biti) set etmek ve kesme içinde yukarıda açıklanana benzer işlemler yapmak yeterli olacaktır.

Ete

est32


Powered by EzPortal