ENCODER Okuma sorunu

Başlatan BenC, 21 Ocak 2010, 12:51:03

BenC

Merhaba arkadaşlar. Bir çalışmamda encoder kullanıyorum. Çözünürlüğü 128. Yani bir tam tur attığında 128 tik veriyor.  128 puls/tur.Bana 512 çözünürlük lazım bunu yazılımla hangi mantıkla halledebilirim.

Ölçümü timer0 ı kullanarak yapıyorum.

Not: 4 le çarpın demeyin sayacım da birer birer artmak zorunda.


Mod Notu: AYNI PROBLEMİ 3 AYRI YERDE AÇMANA GEREK YOK !
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

Analyzer

Selam,

Elinizdeki encoderi değiştirmeniz gerekir. Sonuçta her firmanın üretiminde farklı farklı çözünürlükler mevcut.

Analyzer
Üşeniyorum, öyleyse yarın!

BenC

hocam aynı dekoderi kullanarak 512 puls / tur yapmış adamın biri. Ama yinede bir artaştırayım o çözünürlükte encoder varmı. Yardımınız için teşekkür ederim
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

Erol YILMAZ

Encoder de A ve B çıkışları 90 derece faz farklı olduğu için x4 olarak değerlendirebilirsin.

Biraz araştırırsan konuyu göreceksin.

Analyzer

Alıntı yapılan: "BenC"hocam aynı dekoderi kullanarak 512 puls / tur yapmış adamın biri. Ama yinede bir artaştırayım o çözünürlükte encoder varmı. Yardımınız için teşekkür ederim
Selam,

Optik encoderi modifiye etmeden sadece yazılımla olabilirliğini bilmiyorum. Eğer böyle bir yöntem geliştirmiş ise birisi, bilmeyi ben de isterim. 512 pals enkoder çok rahat temin edersiniz. 10.000 pals dahi piyasada bulunabiliyor.

Analyzer
Üşeniyorum, öyleyse yarın!

tyildizak

Encoderlerin çözünürlükleri tek çıkışlarından (A) bir turda alınabilecek pulse sayısıyla adlandırılıyor.
90 derece faz farklı 2. bir çıkış daha varsa(B), A ve B çıkışları birarada değerlendirilerek her darbe arasında 4 değişim algılanabiliyor:

1. A = 1, B = 0
2. A = 1, B = 1
3. A = 0, B = 1
4. A = 0, B = 0  gibi

Bu sayede hem nominal çözünürlük 4'e katlanıyor, hem de dönüş yönü bilgisi saptanabiliyor.
Yukarıdaki mesajlarda  çözünürlük arttırma olarak kastedilen sanırım budur.

z

Encoderi x1 x2 x4 modunda kullanabilirsin.

Eger encoderin digital cikislara ilave olarak sin-cos cikis veriyorsa bu durumda cozunurlugu binlerce katina cikartabilirsin.

S101 ve S102 ayrimina bakiniz

Not: 4 le çarpın demeyin sayacım da birer birer artmak zorunda.


x4 modunda encoder yap ve kanallari cift sayacla say.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

BenC

Alıntı yapılan: "Analyzer"
Alıntı yapılan: "BenC"hocam aynı dekoderi kullanarak 512 puls / tur yapmış adamın biri. Ama yinede bir artaştırayım o çözünürlükte encoder varmı. Yardımınız için teşekkür ederim
Selam,

Optik encoderi modifiye etmeden sadece yazılımla olabilirliğini bilmiyorum. Eğer böyle bir yöntem geliştirmiş ise birisi, bilmeyi ben de isterim. 512 pals enkoder çok rahat temin edersiniz. 10.000 pals dahi piyasada bulunabiliyor.

Analyzer


Hocam adamın biri yapmış. Aynı enkoderi ve aynı devreyi bende kullanıyorum adamın yaptığı 4 kat daha hassas. benim enkoder 1 tıurda 128 sayarken adamın yaptığı enkoderli devre 512 sayıyor 1 turda.  @tyildizak ve @bunalmış üstadların yazdıkları bence mantıklı.

ben bu sorunu halledecem başka çarem yok. :)
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!


