Capture Mode?

Başlatan mytap, 23 Haziran 2008, 01:02:08

mytap

18F452 ile CPP1 (RC2) modundan encoderi nasıl okutabiliriz? Datasheet'e göre iki puls arasındaki zamanı bulabiliyoruz. Bu konuda uğraşmış olan mümkünse sonuçları yazabilir mi?
-------------------------------------------------------- hayırlı günler, iyi çalışmalar..  --------------------------------------------------------

volkii

external timer kesmesini kullanman bu iş için daha uygun

Gurkan-Demirbas

Alıntı yapılan: "volkii"external timer kesmesini kullanman bu iş için daha uygun
Hocam  bunu biraz daha açabilirmisin?
Genel olarak; Timer'ların hepsi Counter'dır aslında; Dahili osilatör için konfigüre ettiyseniz dahili cycle'ı sayar; external konfigüre ettiyseniz  harici TMR pininden gelen pulse'ları sayar.
Bize iki darbe arasındaki zaman lazım; extra başka bir timer'ı da işin içine sokmadan (sadece 1 timer ile) nasıl ölçebilirsin? merak ettim gerçekten.

Alıntı yapılan: "mytap"18F452 ile CPP1 (RC2) modundan encoderi nasıl okutabiliriz?
Sevgili hocam sanırım eski bir projenin devamı niteliğinde bu.
https://www.picproje.org/index.php/topic,20761&highlight=
En güzeli isis'de çalışan bir frekansmetre yaparak Capture konusunu özümsemek olur. Ki benim yukarıdaki link'de PBP'da yaptığım çok basit bir frekansmetre var. Bunu baz alabilrsin

öncelikle Capture modu ne demektir onu irdelemek lazım bence, aşağıda 16F877A'nın Capture Module Block Diagram'ını görebilirsin.


'PIC16F877A için basit bir program yazalım;
TMR1H = 0
TMR1L = 0
CCP1CON =%00000101  'Capture Modu - her çıkan kenarda 
PIR1.2 = 0                     ' CCP1 capture interrupt'ı sıfırla, interrupt kullanmayacağız ama yakalama gerçekleşip gerçekleşmediğini buradan da kontrol ediyoruz.
PIR1.0 = 0                    'Timer1 overflow - eğer Timer1 tur bindirirse diye bunu kontrol edeceğiz.

' 1inci darbe geldiği anda Timer1'n saymasını başlatmalıyız !... 
BEKLE1 : 
IF (PIR1.2=0) THEN BEKLE1   'yanlış ölçme yapmamak için ilk darbeyi bekliyoruz.
       T1CON = %00000001  ' ilk darbe alındı ==> bu yüzden Timer1'i başlat
       PIR1.2 = 0                      ' CCP1 capture interrupt'ı sıfırla
'bu durumda ikinci darbe geldiği anda (TMR1H ==>CCPR1H    TMR1L ==> CCPR1L) aktarımı hardware olarak otomatik yapılır.
BEKLE2 : 
IF (PIR1.2=0) THEN BEKLE2   'Timer çalışıyor ve ikinci darbeyi bekliyoruz burada.

' 2inci darbe gelmiş ve TMR1 değerleri CCPR1 değerlerine hardware olarak aktarılmış, sadece CCPR1 registerini okumak yeterli; ki bu word tipi registerin içerisinde, 2 darbe arasındaki sürenin Pic'in makina cycle'ı cinsinden kaç adedine karşılık geldiğini verir; biz bunu alıp hesaplar kitaplar ve işlemlerimizde kullanırız.

IF (PIR1.0=1) THEN OLCUM_HATASI  
Burada  eğer bir overflow olduysa, başka bir deyişle TMR1 sayımı 2inci darbe gelmeden tur bindirdi ise, ölçüm hatası oluşur, bunu kontrol etmemiz gerekiyor; OLCUM_HATASI rutinini burda vermiyorum ama bu tür durumda ölçüm tekrarlamak en mantıklısı bence.

 period.lowbyte = CCPR1L		
 period.highbyte = CCPR1H	

CCP1CON =0   'Compare - Capture - PWM Modu disable 
TMR1CON = 0   ' Timer1 Disable
TMR1H = 0
TMR1L = 0
PIR1.2 = 0       ' CCP1 capture interrupt'ı sıfırla
PIR1.0 = 0       ' Timer1 Overflow interrupt'ı sıfırla      


Bence bu bilgiler ışığında isis'de çalışan çok basit bir frekans metre yap; takıldığın yer olursa programını buraya koy yardımcı olalım. Eğer olmaz ise PBP'da verdiğim programın isis dosyalarını verebilirim.

NOT : 18F452'nin Capture Modülünü alıcı gözle incelemedim ama sanırım biraz farklı; bence 16F628'de isis de yapıp dene önce.

iyi çalışmalar
Gürkan

volkii

ben olaya frekans metre olarak bakmadım. gerçi arkadaş neyin encoderi pek açıklamamış ama benim aklıma şu anda üzerinde çalıştığım motor kafasındaki encoder yapı aklıma geldi

Gurkan-Demirbas

