Bütünlemeler biter bitmez elimdeki encoder'ı kullanayım dedim , buyrun detaylar:
Encoder : 1024 puls
4x mod + ileri geri pozisyon takibi : 1 tur 4096 parça
MCU : Pic 16f877a , 20MHz
Kesme : PORTB <4:7> değişim kesmesi
Display : 4'lü 7 segment
Display tarama frekansı : 76.21 Hz
Kesme alt programının işlenme süresi : 8.4 us
HIZ------------2 Kesme arası süre---------------Durum
---------------------------------------------------------------------
60 RPM------------250 us------------Test Başarılı
600 RPM-----------25 us ------------Test Başarılı
1200 RPM---------12.5 us-----------Test Başarılı
1800 RPM---------8.33 us-----------Test Başarısız --- Sınır Değeri
Hesap yaparken encoder'ı 1000'lik kabul ettim
Tablo fx'den edit :)
Özetle A ve B fazından gelen kesmelerin okunması ve yön tespitinin yapılabilmesi için 2 kesme arası sürenin 8.4 us 'den fazla olması gerekiyor. Bu da yaklaşık 1800 RPM'e denk geliyor. 2 kesme ( puls ) arası süre 8.4 us'nin altına indiğinde program puls kaçırıyor.
Sonuç olarak 1200 rpm'de konum hatası yapmıyor .
henüz RPM hesaplamasını yaptırmadım...
; Encoder ile konum takibi
LIST P=16F877A
include "P16F877A.inc"
__CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_HS_OSC &_BODEN_OFF &_LVP_OFF &_CPD_OFF
ORG 0x00
GOTO AYAR
ORG 0X04
GOTO KESME
#DEFINE FAZA PORTB,7
#DEFINE FAZB PORTB,6
;===============Registers=================================================
w_sakla EQU 20
s_sakla EQU 21
konum_bir EQU 22
konum_on EQU 23
Flag EQU 24
konum_yuz EQU 25
konum_bin EQU 26
eski_a EQU 27
yeni_a EQU 28
eski_b EQU 29
yeni_b EQU 2A
saatyonu EQU 2B
tersyon EQU 2C
basamaksayaci EQU 2D
;===============if========================================================
LKAE macro f,k, etiket
movlw k
subwf f,0
btfsc STATUS,2
CALL etiket
endm
;===============KESME ALT PROGRAMI========================================
KESME movwf w_sakla ; W yazmacı kaydedildi
movf STATUS,w
movwf s_sakla ; Status yazmacı kaydedildi
btfsc PIR1,0 ; Timer kesmesi oldu mu?
GOTO TIMER
btfss FAZA ; A fazının okunması
clrf yeni_a
btfsc FAZA
movlw .1
btfsc FAZA
movwf yeni_a
btfss FAZB ; B fazının okunması
clrf yeni_b
btfsc FAZB
movlw .1
btfsc FAZB
movwf yeni_b
movf yeni_b,w ; eskiA xor yeniB
xorwf eski_a,f
btfss eski_a,0
incf saatyonu
btfsc eski_a,0
incf tersyon
movf yeni_a,w ; yeni değerler , eski oldu
movwf eski_a
movf yeni_b,w
movwf eski_b
movf PORTB,f
nop
bcf INTCON,0 ; (RBIF) RB Port Change Interrupt Flag bit
nop
movf PORTB,f
movf s_sakla,w
movwf STATUS ; Status yazmacı geri yüklendi
movf w_sakla,w ; W yazmacı geri yüklendi
retfie
TIMER bsf Flag,0 ; LCD yenileme bayrağı
bcf PIR1,0 ; (TMR1IF) TMR1 Overflow Interrupt Flag bit
bsf TMR1H,7
nop
bsf TMR1H,6
movf s_sakla,w
movwf STATUS ; Status yazmacı geri yüklendi
movf w_sakla,w ; W yazmacı geri yüklendi
retfie
;===============Gösterilecek Sayının binary karşılığı ORTAK KATOT=========
TABLO addwf PCL,1
DT 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F
return
;===============Display Tarama============================================
LCD_REFRESH movf basamaksayaci,w ; 5.4 us , 27 komut
addwf PCL,f
GOTO Binlergonder
GOTO Yuzlergonder
GOTO Onlargonder
GOTO Birlergonder
DEVAM incf basamaksayaci ; 7 segment tarama sırası
movlw .4
subwf basamaksayaci,w ; Basamak Sayacı taştı mı
btfsc STATUS,Z
clrf basamaksayaci
bcf Flag,0 ; LCD yenileme bayrağı temizlendi
return
;===============7 Segment TARAMA==========================================
Binlergonder
movf konum_bin,w
CALL TABLO
movwf PORTC
movlw b'00000001'
movwf PORTD
GOTO DEVAM
Yuzlergonder
movf konum_yuz,w
CALL TABLO
movwf PORTC
movlw b'00000010'
movwf PORTD
GOTO DEVAM
Onlargonder
movf konum_on,w
CALL TABLO
movwf PORTC
movlw b'00000100'
movwf PORTD
GOTO DEVAM
Birlergonder
movf konum_bir,w
CALL TABLO
movwf PORTC
movlw b'00001000'
movwf PORTD
GOTO DEVAM
;===============Konumu Değişkeni==========================================
ARTTIR incf konum_bir
movlw .10
subwf konum_bir,w
btfss STATUS,Z
GOTO ARTTIR1
clrf konum_bir
incf konum_on
movlw .10
subwf konum_on,w
btfss STATUS,Z
GOTO ARTTIR1
clrf konum_on
incf konum_yuz
movlw .10
subwf konum_yuz,w
btfss STATUS,Z
GOTO ARTTIR1
clrf konum_yuz
incf konum_bin
GOTO ARTTIR2
ARTTIR1 movlw .4 ; 4096 oldu mu?
subwf konum_bin,w
btfss STATUS,Z
GOTO ARTTIR2
movlw .0
subwf konum_yuz,w
btfss STATUS,Z
GOTO ARTTIR2
movlw .9
subwf konum_on,w
btfss STATUS,Z
GOTO ARTTIR2
movlw .6
subwf konum_bir,w
btfss STATUS,Z
GOTO ARTTIR2
clrf konum_bin
clrf konum_yuz
clrf konum_on
clrf konum_bir
ARTTIR2 decfsz saatyonu,f
GOTO ARTTIR
return
;===============Konumu Değişkeni==========================================
AZALT movf konum_bin,w
btfss STATUS,Z
GOTO AZALT1
movf konum_yuz,w
btfss STATUS,Z
GOTO AZALT1
movf konum_on,w
btfss STATUS,Z
GOTO AZALT1
movf konum_bir,w
btfss STATUS,Z
GOTO AZALT1
movlw .4
movwf konum_bin
movlw .0
movwf konum_yuz
movlw .9
movwf konum_on
movlw .5
movwf konum_bir
GOTO AZALT2
AZALT1 decf konum_bir
movlw .255
subwf konum_bir,w
btfss STATUS,Z
GOTO AZALT2
movlw .9
movwf konum_bir
decf konum_on
movlw .255
subwf konum_on,w
btfss STATUS,Z
GOTO AZALT2
movlw .9
movwf konum_on
decf konum_yuz
movlw .255
subwf konum_yuz,w
btfss STATUS,Z
GOTO AZALT2
movlw .9
movwf konum_yuz
decf konum_bin
AZALT2 decfsz tersyon,f
GOTO AZALT
return
;===============KONFİGÜRASYON=============================================
AYAR clrf PORTC
clrf PORTD
bsf STATUS,5 ; Bank1'e geç
clrf TRISD ;
clrf TRISC
movlw .255
movwf TRISB
bsf PIE1,0 ; TMR1 interrupt enable
bcf STATUS,5 ; Bank0'a geç
bsf INTCON,6 ; (PEIE) Peripheral Interrupt Enable bit
bsf INTCON,3 ; (RBIE) RB Port Change Interrupt Enable bit
movlw b'00000001' ; 1:1 , internal clock
movwf T1CON
clrf konum_bir
clrf konum_on
clrf konum_yuz
clrf konum_bin
clrf eski_a
clrf yeni_a
clrf eski_b
clrf yeni_b
clrf saatyonu
clrf tersyon
clrf TMR1L
movlw b'11000000'
movwf TMR1H
movf PORTB,w
nop
bcf INTCON,0 ; (RBIF) RB Port Change Interrupt Flag bit
nop
bsf INTCON,7 ; (GIE) Global Interrupt Enable bit
btfss FAZA ; A fazının okunması
clrf eski_a
btfsc FAZA
movlw .1
btfsc FAZA
movwf eski_a
btfss FAZB ; B fazının okunması
clrf eski_b
btfsc FAZB
movlw .1
btfsc FAZB
movwf eski_b
clrf Flag
;===============ANA PROGRAM===============================================
ANA btfsc Flag,0
CALL LCD_REFRESH ; 5.4 us , 27 komut
movf saatyonu,w ; 0 mı ?
btfss STATUS,Z
CALL ARTTIR ; max 6.4 us
movf tersyon,w ; 0 mı ?
btfss STATUS,Z
CALL AZALT ; max 6.4 us
GOTO ANA
END
Tebrikler,
Güzel rakamlar yakalamışsın ama yeterli olmamış,
Encoder okuyan cihazlar en az 200 bin pals/sn yakalıyor.
Şu anda sende 120 bin pals/sn'de test başarısız olmuş durumda.
877 yerine pin uyumlu olan 18F452 yi denermisin ?
(OSC olarak 10 mhz x 4PLL = 40 Mhz)
Çok daha iyi sonuçlar alacağını düşünüyorum.
işlemciyi değiştirme ihtimaliniz varsa programda hiç bu kadar kastırmayın derim bu işe özel enkoder okuma pic leri var 8192 tam palsli quadrature enkoderlerin bağlanıp 6000 rpm ac servo motor için kullanıldığını biliyorum bu kısmın programıda interruptu dahil en fazla 10 satır kaldıki bu çip aynı anda enkoderi okuduğu gibi belirttiğim servo motoruda sürüyordu.
not:
20MHz. hızdan bahsetmişsiniz bunlarda ise hız 120-140 MHz. yazdığım enkoderde sizin enkoderin aynısı ama tur başına pals oranı 8 kat fazla.pin uyumuna gelince yine pic olduğu için aynı kılıfta pinler bir kaç farkla kesin uyar
teşekkür ederim , picproje'de assembly ne demek , pic nasıl programlanır dediğim günü dün gibi hatırlıyorum : ) picprojeye teşekkür ederim.
@Allegro
Bir üst seviye işlemciye geçmeden önce 16f serisinin sınırlarını görmek istiyordum , o yüzden biraz kastırmak istedim , dediğiniz gibi 10MIPS bir 18f ile değerler direk 2 katına çıkar gibi hocam . Henüz 18f ile tecrübem yok ama artık yapılacaklar sırasında.. : )
@picmanya
Bahsettiğiniz pic hangisi acaba?
Pic 18fxx31 serisi picler motor kontrol için ve encoder girişleri var fakat onlar da 40Mhz 'de çalışıyorlar , dediğiniz bu değil sanırım.
ok,
O zaman algoritmaları biraz daha iyileştirip hızlandırmaya bakmalı :)
pic endüstriyel mikro kontrolör işlemcilerini üreten Microchip firmasının web sitesini inceleyebilirsiniz.
Alıntı yapılan: picmanya - 21 Haziran 2010, 21:02:28
pic endüstriyel mikro kontrolör işlemcilerini üreten Microchip firmasının web sitesini inceleyebilirsiniz.
teşekkürler..
teşekkür ederken bir kinaye yok değilmi?içinizden gelen bir teşekkür oldu yani, yanlış değilim demi.
yoksa dahada yardımcı olmaya çalışırız gerekiyorsa yeterki elimizden gelen bir şey olsun.
var açıkcası , ilk mesajınızda bu projeye ilaveten bir bilgi paylaşımında bulunacağınız anlaşılıyor ardından http://www.microchip.com/ ' a gönderiyorsunuz , tabi yanlış anlaşılmasın kesinlikle suçlamıyorum paylaşmak zorunda değilsiniz , ama benim paylaştıklarımdan yada paylaşacaklarımdan yararlanan olursa ne mutlu bana(bize)...
sonuç olarak bunu tartışacağımıza bu başlıkta yukarıdaki kodları yada encoder'ı tartışmayı tercih ederim
iyi çalışmalar
siz pic marka içinde quadrature encoder okuyan özel modül bulunan istediğiniz herhangibir işlemciyi seçin onunla ilgili hazırlayabildiğiniz kod veya ön çalışmaları buraya koyun sıkıntı çektiğiniz yerlerde veya ben kendi adıma hatalı gördüğüm yerlerde devreye gireyim şimdi bu yardım olarak sayılırmı?bu modülü daha önce kullanan uygulamalara baktım yalnız ben enkoder alıp kullanmadım.bu tür uygulamalar microchip sitesinde ve forum microchip'de bir kaç tane bulunuyor araştırırken gözüme çarpmıştı.
siz pic'i seçin işe başlayın geldiğiniz noktayı bildirin gerekiyorsa enkoderi okumanıza yardımcı olalım.
şimdi ilaveten benden istediğiniz bir şey varmı.daha ne yapabilirim? zaten pic'lerin adını verdim size kalan seçtiğiniz pic'i temin edip devreyi denemeniz enkoderi bundan sonra verdiğim hızlarda kolayca kullanamıyor iseniz
konuşalım.
Quadrature encoder sinyallerini işlemci dışında işlemek için entegreler var , bu entegreye örneğin A-B fazı giriliyor , çıkışı direk up-down counter şeklinde . 4x okumada işlemciyi A-B fazlarını işleme yükünden kurtarıyor. Bu işlem lojik olarak da XOR ve flipflop'larla yapılabilir tabi ama paket halinde olanı daha pratik olacaktır.
Bu konuda gördüğün devre LS7183 - LS7184 , fakat nerde satılıyor bulamadım , bileniniz var mıdır ? Yoksa bunun benzeri bir entegre bulabilir miyim , kullanan var mıdır ?
http://www.lsicsi.com/pdfs/Data_Sheets/LS7183_LS7184.pdf