BenC

Sonunda istediğimi yaptım arkadaşlar.  128 puls/tur olan encoderi 512 puls/tur hassasiyette okuyabildim.

Normalde her iki encoderin kanalını AN696 daki gibi yön saptayıcı ile  Timer0 ve Timer1 e giriyordum. Timer ları okuyarak  pulse leri sayıyordum. bu durumda her iki kanalı da ayrı ayrı işleme soktuğum için 128  çözünürlük oluyordu. Şimdi her iki kanalıda işleme aynı anda koyarak çözünürlük 4 kat yani 512 pulse / tur oldu. şuana kadarda okumada herhangi bir sorun karşılaşmadım.  

PortB nin PB4-PB7 değişim kesmesini kullandım.  

https://www.picproje.org/index.php/topic,18878&postdays=0&postorder=asc&highlight=rotary+encoderde+h%FDz&start=20 linkteki @KAZIMUGUR üstadın kodlarından faydalandım. Teşekkürler @KAZIMUGUR, @arslan74 ,@ete

void interrupt ISR_high(void)
{
	unsigned char c;

 
	if (RBIF)

		{
	       YeniA = RB6;
		   YeniB = RB7;  
		   Yon = EskiA ^ YeniB;


			if (Yon==1)
				{
					zL = zL + 1;

					if (zL > 127 )

					{						
						zL = 0;

						zH = zH + 1;  
					
						if (zH > 127 )

							{
								zH = 0;
							}	
					}

				}
			else
				{
					zL = zL - 1;


					if (zL > 127)				
						{
							zL=  0x7F ;
	
							zH = zH - 1;
				
							if (zH > 127)
		
								{
									zH = 0x7F;
								}
	
						}
					
				}

	       //Konum = Konum + (2 * Yon) - 1 ; 
		   
		   EskiA = YeniA;
		   EskiB = YeniB;             
     
			RBIF=0; 	


		}





	if((RCIF) && (RCIE))
    {
        

	    if(OERR)        //
        {               // 
            CREN=0;     // 
            CREN=1;     //
		
        }               

        if(FERR)
        {
            RCREG=RCREG;
            RCREG=RCREG;
            RCREG=RCREG;
		 
        }
	    else
        {

              
			c = RCREG;            
    		SeriVeri = c;


		if (SeriVeri==0xC5)
			
			{
			
				if ( (ModDrm==2) && (BaglantiLPS==1))
					{
						
						#asm
							ljmp 0x0000
						#endasm 
					}

			}

		
			ModVeri[ModVeriPtr++] = SeriVeri;

			if (ModVeriPtr > 24)
				ModVeriPtr = 0;





		
        }

	}
    else
    	{   
                
                RCREG=RCREG;
                RCREG=RCREG;
                RCREG=RCREG;
        }


}
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

Erol YILMAZ

Mutlu SON :))

Başka arkadaşlara da yardımcı olacağını umuyorum.

camby

linki açamadım , ayrıca

Yon = EskiA ^ YeniB;

dönüş yönünü bulmak için kullanılmış. EskiA üzeri Yeni B mi bu acaba ? Ben tam anlayamadım bunu..

A 1 1 0 0 1 1 0 0
B 0 1 1 0 0 1 1 0

iken bu işlem dönüş yönünü doğru vermiyor gibime geliyor.


camby

ben de xor ile yapmaya çalışıyordum , teşekkürler açıklama için.

ete

Yön tayini A bitinin ilk okuma değeri ile B bitinin ikinci okuma değeri XOR yapılarak yapılır.
Verilen okuma değerlerine soldan sağa doğru bu sistemde bakar isek hep (1 XOR 1) yada (0 XOR 0) verileri ile karşılaşırsınız. Buda yön değerinin sürekli 0 çıkması demektir.
Encoder ters döner ise bu sefer sağdan sola olan değerlere bakmak gerkecektir. Bu durumda da (1 XOR 0) yada (0 XOR 1) değerleri ile kaşılaşırsınız. Bu ise Yön değerinin 1 olması demektir. Böylece yön tayini mükemmel bir şekilde yapılabilmektedir.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com