Alıntı yapılan: "volkii"ben olaya frekans metre olarak bakmadım. gerçi arkadaş neyin encoderi pek açıklamamış ama benim aklıma şu anda üzerinde çalıştığım motor kafasındaki encoder yapı aklıma geldi

Hocam sana birşey söylemiyorum zaten; Mytap arkadaşımız, genelde problemini ucundan azıcık gösterip bizlere bilmece çözdürmeye alışkın.

Neyse kolay gelsin.

Maxim

microchipin ccp ile ilgili yardımcı bir pdf dosyası var ,

onu upload edeyim bir bakın ,

içinde her ölçüm için yapılması gerekenler yazıyor ,
rpm için ne yapılmalı ?
duty ölçmek için ne yapılmalı ?
encoder kullanarak rpm ölçmek için ne yapılmalı da var ..

mesela bu periodu hardware capture ile ölçmek için yapılması gerekenler ..


Maxim

CCP.pdf


dosyayı indirmek için 2. seçeneği yani
"download with filefactory basic"
seçiyorsunuz

mytap

Arkadaşlar ilginize teşekkür ederim. Rotary Encoder ile motor rpmi okumaya çalışıyorum. 2 adet interrupt kullanarak işlem yapıyorum ve timer1 ile 100-200-......500-... 1000ms zaman dilimlerine ayrı ayrı ölçmeler yaparak rpmi okudum fakat stabil bir sonuç alamadım rpmi okutmaya çalışıyorum rpmde salınımlar oluşuyor (programsal olarak) bunun nedenini çözemediğim için  captureye yöneldim. Sistemde yoğun bir kesme trafiği var acaba buna etken olabilirmi.

Isr rutininde flaglar kontrol ediliyor bazı kısa işlemler yapılıp geri terk ediliyor.
-------------------------------------------------------- hayırlı günler, iyi çalışmalar..  --------------------------------------------------------

Erol YILMAZ

Sevgili Mytap;

Frekans ölçümü RPM ölçümü gibi konular çOk iyi donanım-yazılım
kombinasyonu ile çalışılması gereken konular.

Daha önce buna benzer bir çalışma yapmıştım. PiC Mcu serisi ile,
Başarılı oldum ama beni de ciddi şekilde terletti.
Gün geçti bu konuda daha karmaşık işlemleri PSOC Mcu ile
yapmak istedim ve Çok çoK daha kısa sürede sonuca ulaştım.

Kesmeyi değerlendiren yazılım kısmını iyice gözetlemeni tavsiye ederim.

Eğer PicBasic ile çalışıyorsan :) bu yorumu da yapılmamış varsay.

Capture vs donanımlar bu tarz işlere uygun.

Sen encoder i okutmak derken encoder in ileri geri gitmesini
saymaktan mı bahsediyorsun ?

Yoksa devir/dk yı mı hesaplamak istiyorsun ??

Gurkan-Demirbas

Alıntı yapılan: "mytap"stabil bir sonuç alamadım rpmi okutmaya çalışıyorum rpmde salınımlar oluşuyor (programsal olarak) bunun nedenini çözemediğim için  captureye yöneldim.
Encoder'dan gelen pulse zamanları stabilmi sence? Bir scope ile bak istersen. Capture bu sorununu çözmez. Salınım devam edecektir.
Nasıl çözersin?; 1'den fazla pulse ölçümü örneklerini  bir yere kaydedip bunların ortalamasını alıp, rpm'i bu ortalamaya göre hesap etmek bir çözüm olabilir.
Alıntı yapılan: "Allegro"Frekans ölçümü RPM ölçümü gibi konular çOk iyi donanım-yazılım
kombinasyonu ile çalışılması gereken konular.
Allegro hocam'a katılıyorum, Donanım ve yazılımın çok iyi şekilde uyumlu olması lazım.
"Pic'in hangi modülünü kullansam daha iyi olur" sorusu yerine "Acaba hangi mantığı takip etmeliyim? ve  donanımımı ve de yazılımımı hangi mantığın üzerine kurmalıyım?" sorularının cevabını aramak daha sağlıklı sonuca götürür kanısındayım
Gürkan

Gurkan-Demirbas

Tekrar merhaba;
Çenemi tutamadım yine, kusuruma bakmayın lütfen; çevremde "GEVEZE" olarak tanınırım :)

Mytap arkadaşımızın bu konu başlığı altında 2 adet mesaj'ı var; 2'si de incelendiğinde, insan ister istemez "yahu insanlar problemlerini neden net olarak ortaya koymazlar?" sorusunu soruyor kendine.
Hepimizin zamanı kıymetli ve insanlara bulmaca çözdürerek hem zamanlarını alıyoruz, hem hızlı gelebilecek cevaplara taş koymuş oluyoruz, hem de bu çok kıymetli database'i fasarya şeylerle dolduruyoruz.
Problemimizi nekadar net verebilir isek; o kadar sağlıklı, etkin ve de (en önemlisi) en hızlı çözümü alabiliriz.

ÖRNEK :
https://www.picproje.org/index.php/topic,20761&highlight=

Ben olsam bu konuyu şu şekilde açardım

