Rotary Encoder ve F4

Başlatan muhittin_kaplan, 13 Haziran 2014, 15:58:27

muhittin_kaplan

Encoderle hiç çalışmadım, incelediğim kadarıyla 2 (A ve B) çıkışı mevcut ve bu çıkışlar arasında 90derece fark olan bir kare dalga şeklinde.
Nasıl bir yöntem uygulamalıyım ki encoderi kullanabileyim?

skara1214

a=input(pin_a4);
b=input(pin_a3);
f=0x00|ax<<3|bx<<2|a<<1|b;
if(f==1||f==7||f==0x0e||f==8)
counter++;
if(f==2||f==0x0b||f==0x0d||f==4)
counter--;
ax=a;
bx=b;
Herkes ölür ama herkes gerçekten yaşamaz

muhittin_kaplan

biraz açıklarsanız hocam sevineceğim  :)

Mucit23

Hocam timerle yaptım.

Timeri aşağıdaki kodlarla init ediyorum.
GPIO_InitTypeDef GPIO_InitStructure;
	 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
	 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
 
  // PA6 TIM3_CH1, PA7 TIM3_CH2
 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
     
    //GPIO_PinRemapConfig( GPIO_FullRemap_TIM3, ENABLE );     
	
    TIM_TimeBaseStructure.TIM_Prescaler = 0;
    TIM_TimeBaseStructure.TIM_Period = 65535; // Maximal
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
 
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
 
    TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI1, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
     
    TIM_Cmd(TIM3, ENABLE);


Ama ben STM32F103 ile çalıştırdım. GPIO ayarlarını F4'e göre yapmanız gerekir.

muhittin_kaplan

Hocam Sinyali inceliyorum,
A nın düşen kenarı geldiğinde, B 1 se CW
A nın düşen kenarı geldiğinde, B 0 sa CCW

buna görede arttır yada eksilt yaparım diye düşündüm. A yı bir exti ile alırsak dahada iyi olur.
timer neden ihtiyaç var  ve siz okuma işlemini nerede nasıl yaptınız ?

Mucit23

Hocam aslında sizin timere çok da ihtiyacınız yok gibi, Sonuç olarak siz menülerde gezinim yapacaksınız arttır azalt işlemleri yapacaksınız.

Timer'e genelde motor kontrol meleselerinde gerek duyuluyor.

Ama Sayacı otomatik arttırıp azalttığı için encoderi takip etmekle uğraşmıyorsunuz. Timer Update kesmesinide açarsanız encoder ile oynandığında kesme oluşur.

Timerin Değerini TIM_GetCounter(TIMx); komutuyla okuyabilirsiniz. Ne tarafa döndüğünü ise Timerin CR1 Registerinin DIR biti yani 4. bitine bakarak tespit ediyorsunuz.

muhittin_kaplan

anladığım kadarıyla

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;

bu iki pini kullanıyorsun.

Mucit23


muhittin_kaplan

Olması gereken


benim elimdeki
saat yönü


saat yönü tersi


şimdi olması gerekenden gidelim

A sinyalin her düşen kenarında B yi kontrol etsem CW mi CCW mi Anlaşılır. Buna göre de (int içinde) değişkenimi artırır yada azaltırım.

ama benim Enc. ın çıkışlarına baktığımda Pekte öyle olmadığı görülüyor.


mesaj birleştirme:: 13 Haziran 2014, 21:44:10

MOUSE (tekerlek) dan sökmüştüm :D

ilhan_mkp

hocam sizin encoder nasıl bir çıkış veriyor.

muhittin_kaplan

#10
enkoderden olabilir mi ?

mesaj birleştirme:: 13 Haziran 2014, 22:13:45

Ayakkabı Buldun Giy Niye Radyo Yapıyonki

http://mikrocontroller.bplaced.net/wordpress/?page_id=2140

ilhan_mkp

hocam sizin elinizde standart artımlı encoder gibi davranmıyor.
yanlış anlamadıysam sizinkinde doluluk oranı değişiyor.

muhittin_kaplan

#12
yok yok, muhtemelen pek hassas olmamasından
alet şunlardan.
http://i00.i.aliimg.com/wsphoto/v0/1200659644/Free-shipping-50PCS-7MM-font-b-mouse-b-font-encoder-font-b-mouse-b-font-wheel.jpg

mesaj birleştirme:: 13 Haziran 2014, 22:24:38

@mucit23
Hocam, Olayı irdeleyebilirmiyiz, neden timer kullanıyoruz ve bu çalışma nasıl oluyor ?

RaMu

Hocam sizin encoderla elinizdeki şema benzer aslında,
sizin encoderın tam durumu şu olmuş,
yani kontrol edeceğiniz işlem şu
encoder ı A ve  B olarak 2 buton olarak düşünüp
önce hangi butona basıldı kontrolü yapacağız.

İsterseniz basit bir logic devreyle işlemciyi hiç yormadanda
bu kontrol yapılabilir.

Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

camby

#14
Muhittin hocam, yukari cok detayli okuyamadim ama kisaca ozetleyim.

Dondukce A-B arasi 90 derece faz farki olan sinyaller geliyor biliyorsunuz. 90 derecdn bunu 4 bolgeye ayiririz hemen. Simdi 4 bolge orneklerini incdledigimizde, donus yonunu cikarmak o anki sinyal ile bir onceki sinyalin esitligini karsilastirman yeterli, bi da xor ile yapiliyor. Bir onceki sinyali saklamak icin 2 kat d tipi flip flop var. Karsilastiricin cikisi 1 ise pozisyon counter ini arttiriyorsun, 0 ise azaltiyorsun. Tabi hepsini. Icinyukselen ve alcalan kenarlar icin konusuyoruz.

Tam aciklayamamis olabilirim disardayim, ama mantigi 2ser d type ff , 1 xor ve counter'dan ibaret.

Simdi st bu birimi timer'in icine koymus, nxp microchip ayri birim yapmis.

Eger bunu encoder.birimi olmadan yapmaya calisirsaniz, surekli kesmeye girip io lari okumak zorunda kalirsiniz, hizziniz artiikca surekli int handler icinde kalirsiniz, handlerdan cikamaz puls kacirirsiniz, 16f877 ile yapmistim 4 sene once forumda biyerde var asm :)

Timerda kurunca arka planda ileri geri sayiyor, siz sadece istedginiz zaman okuyorsunuz.


mesaj birleştirme:: 13 Haziran 2014, 22:40:54

Ek: harici devre ihtiyaclarini gidermek icin bu birimleri yapmislar zaten, artik gerek yok, sadece f4 bile 4 encoderi hardware sayabiliyor