PIC18f452 CCS C İle Devremde 4 Adet Encoder Okuma

Başlatan stronger_ht, 25 Kasım 2010, 15:48:12

iyildirim

@stronger_ht

Anlayabildiğim;
Mekanik olarak türbin 1 tur yada biraz daha az dönebiliyor. Önerdiğim eğer mümkünse, mekanik olarak kilitleyen bir engel yok ise, türbinin kontrolünün tamamen onu onu kontrol eden motorla yapılması ve başkaca bir mekanik engel (kablo boyunu uzatmak dışında) yok ise türbinin 2 tur yani toplam 720 derece dönebilmesine izin verilmesi.

Alıntı yapılan: stronger_ht - 26 Kasım 2010, 18:32:21
iyildirim, 2 turlu pot dediğin 2 tur atınca sonuna dayanıyor değil mi?
Eğer öyleyse o işimi görmüyor, sonsuz tura ihtiyacım var, bunu motor miline bağlayacağım için, motor o an belki 10 tur atacak belki 5 tur. Belki de daha fazla, bu yüzden sonsuz tur özelliğine sahip olması benim sorunumu büyük ölçüde çözecek.

Benim bahsettiğim 2 veya çok turlu pot derken; bunun  redüktörlü motorun,  motor tarafına değil, redüktor yani türbin tarafına takılacağıdır. Sonuç ta dönme hareketinin motordan veya türbinden okunmasının tek farkı sizin programızında yapacağınız değişikliktir. Zaten anladığım kadarı ile turbin en fazla 1 veya 2 tur luk bir dönme hareketi gerçekleştirebiliyor.

Rüzgar gülü konusunda da bilinmesi gereken rüzgar gülünün dairesel olarak sonsuz bir dönme yeteneğinin olup olmadığı.
Sonsuz dönme yeteneğinin olduğu durumda kullanılabilecek sensörler;
-- 1 turlu kilitlemesiz, 360 dereceye oldukça yakın ölçme aralığı olan bir pot.
-- Manyetik mıknatıs sensörü
-- Manyetik pusula sensörü
-- Bulunulan dairesel pozisyonu yeterince hassa okuyabilecek çok kanallı optik enkoder
-- Çözünürlüğü yetiyorsa aldığınız enkoder veya daha hassas olan bir model

Burada önemli olan nokta sisteme enerji verildiğinde sistemin kendini nasıl kalibre edebileceği. Bunu da türbin ve rüzgar gülü için ayırmak gerekli.
Türbin için mantıklı görünen direkt olarak türbine bağlı çok turlu bir pot. Bu şekil de ilk enerji verildiğine pottan alınan gerilimden direkt olarak (360 veya 720 derece yada her neyse) dairesel serbestlik derecenizin neresinde olduğunuzu anlayabilirsiniz.  Rüzgar yönünün değişmesi durumunda da sadece pottan hedeflediğiniz gerilimi alana kadar motora enerji vermek yeterli olacaktır. Adeta Çok turlu olan model servoları gibi. (Model teknelerdeki halat çekme servoları)

Rüzgar gülü için pot, manyetik pusula-sensör,  yada yeterince çok kanalllı bir optik enkoder kullanıyorsanız rüzgar gülünden de pozisyonunu direkt olarak okuyabilirsiniz. Bu durumda pozisyon bilgisi direkt olarak elde edilebilir.
Eğer rüzgar gülünde kullandığınız sensor size pozisyon-açı belirtmiyor, sadece darbe üreten cinsden bir sensör ise; bu durumda rüzgar gülünün üzerinde en azından index kanalı da olabilen bir enkoder olmalı ve uygulamanız rüzgar gülünü bir motorla hareket ettirip başlangıç pozisyonu yada sıfır dereceyi bulduktan sonra enkoder darbelerini saymaya başlamalı. Bu durumda rüzgar gülü, rüzgara rağmen rüzgar gülünü döndürebilecek kadar güçlü ve rahat hareket edebilecek küçük bir motora bağlanmalı.

Bundan sonrası tamamen yazılıma kalıyor ki yazılımda oldukça rahat bir şekilde modellenebilir, gerçekleştirilebilir olarak görünüyor.

