Puls almadaki hatam..

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

elektroombank

Yürüyen bant..Aslıdna yürüyen ban değil yürüyen stand oluyor herhalde.
Üretim bandı.bant üzerinde pliask kutu ileri gidecek.İşlem yapılacka sonra geri gelecek filan.Ama DC motor ile kurduğumdan Encoder ihtiyaçı doğdu.
Sistemde çift motor var.İnce kauçucuk türü bir malzeme motorlara bağlı rulolara sarılma ve bırkılma işlemleri ile üzerinde ürün taşınacak..
Fakat 2 encoderımdan gelen datayı tek bir PIC16f877 ile okumam gerekiyor.Bunu 20 mhz osilator kullanarak yapacam..Fakat okumada bir hatam var herhalde...Aşağıya kodu veriyorum.YArdımcı olursanız sevinirim...


'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2006 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 23.06.2006                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
DEFINE OSC 20

EPSDEGERI  VAR BYTE
EPSDEGERI = 360
encoder1toplam VAR BYTE
encoder2toplam VAR BYTE

PROGRAM:
    LCDOUT $fe,1,    "   Bant   "
    LCDOUT $fe, $C0, "    yürüsün      "
    HIGH portd.0 ' bantı çekecek motor çalıştırıldı 
    HIGH portd.1 ' bantı salacak motor çalıştırıldı
    GOTO ENCODER1SAY:
    LCDOUT $fe,1,    "   Bant   "
    LCDOUT $fe, $C0, "    taşındı   "
    goto BITIR
   
'****Encoder say alt programı***************************************************
ENCODER1SAY:
    if encoder1=0 then  ENCODER1BAK: ' 1 NOLU ENCODERDAN DATA GELİYORSA GİT
    if encoder2=0 then  ENCODER2BAK: ' 2 NOLU ENCODERDAN DATA GELİYORSA GİT
    IF encoder1toplam=EPSDEGERI AND encoder2toplam=EPSDEGERI THEN ENCODERBITIR:
    goto ENCODER1SAY:
ENCODER1BAK:
    IF encoder1=1 THEN encoder1toplam=encoder1toplam+1
    goto ENCODER1BAK:
    IF encoder1toplam=EPSDEGERI THEN 
    LOW portd.0 
    LOW portd.1
    ENDIF
    goto ENCODER1SAY:
ENCODER2BAK: 
    IF encoder1=1 THEN encoder1toplam=encoder1toplam+1
    goto ENCODER2BAK:
    IF  encoder2toplam=EPSDEGERI THEN   
    LOW portd.2 
    LOW portd.3
    ENDIF
    goto ENCODER1SAY:    
ENCODERBITIR::   
    encoder1toplam=0
    encoder2toplam=0
    reTURN
BITIR:
    end

microcozmoz

ENCODER1SAY: 
    if encoder1=0 then  ENCODER1BAK: ' 1 NOLU ENCODERDAN DATA GELİYORSA GİT 
    if encoder2=0 then  ENCODER2BAK: ' 2 NOLU ENCODERDAN DATA GELİYORSA GİT 
    IF encoder1toplam=EPSDEGERI AND encoder2toplam=EPSDEGERI THEN ENCODERBITIR: 
    goto ENCODER1SAY: 
ENCODER1BAK: 
    IF encoder1=1 THEN encoder1toplam=encoder1toplam+1


Burada anlayamadığım şey encoder1=0 iken ENCODER1BAK'a dallanıyorsun ama ENCODER1BAK döngüsünde sayımı encoder1'in '1' durumundan alıyorsun?

Bana göre iki ayrı sayma döngüsü yapıp hangisi istenen sayma koşulunu sağlıyorsa ona göre işlem yapman..

Yani
ENCODER1SAY:

         IF ENCODER1 = 0 THEN 
         ENCODER1TOPLAM = ENCODER1TOPLAM+1
         ENDIF