Merhaba Arkadaşlar;
dakikada max 1500 devirde dönen bir motor ve de bu motora bağlı, her turda 360 pulse veren bir encoder bağlı. Motor'u kurduğum donanımla kontrol etmiyorum (ya da ediyorum), Motorun devrini (RPM - dev/dak) ölçmeye çalışıyorum. RPM ölçümü bana ....... için gerekli ve RPM ölçümüne göre devrem  .........  işlemlerini yapacak.

==> Projemizi net olarak anlattık; ve bu projede nelerin hassas alması gerektiği ve nelere hassasiyet göstermesek de olur konusunda net bir resim çizdik.

18F452 ile ...MHz'de çalışıyorum. X ve Y olmak üzere 2 adet interrupt kullanarak işlem yapıyorum ve timer1 ile 100-200-......500-... 1000ms zaman dilimlerine ayrı ayrı ölçmeler yaparak rpmi okudum, fakat stabil bir sonuç alamadım. rpmi okutmaya çalışıyorum ama rpmde yaklaşık +- ...... gibi bir salınımlar oluşuyor. Bunu nasıl çözebilirim?
==> Devremiz hakkında yeterli bilgiyi verdik (işlemci, çalışma hızı, vs). Problemimizi net olarak ortaya koyduk,

1) Capture modülü konusunda tecrübesizim, Capture modülü bunu çözebilir mi? Cevap evet ise Capture konusunda nasıl bir pratik yapmamı önerirsiniz.
2) Programımda Interrupt trafiği oldukça yoğun; bu kararsızlığın nedeni bu trafik olabilirmi? (programımın ilgili kısmını aşağıya ekliyorum)
3) Bu salınımı hep programsal olarak çözmeye çalıştım, ama istediğim sonucu alamadım. Programsal olarak çözülebililir mi sizce? Evet ise nasıl?
4) Eğer programsal olarak çözemiyor isek, donanım eklemesi ile çözülebilir mi? evet ise nasıl?
5) vs vs vs vs


neyse, uzatmayayim; kendimi tutamadım. Gerçi bu yazdıklarım da fasarya sayılır ve database'i yok yere işgal edecek. Moderatör arkadaşlar arzu ederlerse yazdıklarımı silebilirim.

Saygılarımla
Gürkan

mytap

Merhaba program aşağıdaki gibidir,
MaiN: 
 ON_INTERRUPT goto Rb01_rutin    
      '- 

 Denetim: 

if zaman1 > 30 then 
cls 
print at 3,2, "D:", DEC3 sayac 
print at 23,2,"R:", dec4 zaman4 
endif 
  
if zero_ok = 0 then sayac = 0 
if menu_ok = 0 then tus_kontrol  

   goto denetim 
    
RB01_RutiN:    

    if int0if = 1 and portb.1 = 0 then   ' yön tayini Enc_A 
    sayac = sayac + 1    
    zaman2 = zaman2 + 1 
    endif 
    
    if int1if = 1 and portb.0 = 0 then  ' yön tayini Enc_B 
     sayac = sayac - 1 
        zaman2 = zaman2 + 1 
        endif 
          
    if tmr1if = 1 then zaman1 = zaman1 + 1  
    if zaman1 > 36 then 
zaman1 = 0 
zaman4 = zaman2 * 2 / 6 
zaman2 = 0 
tmr1if=0 
timer1=0 
endif          

if zero_ok = 0 then sayac = 0  
  
if sayac > 359 then sayac = 0                                               '- 
if sayac < 0 then sayac = 359      
  
int1if = 0 
int0if = 0 
TMR1IF = 0 
gieh = 1 
return

Burada ISR rutininde encoderin A ve B uçlarını baz alıyorum. Çözünürlüğü arttırıp daha etkili sonuç almak için ama yinede örneğin 210 devir gösterirken arada bir 220-230  gibi değerlere çıkıyor. Bu salınımlar standart bir zamanda da gerçekleşmiyor. Tabir doğruysa kafasına göre takılıyor. Gürkan kardeşime sevgilerle
-------------------------------------------------------- hayırlı günler, iyi çalışmalar..  --------------------------------------------------------

Gurkan-Demirbas

Alıntı YapGürkan kardeşime sevgilerle
Bizden de sevgiler;
Hocam, Pic'in çalışma frekansını yazmayıp hala bulmaca çözdürme sevdasındasın.
Neyse bence sen capture'a bir giriş yap derim. İşe yaramazsa bile tecrübe olarak kalır sende, fena mı?

kolay Gele

GürkaN

mytap

Xtal 10Mhz donanımda, PLL(4X) ile 40 mhz yazılımla çalışıyor. Sorunu tam olarak şu yolla hallettim;

ISR rutininde;

Tmr1if = 1 then 
clear Tmr1L
clear Tmr1H
clear Tmr1if
endif


Sanırım arada hatalı rakamlar almam timerin taşması sonucunda ortaya çıkan sonuçlardan olması gerek.

Tekrar teşekkür ederim Captureyi kullandım fakat programa adapte edemedim.
-------------------------------------------------------- hayırlı günler, iyi çalışmalar..  --------------------------------------------------------