Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

Puls almadaki hatam..

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

microcozmoz

Sevgili ete nin eklediği eleman proteus active library isi içinde bulunan DTFF yani D tipi filip flop..

Herneyse sen verdiğim kodlar üzerinden yola çıkarak bir şeyler karalayıp denedinmi devreni?

Senin verdiğin cevaba göre bir çözüm üretebiliriz..
"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 gonderdiğim dosya senin kodların gibi.Ama bir türlü olmadı galiba..
Bir yerlerde hata yapıyorum..

microcozmoz

Alıntı yapılan: "elektroombank"evet gonderdiğim dosya senin kodların gibi.Ama bir türlü olmadı galiba..
Cümlendeki galiba kısmını biraz açarmısın..devrede gerçekleşmeyen olay nedir?? Devreni ilk başta tek encoder sayacak şekilde çalıştırıp daha sonra ikinci encoderi eklemeyi denedinmi?
"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

birde biraz önce bir sitede Encoderlı DC Motor Library si buldum galiba..

Bir bakarmınız benim simulasyonda bunu kullanabilirmiyim..

Library buradan indirebilirsiniz

elektroombank

okumayı atlıyor.Tek bir PULS alınca tüm PULS alınmış gibi işlem yapıyor..

ete

Devredeki elemanlar;
1 adet Clock üreteci.
1 adet 4013 (D tipi Filip Flop)
2 adet switch çift sıra
1 adet logic probe (çıkışın low yoksa high mı olduğunu görmek için.

Hepsi bu kadar.

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

elektroombank

Elamanlar tama  bu şekildede denedim.Fakat olmadı..Bir yerlerde hatam var..

Denediğim devreyi buradan indirebilirsiniz...

ete

Encoder çizimin çalışıyor. Dİğer kısmı çıkartıp sırf encoderi çalıştırdım. Baktım çalışıyor. Yalnızca clock frekansı çok düşük. Normalde bu kadar düşük olmaz sanırım. Bu frekansı enz 20-30 HZ dolayında ayarla.
Çalışmaması senin diğer sisteminde veya programında bir sorun olmalı.
O kısma henüz bakmadım.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

elektroombank

İşte dediğim gibi PİC basic kismında bir yerlerde sorunum var.

Ama çözemiyorum.Dediğiniz gib yaptım.Ama beceremedim..

elektroombank

Okuma sadece tekli olarak deniyorum. ENcStat ile encoderın durumun algılıyorum.ve dediğiniz gibi sayma kodları ile denedim.Devre ve kodlar 2 mesaj üstte.Aynen ordaki gibi yaptım.ama yine okumuyor..

mesmert

encoder yerine omronun aşağıda çizdiğim bir ürünü war NPN ve PNP olarak çıkış veriyor sistemin kafalarına birer küçük dişli takarak moturun devirin ölçüp istediğin adım da durdurabilirsin dişli ne kadar küçük olursa o kadar hasas iş olur

ete

@Elektroombank,

Yazmış olduğun program parçasından bu işte çok eksik olduğunu anlıyorum.
Programda gerçekten çok fazla hata var. Tabiiki ana mantığı çok iyi çözümleyemedim ama programı istediğin hale getirdim.
aşağıda veriyorum. Etiket ve değişken isimlerini çok uzun kullanma. İnsan yazarken bıkıyor.

ADCON1 = 7                ' tüm portlar dijital yapılıyor
'-------------------------------------------------------------------------------
TrisD=%00100000
SYMBOL ENCODERA=PORTD.5 ' Encoder 1 buraya bağlı 

TOPLAMPULS VAR BYTE 
TOPLAMPULS = 30

ENC1STAT VAR BIT 
ENC2STAT VAR BIT


ENC1TOPLAM VAR BYTE 

BASLA:
'-------------------------------------   
     PAUSE 500
     ENC1TOPLAM=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
     ENC1TOPLAM=0
     LCDOUT $fe,1,    "    2. tur    "
     LCDOUT $fe, $C0, "   BASLASIN   "
     PAUSE 5000
     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
     ENC1TOPLAM=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:
           while ENCODERA = 1 
           wend
           ENC1TOPLAM = ENC1TOPLAM + 1
           while encodera=0
           wend
           lcdout $fe,$c0,"encoder1=",# ENC1TOPLAM ,"   "
         IF ENC1TOPLAM = TOPLAMPULS THEN RETURN
         
              ' Puls sayısı istene değerde ise ana programma don
         GOTO ENCSAY 

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

ete

BU başlıkta yazdıklarına şöyle bir baktım yeniden.
Önceki kodalrda yapılan hata şu encoder belirli bir noktada kalır ise örneğin sıfır konumunda kaldı ve çıkış sürekli sıfır veriyor. Bu durumda encoder sürekli sayar. Halbuki encoder çıkışını bir pals çıkışı gibi düşünüp hem low konumunu hemde high konumunu aşmanız ve bunlardan birirnde de sayma yapmanız gerekir. Böylece encoder bir konumda durmuş olsa bile sayma yapmayacaktır. Yukarıdaki program bu işlemi yapıyor. Biraz geliştirirsen işini görebilir.
İllaki iki encoder kullanman gerekiyor ise mutlaka ikisinide aynı anda kontrol etmen gerekir. Yoksa birinden mutlaka pals kaçırırsın.
Yine tekrarlıyorum. Bu işin en doğru yolu kesme kullanmaktır. Hatta RB0 kesmesi yerine PortB (RB4-RB7) kesmesi kullanırsan işin biraz daha kolay olur. O dediğin adminden programlama işini kesinlikle kesme aksatmaz.

Birde şu hususa dikket etmeni öneririm. Ortada sarılan ve bırakılan bir bant var ise bu bantın kalınlığına bağlı olarak her iki silindirin dolayısıyla motorların tur adetleri aynı olmayabilir. Sarma konumundaki silindir çapı büyüyeceği için boşaltma silindirine oranla daha az tur atacaktır. Ancak bu husus ihmal edilir seviyede ise önemli değil. Birde bandın sarkma ve gerilme durumunu kontrol ederek yapmayı denesen. Alta ve üste iki fotosel veya proximity swich koysan bunlarla işi kontrol edebilirsin. Bant sarkmış ise sarma motorunu hızlandır, gerilmiş ise sarma motorunu yavaşlat gibi emirler vererek işi kotarabilirsin sanırım. Verdiğim bir akıl sadece işe yararsa kullanabilirisin.

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

elektroombank

---

Önceki kodalrda yapılan hata şu encoder belirli bir noktada kalır ise örneğin sıfır konumunda kaldı ve çıkış sürekli sıfır veriyor. Bu durumda encoder sürekli sayar. Halbuki encoder çıkışını bir pals çıkışı gibi düşünüp hem low konumunu hemde high konumunu aşmanız ve bunlardan birirnde de sayma yapmanız gerekir

----

Evet.Haklısın zaten bu durum beni çok karıştırıyordu.İlk örneklerimde o şekilde denemiştim ama yinede hatam varmış.Olsun öğrenmiş olduk hatalar ile beraber.Kodları aldım.Optik Senssor filan gerçekten çok zor.
Yani dış ortamda filan bulunacağından.Birde bu bat malzeme değişeceğinden böyle bir durum pekte olanaklı değil.

Verdiğin örneği ÇİFt encoder halien getirmeyi deneyip Önce RB0= ile deneyeceğim.Dediğin gibi programı etkileme hikaesi olmazza kesme kullanırım.

Bu kesme kuıllanmadaki mantığım ne olmalı?

elektroombank

Yeni devreyi Buradan indirebilirsiniz..

yeni verdiğiniz gibi kodları denedim.İki Encoder oluşturdum.1 tur saymasını yapıyor.ancak 2 tur saymasında Encoder A =1 deyip kalma yapıyor.

Halbki alt program donüşünde Tüm Encoder Topla değikenlerini sıfırlıyorum.

 Birde bu while döngüsünde Bekleme yapıyormu.Yani bir encoderı 50 Khz yaptım.diğerini 10 Khz.fakat okumada bariz bir fark olması gerekirken olmadı.
Buda bende While da bekleme yaptığı düşüncesi uyandırdı.?

Bekleme olsa bile 2 turda neden takıldı? Toplam değerler 0 olduğu halde..