ENCODER2SAY:

         IF ENCODER2 = 0 THEN
         ENCODER2TOPLAM = ENCODER2TOPLAM+1
         ENDIF

ENCODERKONTROL:

         IF ENCODER1TOPLAM = EPSDEGERI AND ENCODER2TOPLAM = EPSDEGERI THEN
         ENCODER1TOPLAM=0 
         ENCODER2TOPLAM=0
         ENDIF
         GOTO ENCODER1SAY          
    
"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

Evet, ilk başta bende oyle yaptım.Ama şu var.

Encoderdan data;

01010101010101010....

gibi geliyor.Ben sedece 0 ları sayarsam.1 leri atlarsam.Encoderın donuş hızı da yavaş olup bir dakai okuduğumda tekrar 1 e denk gelebilir.
O zamanda 0 ı okumamış olurum...

Once 0 gelir sonra hemen ardından 1 gelir.Eğer boyle ise encoderdan data almış sayılırım.

Ama yinede yanılıyor olabilirim.

YArdımcı olursanız sevinirim..

microcozmoz

Anladım... gün içerisinde benimde aklıma geldi   :D ...Eğer senin için bir pals tolerans sorun olmayacaksa bence herzaman '0' ları yada '1' leri say ama yok benim için önemli diyorsan onun içinde bir kaç satır kod yazman lazım..

Eğer motora start verildiğinde veya verilmeden önce pals girişi ne ise onun ters değerlerisini saydırma koşulu  olarak yapmalısın..

Şimdilik bu kadar yazabildim..
"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

hasssiyeyet gerçekten onemli.Çünkü 1 PUls likl sapma çemberin merkezinde 1 derecelik sapma yapacak.Buda Yarı çapa bağlı olarak 5 cm lik bir sapma olacak.Bu çok fazla.Zaten normalde bu sapmayı engellemek için bu encoderları kullanmak istiyorum..

Bu bahsettin kodlar konusunda birşetler karalayabilirmisin.Benimkisi tutmuyor valla..

PİC basic veya asm hiç farketmez..

ftsahin

basla:
....
....

if encoder1=1 and ilkencoder1<>encoder1 then
      encoder1toplam=encoder1toplam+1
endif
ilkencoder1=encoder1

....
....
goto basla


Bu kısa kodla hem encoder1'deki değişim hem de encoder1'in 1 olduğu an yakalanır ve toplam 1 artırılır. Encoder1'den gelen  0'ları saymak için  sadece

if enceoder1=1 and ilkencoder1<>encoder1 then

yerine

if enceoder1=0 and ilkencoder1<>encoder1 then

yazmak yetelidir.

Senin yazdığın kodda darbeler kaçabilir çünkü değişim sadece sıçrama anında oluyorsa yakalanır.
Kolay gelsin.

elektroombank

kodu anlayamadım.Amacım 2 encodeerıda okumak.Biraz kodu toparlayabilirseniz benim için sevinirim..

ete

Öncelikle sorayım neden iki encoder var sistemde?. Belirli bir gerekçesi ve yerleştirme mantığı var ise bilmek lazım. Zira, 1. encoderin sıfır olduğu anda 2. encoder de sıfıra denk gelmiş ise birinden birini saymadan atlayacaksın demektir. Çünki programın birini kontrol edebiliyor. Birde sistemin ileri gidip geri geldiğinden bahsediyorsun. Programda geri gelme hareketi kontrol edilmiyor. Acaba önemsizmidir?. Bana göre ileri palsler sayılıyor ise gerilerde ayrıca sayılmalı gibi geliyor. Tabiiki tamamen kullanım mantığına bağlı bir husus. Sİstem hakkında biraz daha açıklama verirsen daha akıllıca bir kod okuma yazılabilir. Aklıma gelen ilk akıl olarak her iki encoderi birer diyot ile PortB.0'a ayrıca bağlasan ve PrtB.0 kesmesinide açsan böylece iki encoderden herhangi biri veya ikiside sıfır olduğunda kesme oluşsa ve sen encoderların esas girişlerini burada kontrol etsen hangisi sıfır ise onu bir artırsan veya her ikiside sıfır ise her ikisinide bir artırsan iki sayımıda kaçırmamış olursun. Bu şekilde sistem teorik olarak doğru çalışır. Ben uygulamasını yapmış idim.

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

