Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

Puls almadaki hatam..

Başlatan elektroombank, 22 Haziran 2006, 20:51:02

ete

Yapmak istediğini çok iyi anlayamıyorum. İki adet encoder kullanıyorsun ancak birisi bana kalırsa hiç işe yaramıyor. Zira yazdığın programda birinci encoder pals değiştirmeden diğerine zaten bakılamıyor. Burada mantık değiştirmek lazım. Mademki sisteme iki adet encoder bağlı aynı anda her ikisinde olan değişiklikler izlenmeli ve hangisi pals değiştirmiş ise onun sayıcısı bir artırılmalı. Birde Programda TRIS registerlerini iyi kullanamıyorsun. Portlar hem giriş hemde çıkış olabiliyor biliyorsun. Port pinlerinden birisini çıkış yapmak için o porta ait TRIS registerinde çıkışa denk gelen bit sıfır yapılır. Aynı pin giriş yapılmak isteniyor ise yine Tris registerinde o pine denk gelen bit 1 yapılır. Ben tek encoderli sistemde TRISD=%00100000 yazmış idim. Sen iki girişe çıkarmana rağmen TRISD registerini değiştirmemişsin. TRIS adı verilen yön registerlerine dikkat etmelisin.
Diyelimki her şeyi doğru ayarladık. senin temel amacın yada programın temel amacı hangi encodere ait pals sayıcısı toplam pals değerine ulaşır ise ona bağlı motor dursun ve her iki motorda durmuş ise işlem bir kademe atlasın veya başa dönsün istiyorsun sanırım. Bu durumda tavsiye olarak söylüyorum. Bir defa encoder girişlerini yan yana iki port pinine gir. Mesela Port D.4 ve D.5 pinlerini kullan. Sonrada aşağıdaki programı dene bakalım. Bu program her iki encoder girişini aynı anda değerlendirip hangisinde değişiklik var ise onu artırmaktadır. Ben isis de denedim güzel çalışıyor.

Kolay Gelsin
Ete

define osc 20
ADCON1 = 7                ' tüm portlar dijital yapılıyor 
'------------------------------------------------------------------------------- 
TrisD=%00110000 

SYMBOL ENCODERA=PORTD.5 ' Encoder 1 buraya bağlı 
SYMBOL ENCODERB=PORTD.2 ' Encoder 2 buraya bağlı 
TEMP  VAR BYTE
ESKI  VAR BYTE
YENI  VAR BYTE
TOPLAMPULS VAR BYTE 
TOPLAMPULS = 5 

ENC1STAT VAR BIT 
ENC2STAT VAR BIT 

ENCODERATOPLAM VAR BYTE
ENCODERBTOPLAM VAR BYTE  

BASLA: 
'-------------------------------------    
     PAUSE 500 
     ENCODERATOPLAM=0
     ENCODERBTOPLAM=0 
     LCDOUT $fe,1,    "    SISTEM    " 
     LCDOUT $fe, $C0, "   BASLASIN   " 
     HIGH  PORTD.0  ' MOtor 1 çalışsın 
     HIGH PORTD.1   ' Motor 2 çalışsın 
     gosub ENCSAY: 'hemen encoder saymaya gidilsin 
     Low PORTD.0 'Motorlar puls değeri kadar döndü.Motorlar artık durabilir 
     low PORTD.1 'Motorlar puls değeri kadar döndü.Motorlar artık durabilir 
     LCDOUT $fe,1,    "   1. tur    " 
     LCDOUT $fe, $C0, "   tamamlandi   " 
'---------------------------------------    
     pause 500 
     ENCODERATOPLAM=0
     ENCODERBTOPLAM=0 
     LCDOUT $fe,1,    "    2. tur    " 
     LCDOUT $fe, $C0, "   BASLASIN   " 
     PAUSE 1400 
     HIGH  PORTD.0  ' MOtor 1 çalışsın 
     HIGH PORTD.1   ' Motor 2 çalışsın 
     Gosub ENCSAY: 'hemen encoder saymaya gidilsin 
     Low PORTD.0 'Motorlar puls değeri kadar döndü.Motorlar artık durabilir 
     low PORTD.1 'Motorlar puls değeri kadar döndü.Motorlar artık durabilir 
     pause 500 
     LCDOUT $fe,1,    "   2. tur    " 
     LCDOUT $fe, $C0, "   tamamlandi   " 