Seçeneklerin çok fazla ve belirsiz olmasının nedeni mekanik sistem ile iligli bağlayıcı şartların ve tercihlerinizin tam olarak bilinmemesi ve biraz da maliyet gibi sınırlandırıcılarla ilgili belirsizlik.
Özellikle mekanik sistem ile ilgili olarak düşüncelerinizi, tercihlerinizi belirtirseniz konu daha anlaşılır olacak.




KAZIMUGUR


stronger_ht

Arkadaşlar dün sipariş ettiğim minik rotary encoder lar geldi. Oldukça kullanışlı bir ürüne benziyor. Bu ürün anladığım kadarıyla sadece darbe bilgisi veriyor ve üzerinde bir de button özelliği var.
Benimse düşündüğüm olay şudur.
Bu minik encoderin birini rüzgar gülüne, diğerini gövdeyi hareket ettiren motora bağlayacağım.
Diyelim rüzgar şuan sabit esiyor ve herşey normal, sonrasında rüzgar sağdan esmeye bağladı, rüzgar gülü hareket etti ve ben hareket esnasındaki darbe sayısını ve yönünü belirledim programda.
Sonrasında elde ettiğim değerler türbin gövdesinin dönüş açı sınırını geçiyorsa, 360 derece'den, rüzgar gülünden aldığım darbe sayısını da orantıyla hesaplatarak ve iki değeri birbirinden çıkartıp gövde motorunu ters yöne çevireceğim. Böylelikle biraz da dene yanıl yöntemi ile rüzgar gülünün belirttiği noktaya gövde dönmüş olacak. Şuan tam anlatamadım ama, denedikten sonra mantıklı bir açıklama yapacağım.

Eğer sorunu bu ürünle çözemez isem, türbinin mekaniksel aksağanını burada görsel anlatırım, ona göre en matıklı sonucu tartışırız.

stronger_ht

Kafayı yemek üzereyim, bugün çok uğraştım bu devreyle beynim durdu.

Arkadaşlar, enkoder'den pulse sayıp değişkene atıyorum. B4...B7 kesmesi kullanarak sayıyorum. Yön tayini de yapabiliyorum.
Eski ve yeni değer bilgisi tutamıyorum. Yapmak istediğim şu.
2 değişkenim var, diyelim isimleri eski ve yeni olsun.
Yeni değişkeni kesmede eğer b4==1 se yeni değişkenini bir artıyor. Ancak encoder durduğu zaman, yani motor dönmediği zaman tur atlamadığı zaman yeni değişkeninin değerini eski değişkenine atmayı istiyorum ki işlem yaparken iki değeri çıkarıp ne kadar turluk işlem yapmasını belirlemem gerekiyor.

Bu olay CCS C'de nasıl oluyor?  :-\

yucelcem

2 tane değişken daha tanımlayıp birine yeni değişkeninin değerini atıp, birine de farkın sonucunu atsanız?

stronger_ht

#50
Tam olarak anlayamacım yucelcem :)
Bir örnek yazabilir misin?

#int_rb
void rb_kesmesi()
{
   govde_enk_eski=govde_enk;
   if (input(pin_b4))
   {
      if (input(pin_b1))
      {
         govdeyon=1;
      }
      else
      {
         govdeyon=0;
      }
      govde_enk++;
   }
}

yucelcem

ben hiç c bilmem, aslında sorunuzu da tam anladığımı söyleyemem, anladığım kadarıyla sorununuz, eski sayısına yeni sayısını atamak istiyosunuz, çıkarma işlemi yapıcaksınız ama eski sayısının kaybolmasını istemiyosunuz, ben de dedim ki eski değerinin yerine bir değişken seçin onu çıkarma işleminde kullanın diğeri değişmeden kalsın, sonra da fark değerini başka bir değişkene atın

stronger_ht

Hocam ben kısacası encoderin şuan dönüp dönmediğini algılamak istiyorum. Burayı çözersem ilerleyebileceğim :)

frkcn

#53
Ben soruyu şöyle anladım encoderden bilgi geliyor

kesme meydana geliyor pin.b4=1 oluyor

yeni++ oluyor
pin.b4=0 olduğunda ""yeni"" değişkeninin değerini ""eski"" ye kaydetmek istiyorsun ???? doğru mu anlamışım ?

#int_rb
void rb_kesmesi()
{
   govde_enk_eski=govde_enk;
   if (input(pin_b4))
   {
      if (input(pin_b1))
      {
         govdeyon=1;
      }
      else
      {
         govdeyon=0;
      }
      govde_enk++;
   }
}