elektroombank




Sistem şekildeki gibi.Gri Bant rulolar üzerine sarılarak hareket sağlanmaya çalışılıyor.Yani 1 nolu silindir Bantı salarken, 2 nolu silindir bantı sarıyor.

Bu hareket tam terside olabiliyor.2 Nolu salarken 1 nolu silindir sarabiliyor.Programın yapsına göre değişiyor.Neye programlanmışsa ona göre hareket edecek.Ancak sorun şu;

1 nolu silindirdeki motor 5 tur dönüp bantı saldığında, 2 nulu silindirde tam 5 tur donüp salınan malzemeyi yani bantı sarması gerekiyor.

  Bu işlemin gerçek zamanlı olarak olarak yapılması gerekiyor.Yani önce bir salsın, salma bittikten sonra diğer motor çalışsın ve bantı sarsın şeklinde olmuyor.

Amaç salınan malzemeyi hemen sararak işlemi devam ettirmek.


Normalde motorlar DC Motor

İlk denemede zamanlamalı olarak yapmıştım:)
yani; 1. motor 3 sn çalışsın, 2. motor 3 sn çalışsın aynı mesafeyi alırlar diye tahmin etmiştim.Fakat olmadı..Çünkü Dc motordu.:D

Bu nedenle Encoder kullanma ihtiyacı hissettim..

Çarkları birleştir diyenler de oldu ama böyle bir imkanım yok mekanik olarak.Zaten çarklar birleşirse malzeme yani bant ruloya sarıldığında çap artacağından illaki yine bir bolllaşma olacaktır..

 Halbuki encoder kullanırsa PIC yazılımında bu Çapın kalınlaşmasını hesaba katarak motorları gerektiği kadar oynatılmasını sağlayabilirm.

Amaç;;;

1. ve 2. Motor çalışır.

1. ve 2. Encoder çalışır.Ve motoların Kaç tur attığını saymaya başlar

Sonuçta 2 motorda aynı turu atacaktır.Dolayısı ie 1. ve 2 encoderdan gelen pulsler eşit ve istenilen değere geldiğinde motorlar durduralacaktır.

Aynı şekilde motorlar bu işlemlemden sondara programın yapısına göre ters olarak 10 turda dönebilir.Yine encoderlar saymaya başlar.Tur sayıları istenilen değere geldim motorlar durdururlur.


RB0 Kesmesi kullanmamak isteme nedenim;

Program belirli işlemleri olmuyan bir program.Admin böülümden PIC bazı emirler veriyor..
yani kendi programı kendin oluşturabiliyorsun;

Bekle
3 Tur geri git
5 tur ileri git
bekle
2 tur iler
yarınm tur geri
...

İşte bu şekilde admin bölümünden bu programı değiştirebiliyorsun.
dolayisı ile Encoder işlemler Alt Program olarak yapılması gerekiyor.

Bir diğer handikap Mekanik sistemde dili çark koruması yok.Yani sistemde dışarıdan banta hafif bir etki yapıldığında Hemen alt program gider ve encoder saymaya başlar.ve programın dışına çıkıp sapıtmış olur..


Tüm bu saydığım nedenlerden dolayı 2 ENCODERI, RB0 kesmesi olmadan PIC16f877 ile 20 mhz osilator kullanarak kurmak istedim..

Hatalarım olabilir.Belkide yanlış bir seçim yapmışımdır.Yardımcı olursanız sevinirim.

microcozmoz