'---------------------------------------  
     pause 500 
     ENCODERATOPLAM=0
     ENCODERBTOPLAM=0 
     LCDOUT $fe,1,    "    3. tur    " 
     LCDOUT $fe, $C0, "   BASLASIN   " 
     HIGH  PORTD.0  ' MOtor 1 çalışsın 
     HIGH PORTD.1   ' Motor 2 çalışsın 
     Gosub ENCSAY: 'hemen encoder saymaya gidilsin 
     Low PORTD.0 'Motorlar puls değeri kadar döndü.Motorlar artık durabilir 
     low PORTD.1 'Motorlar puls değeri kadar döndü.Motorlar artık durabilir 
     pause 500 
     LCDOUT $fe,1,    "   3. tur    " 
     LCDOUT $fe, $C0, "   tamamlandi   " 
     pause 500 
     LCDOUT $fe,1,    "   BASA    " 
     LCDOUT $fe, $C0, "   DONULUYO   " 

     goto basla: 

                       
'****Encoder sayma Alt Programı Başlangıçı Burası******************************                        
ENCSAY: 
           ESKI=(PORTD & %00110000)>>4
TEKRAR:    YENI=(PORTD & %00110000)>>4
'           lcdout $fe,2,"ESKI=",dec2 eski," YENI=",dec2 yeni
           if eski=yeni then TEKRAR           
           TEMP=ESKI XOR YENI
           IF TEMP & %01=%01 then ENCoderATOPLAM = ENCODERATOPLAM + 1
           IF TEMP & %10=%10 then ENCoderBTOPLAM = ENCODERBTOPLAM + 1
      
           IF ENCODERATOPLAM = TOPLAMPULS THEN Low PORTD.0 
                   
           IF ENCODERBTOPLAM = TOPLAMPULS THEN Low PORTD.1
      
    
           lcdout $fe,$c0,"  A=",dec2 ENCODERATOPLAM,"   B=",dec2 ENCODERBTOPLAM  

           
'           IF ENCODERATOPLAM = TOPLAMPULS AND ENCODERBTOPLAM = TOPLAMPULS THEN
            IF portD.0=0 AND PortD.1=0 then
            ENCODERATOPLAM=0
            ENCODERbTOPLAM=0
            RETURN
           else         
            GOTO ENCSAY:
           ENDIF 

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

elektroombank

@ete abim dediğin gibi TRIS registerleri.

PIC Assembly ile yazarken yapıyorum.Ama PIC Basic Pro da yapmak gerektiğini bilmiyorum.Direk giriş çıkış yaptığından olur zannediyordum..

""senin temel amacın yada programın temel amacı hangi encodere ait pals sayıcısı toplam pals değerine ulaşır ise ona bağlı motor dursun ve her iki motorda durmuş ise işlem bir kademe atlasın veya başa dönsün istiyorsun sanırım.""

Evet tam bu şekilde idi bahsetmet istediğim.Kodları aldım.Dediğin gibi Portd 4 ve 5 inci olarak bağladım, denedim.

Ellerine sağlık gayet güzel çalışıyor.

Ama birşey hala aklıma takıldı.Bu PULS üreticilerin Hz hızlarını değiştiriyorum (Çünkü dc motorlar tam olarak aynı hızda dönmüyorlar)

Ve Simulasyonu başaltıyorum.Ama Lcd ekrandaki sonuca göre Sıralı olarak okuyor.Halbuki bir Encoderın daha geç işlemi bitirmesi lazım değilmi?

Simulasyonun Hatası olabilir mi? Eğer ondan ise devreyi kuracağım artık.

 Sevgiler

ete

Şayet clock frekanslarını farklı yaparsan göreceksin. Biri diğerine göre daha geç bitiriyor. Ancak, yinede sorun olabilir. Biraz daha incelemek gerekiyor.

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

elektroombank

Hz leri farklı olarak denediğim devreyi  buradan indirebilirsiniz...

100hz ve 10 hz olark denedim.Ama yinede aynı anda eşitleniyorlar..

ete

Birde aşağıdaki programı dene bakalım.

define osc 20 
ADCON1 = 7                ' tüm portlar dijital yapılıyor 
'------------------------------------------------------------------------------- 
TrisD=%00110000 

SYMBOL ENCODERA=PORTD.4 ' Encoder 1 buraya bağlı 
SYMBOL ENCODERB=PORTD.5 ' Encoder 2 buraya bağlı 
TEMP  VAR BYTE 
ESKIA  VAR BYTE 
YENIA  VAR BYTE 
ESKIB  VAR BYTE
YENIB  VAR BYTE
TOPLAMPULS VAR BYTE 
TOPLAMPULS = 10 

ENCODERATOPLAM VAR BYTE 
ENCODERBTOPLAM VAR BYTE  