işallah doğru anlayıp saçma bir cevap yazmadım :|
Bugün ömrümün geride kalan son günü...

yucelcem

bence soruyu daha açıklayıcı şekilde yazarsanız daha açıklayıcı cevap alabilirsiniz

iyildirim

#55
A ve B kanalları hangi pinlere bağlı ve kesme hangi pin değiştiğinde oluşuyor bilmek lazım.

Edit
Eğer bu enkoder standart bir AB kanallı enkoder gibi davranıyorsa datasheette CW ve CCW yönleri için gösterilen şemadaki kesikli dikey çizgiler 4 turu ifade ediyor demektir.
Bu şekilde ise yukarıdaki kod ile yönü algılamak mümkün değil.
Zaten enkoderin alındığı sitedeki örnek arduino kodunda da böyle olduğu görülüyor.
Bu durumda yön algılama kesme ile yapılacaksa kesme her iki kanalın hem yükselen hemde düşen kenarlarında oluşmalı.

stronger_ht

Şöyle arkadaşlar,
Şimdi ben devremde 4 ayrı bu minik encoder'lardan kullanacağım. Dolayısı ile B4....B7 kesmesini kullanmak istedim.
Encoderlar'da A ve B çıkışları mevtur. İnternette araştırdığım kadarıyla da temelde encoder gibi çalışmakta. Yani yön bilgisi alabiliyorum diye biliyorum ama o çok çok önemli bir olay değil.
Benim istediğim şudur.
Rüzgar gülüne bağlı olan encoder harekete başladığında yeni isimli değişken değer artırmaya başlayacak. Rüzgar gülündeki hareketlenme durduğunda ise yeni isimli değişkenin değeri, eski isimli değişkene aktarılacak.
Buradaki aktarma işlemini yapamıyorum işte. İki değişken değerleri de aynı esnada artıyor.

frkcn

#int_rb
void rb_kesmesi()
{
   govde_enk_eski=govde_enk;
.
.
.

//  sorun burda olabilirmi ? kesme her gerçekleştiğinde sen zaten enkoder değerini eski enkoder değerine atıyorsun. ikisinin de aynı orantıda artması normal değilmi..
Bugün ömrümün geride kalan son günü...

stronger_ht

Orayı kaldırarak da denedim. Yani sizce atamalar hangi aşamada olmalı.
Yani kısaca özetleyecek olursam, B4....B7 kesmesini kullanarak bilgi okuduğum encoder'in en son değerini bir başka değişkene, yeni değerini de bir başka değişkene almak istiyorum.
Encoder bilgi gönderme işlemini kestiğinde ise son değeri yine eski değişkenine aktarmak istiyorum. Bu aktarım işlemini nerede yapacağımı kestiremiyorum.

iyildirim

stronger_ht

aklından ne geçiyor anlamadım.

Alıntı yapılan: stronger_ht - 29 Kasım 2010, 10:26:56
Encoderlar'da A ve B çıkışları mevtur. İnternette araştırdığım kadarıyla da temelde encoder gibi çalışmakta. Yani yön bilgisi alabiliyorum diye biliyorum ama o çok çok önemli bir olay değil.
Burada yön bilgisi neden önemli değil. sonuçta kullanıdığın enkoder sana sadece darbeler üretiyor. yön bilgisi olmadığında sadece saat yönünde veya tersi yönde ilerleme olmazmı?

Alıntı yapılan: stronger_ht - 29 Kasım 2010, 10:26:56
Rüzgar gülündeki hareketlenme durduğunda ise yeni isimli değişkenin değeri, eski isimli değişkene aktarılacak.

Bu işi kesmelerle yapıyorsan Rüzgar gülündeki hareket durduğunda yani darbeler gelmiyorken nasıl kesme üretilecek, veya kesme dışında bu işi yapmak istesen zaten eski yeni değişkenlerinin içerikleri aynı olmayacakmı.

Eski - yeni değişken yerine tek bir değişken üzerinde bilgini tutsan , yöne de bağlı olarak bu değişkenin değerini arttıp azaltarak açı bilgisini elde ediyor olsan, bunda ki sorun nedir. 

Ayrıca verdiğin kod örneği elindeki endoder'i okumak için yeterli değil. Ürünün sitesindeki kodları incelemeni öneririm.
http://www.sparkfun.com/datasheets/Components/RotaryEncoder.pde