1024 encoder 4x mod 16f877a konum kontrolü assembly

Başlatan camby, 21 Haziran 2010, 03:55:05

camby

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

Erol YILMAZ

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.

picmanya

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


camby

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.

Erol YILMAZ

ok,
O zaman algoritmaları biraz daha iyileştirip hızlandırmaya bakmalı :)

picmanya

pic endüstriyel mikro kontrolör işlemcilerini üreten Microchip firmasının web sitesini inceleyebilirsiniz.

camby

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..

picmanya

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.

camby

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

picmanya

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.

camby

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