BASLA: 
'-------------------------------------    
     PAUSE 500 
     ENCODERATOPLAM=0 
     ENCODERBTOPLAM=0 
     LCDOUT $fe,1,    "    SISTEM    " 
     LCDOUT $fe, $C0, "   BASLASIN   " 
     HIGH  PORTD.0  ' MOtor 1 çalışsın 
     HIGH PORTD.1   ' Motor 2 çalışsın 
     gosub ENCSAY: 'hemen encoder saymaya gidilsin 
     Low PORTD.0 'Motorlar puls değeri kadar döndü.Motorlar artık durabilir 
     low PORTD.1 'Motorlar puls değeri kadar döndü.Motorlar artık durabilir 
     LCDOUT $fe,1,    "   1. tur    " 
     LCDOUT $fe, $C0, "   tamamlandi   " 
'---------------------------------------    
     pause 500 
     ENCODERATOPLAM=0 
     ENCODERBTOPLAM=0 
     LCDOUT $fe,1,    "    2. tur    " 
     LCDOUT $fe, $C0, "   BASLASIN   " 
     PAUSE 1400 
     HIGH  PORTD.0  ' MOtor 1 çalışsın 
     HIGH PORTD.1   ' Motor 2 çalışsın 
     Gosub ENCSAY: 'hemen encoder saymaya gidilsin 
     Low PORTD.0 'Motorlar puls değeri kadar döndü.Motorlar artık durabilir 
     low PORTD.1 'Motorlar puls değeri kadar döndü.Motorlar artık durabilir 
     pause 500 
     LCDOUT $fe,1,    "   2. tur    " 
     LCDOUT $fe, $C0, "   tamamlandi   " 
'---------------------------------------  
     pause 500 
     ENCODERATOPLAM=0 
     ENCODERBTOPLAM=0 
     LCDOUT $fe,1,    "    3. tur    " 
     LCDOUT $fe, $C0, "   BASLASIN   " 
     HIGH  PORTD.0  ' MOtor 1 çalışsın 
     HIGH PORTD.1   ' Motor 2 çalışsın 
     Gosub ENCSAY: 'hemen encoder saymaya gidilsin 
     Low PORTD.0 'Motorlar puls değeri kadar döndü.Motorlar artık durabilir 
     low PORTD.1 'Motorlar puls değeri kadar döndü.Motorlar artık durabilir 
     pause 500 
     LCDOUT $fe,1,    "   3. tur    " 
     LCDOUT $fe, $C0, "   tamamlandi   " 
     pause 500 
     LCDOUT $fe,1,    "   BASA    " 
     LCDOUT $fe, $C0, "   DONULUYO   " 

     goto basla: 

                        
'****Encoder sayma Alt Programı Başlangıçı Burası******************************                        
ENCSAY:                '     BA
           ESKIA=PORTD.4
           ESKIB=PORTD.5 
           IF ESKIA=0 AND ESKIB=0 THEN ENCSAY
TEKRAR:    YENIA=PORTD.4
           YENIB=PORTD.5
           IF ESKIA=YENIA AND ESKIB=YENIB THEN TEKRAR  
           if ESKIA=1 AND YENIA=0 THEN 
            IF ENCoderATOPLAM <TOPLAMPULS THEN ENCODERATOPLAM= ENCODERATOPLAM + 1 
           ENDIF 
           IF ESKIB=1 AND YENIB=0 THEN
           IF ENCODERBTOPLAM<TOPLAMPULS THEN  ENCoderBTOPLAM = ENCODERBTOPLAM + 1
           ENDIF
              
           IF ENCODERATOPLAM = TOPLAMPULS THEN Low PORTD.0 
                    
           IF ENCODERBTOPLAM = TOPLAMPULS THEN Low PORTD.1 
      
           lcdout $fe,$c0,"  A=",dec2 ENCODERATOPLAM,"   B=",dec2 ENCODERBTOPLAM  

           IF portD.0=0 AND PortD.1=0 then 
             ENCODERATOPLAM=0 
             ENCODERbTOPLAM=0 
             RETURN 
           else  
             GOTO encsay 
           ENDIF 
           end  


Yarın bir seyehate çıkıyorum. Foruma çok sık bakamıyacağım. Ama sanırım budefa oldu ve gerisini sen halledersin artık.
Kolay Gelsin
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

elektroombank

Evet abim tam dediğim gibi işte herzler farklı iken farklı.

Artık sıra geldi encoder seçmeye.İlk sayfada sistemin görünümünü atmıştım.O sisteme ugun bir encoder arıyorum.Birde Motor hızları hakkında bilgi vereyim.