Değişkenlerinin arasına iki adet bit tipinde değişken oluşturur isek;

         ENC1STAT VAR BIT
          ENC2STAT VAR BIT


Ve Programın ilk satırlarına

          if encoder1 = 1 then
           enc1stat = 0 
           else
           enc1stat = 1
           endif
           if encoder2 = 1 then
           enc2stat = 0
           else
           enc2stat = 1
           endif


bu kodları eklersek sistem ilk açıldığında yani daha motorlar çalışmadan encoderlerin o andaki durumu algılanıp varolan durumun tersini sayma palsi olarak algılatabilirsin
Sayma işleminide şu şekilde yapabilirsin;

        ENCODER1SAY: 

         IF ENCODER1 = ENC1STAT THEN 
         ENCODER1TOPLAM = ENCODER1TOPLAM+1 
         ENDIF 

         ENCODER2SAY: 

         IF ENCODER2 = ENC2STAT THEN 
         ENCODER2TOPLAM = ENCODER2TOPLAM+1 
         ENDIF


Şimdi burda dikkat edilmesi gereken nokta ;
motorlara ilk hareketi verdin ve sonra motorları bahsettiğin gibi geri döndürmek istiyorsun bana göre motorlar geri dönmeden yine encoder durumlarının algılamalısın. Çünkü motoru sen nekadar hemen durdurabiliyorum desende sistemdeki ataletten veya başka sebeplerden dolayı encoder durumu değişebilir.

Şimdilik bu kadar..  :D

Umarım bir faydası dokunur
"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

Bir proteus devresi kurdum.Bu devrede PULS gonderebiliyorum.YAni bir nevi encoderları simule etmek istedim.Ki PULS sayıcı devremde PULS kaçırıp kaçırmadığımı anlayayım.

Aynı şekilde PULS alma içinde basit bir devre yapacğım hemen.Verdiğiniz kodları düzenleyip deneyeceğim.Burayada göndereceğim.

Son yazıyı doğru anlamışmıyım ?

Motorlar çalıştı 3 tur donduler.Encoder sayısı istenilen değere ulaştı ve sistem durdu.Tekrar motorlara iki tur at dediğimde Encoderların 0 damı yoksa 1 demi olduğunu anlamamımı söylüyorsunuz.

Ama zaten  Encoder ı PULUP balğlamıyacakmıyım...

Karıştı biraz ama devre eklersem daha açık olacak.

Biraz sonra devreyi çizeceğim.Göndereceğim.

Saygılar..

ete

Encoder simulasyonu için aşağıdaki devreyi kullanabilirsiniz. Hatta geri dönüş simulasyonu bile yapabilirsiniz. Çift encoder için bundan iki adet yapmanız gerekir.



Tabiiki pals hızı clock frekansı ile ayarlanacaktır. Yön değiştirme swiç ile yapılmaktadır. Devrede iki adet çıkış görmektesiniz bunun bir A diğeride B çıkışıdır. Standart C çıkışı çok gerekli olmadığından kullanılmamıştır. Yön bulak için A ile B arasındaki faz farkından yararlanılır. Bir osiloskop bağlayıp baktığınızda faz farkını görebilirsiniz.

Normal olarak encoder girişlerinde pull-up kullanılmaz. Kendi devresi bunu zaten yapar. Kullanacağınız pull up veya pull down yanlış okumalara sebep olabilir.

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

elektroombank

abim amma hızlı yetiştin bende tam devreyi ekliyordum..Ama dur yinede ekleyeyim hata gözükmüş olsun...

elektroombank

Bahsettiğim encoder okuma ve gonderme devresini buradan çıkarabildiğim kodlarla yazarak deneme çalıştım.Ama olmadı gibi..

Devreyi Buradan indirebilirsiniz..

PİC BAsic Kodlarını yaninda..

yardımlarınız bekliyorum..

elektroombank

@ete abim o devredeki elemanlar nelerdir.Bulamadım.yada indirebileceğim bir yer varmı..