Motorlar 1 sn 'de 2 tur atıyor.Yani 120 rpm.

Bu durumda sistemde 2 Derecelik hassasiyet olacağına göre motorlar bir dönüşte 180 PULS verecek.Motorlar tam bir turunu 0.5 sn'de yaptığına göre;
Bir encoder 1 saniyede toplam 360 Puls gönderecek.
Aynı anda diğer encoder'da puls göndereceğinden PIC 1 sn'de Toplam
720 PULS ile boğuşacak.
Osilator olarak 20 MHz XT osilator kullanmayı düşünüyorum.Yani PIC'e girince bir komut 5 MHz hızında çalışacak.Yani bir komut 0.2µs de çalışacak.

 Saniyede 720 PULS 720 KHz olur diye biliyorum.Doğrumudur?

 Eğer bu şekilde ise programın PULS kaçırması gibi bir durumda söz konusu olmuyor.

 O zaman benim şimdi Encoder almam gerekiyor. Hemde 0.5 sn'de 360 Derece dönerken 180 PULS gönderebilen cinsten...

Birde tür olarak ne seçmeliyim.Optik mi, Rotary mi, yoksa başka bilmediklerimdemi var?

ete

Saniyede 720 puls 720 HZ dir. 720.000 Hz=720 KHz dir.

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

elektroombank

ozaman çok daha iyi oluyor.hız baya iyi oluyor.

0.5 sn'de 360 Derece dönerken 180 PULS gönderebilen cinsten bir encoder önerebilirmisiniz.İstanbulda Karaköyde filan alabileceğim yerler
nelerdir.

ete

Ben Ankara da oturuyorum. Bu nedenle yardımcı olamıyacağım.
Ancak omron dan veya Bankalar Cad. elektrikçi ve elektronikçilerden araştırabilirsin. Muhtemelen 180 puls bulamıyacaksın. 200 muhtemelen bulurusun.

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

microcozmoz

Bankalar caddesi menevşe handa bir ara orada bulabilirsin..
"Bütün bu şerâitten daha elîm ve daha vahim olmak üzere, memleketin dahilinde, iktidara sahip olanlar gaflet ve dalâlet ve hattâ hıyanet içinde bulunabilirler."

elektroombank

Marka veya Tür verebilirmisiniz?

Sorduğumda nasıl bir encoder diyolar...

elektroombank

Arkadaşlar bugün gittim encoder almaya ama karar veremedim.Esnafa sordum farkları ne diye.Biri Optik biri Rotary dedi.Yani farkı bilmiyordu.
Bende bilmiyordum.

Birisi benim için bu farkı söyleyebilir mi?

ete

Ticari anlamda farklılıklarını bilmiyorum. Önceden bir kaç tane encoder sökmüş idim. Onlardan bildiğim kadarı ile içinde bir disk ve diskin üzerinde tur başına pals sayısı kadar delikler mevcut. Bir encoder de ham A hem B ve birde C denilen üç adet çıkış bulunmaktadır. A ile B birbirinden yarım faz farklı şekilde çıkış verecek şekilde delikler yerleştirilmiştir. C ise daha uzun palsler verecek şekilde dizayn edilmiş. A ile B aynı anda kontrol edilerek encoderin dönüş yönü bulunabilmektedir. Pals üretme sistemi hemen hepsinde optik olarak yani bir ifrared led ve bir foto diyot veya transistör yardımı ile olmaktadır. Bu tip encoderler Rotary encoder olarak adlandırılmaktadır.
Senin Optik olarak nitelendirdiğin encoderlar ise yine rotary yani döner şekilde çalışmaktadırlar ve sanırım bizim optik maus'lardaki sistemin bir benzeri mantık ile çalışmaktadırlar. Ben ilk defa optik maus gördüğümde hemen aklıma gelmiş idi aynı mantık ile bir encoder yapılamaz mı diye. Ancak A ile B nin faz farkı nasıl yaratılır düşünememiş idim.
Şimdi çok emin değilim ama yine optik encoder de yine rotary çalışan ancak pals üretme sistemid elikli disk ile değilde optik maus sistemi ile çalışan bir alet galiba.
Senin işini rotary normal encoder görür. Hangisi ucuz ise onu al derim.

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

elektroombank

Ok abi dediğin gibi yapıcam.fakat şimdi dikkatimi çeken birşey oldu.
Yani A B ve C uçları.Bana yön tyini gerekmiyor.Yönü zaten hep aklımda tutuyorum program olarak.yani sadece A ucunu bağlayıp aynı pulsı İleri veya geri konumda ikende alabilirmiyim.

ete

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