Hi-Tech ile encoder okuma, kod mantığı.

pic_loader

Üye
Katılım
13 Eki 2009
Mesajlar
42
Puanları
1
Selamlar.

Arkadaşlar aşağıda görülen sistem benim bitirme ödevim olmakta.


Bunun gibi bir sistemi kurup çalıştırmam lazım yoksa diploma yok bize :)

Sistemi kısaca anlatmaya çalışayım.

Görüldüğü gibi hareketlerini encoder ile takip etmeye çalışacağım bir kol var, bu kol engel1 ve engel2 ile gösterilen aralıkta hareket edebiliyor, toplam hareket açısı 90 derece.

Kolun ucunda daima dik duran bir paçaya motor ekli ve bu motorda bir pervaneyi çevirmekte. Bu pervane dönmeye başladığında oluşacak kuvvetle kol yukarıya kalkacak. Şimdi benden istenen sabit yada girilecek bir değere göre bu kolu hareket ettirip istenen konumda stabil durmasını sağlamak.

Sizlerden istediğim beni doğru yönlendirmenizle bu ödevi başarmak :)

Mesela nasıl bir encoder kullanmalıyım bu ödev için?

Absolute mi incrementer bir encoder mi?

Sonraki aşama yazacağım kodla ilgili.

Kullanacağım pic 16f877 olacak kodlama için hi-tech dili bana önerildi.

Şimdi çeşitli yazılım dillerine aşinalığım olsada pic programlama deneyimi olmayan bir kardeşinizim.

Düşündüm ve şöyle bir mantık geliştirdim.

Burada yapmak gereken sanıyorum motora verilecek voltaja göre encoderden gelecek veriyi okumak, istenen düzeye gelindiğinde voltajı düşürmek ve bir fonksiyon yada döngü içinde istenen konumu yakalayana kadar voltajı artırmak yada eksiltmek.

Bu mantık sağlıklı mı?

Üçüncü bir nokta encoderden gelen veriyi okuma anlama.

Şimdi tam bir dönümde 3600 pals üreten bir encoder kullanacağımı varsayarsak ben 900 palslik bir aralıkta çalışacak kod yazmalıyım.

Nette çeşitli kod örnekleri buldum, bunlar daha çok picbasic ile ilgiliydi.

Kod:
degisken=PORTA & %00000011

Mesela bu kodda degisken'e encoder bilgisi alınmış, sanıyorum encoder Porta'ya bağlı olmalı ancak burada hangi bacağa bağlı ve %00000011 ifadesi tam olarak ne anlama geliyor anlayamadım.

16'lık düzende bu 3'e tekabül ediyor yoksa bu ifade porta'nun üçüncü bacağını oku mu demek?

Kodu hi-tech ile yazacağımı söylemiştim bu dille ilgili bulduğum tek kaynak Fırat Deveci'ye ait ve malesef orada da encoder'den bilgi okuma yok.

Şimdilik bu noktalarda yardımınıza ihtiyacım var, beni doğru sonuca ulaşacak şekilde yönlendireceğinize inanıyor ve şimdiden teşekkür ediyorum.
 
Hocam ögrenci oldugun için bir adet delta plc üzerin hız sayıcısı var bir adet rotary encoder 360 plus alırsı alırsı 360 derece olmuş olur plc içindeki eşittir kapıların kullanar kolayca hallede bilisi .MİKRO İŞLEMCİLER ÇOK BİR SEYLER BİLMİYORUM
 
Hocam ögrenci oldugun için bir adet delta plc üzerin hız sayıcısı var bir adet rotary encoder 360 plus alırsı alırsı 360 derece olmuş olur plc içindeki eşittir kapıların kullanar kolayca hallede bilisi .MİKRO İŞLEMCİLER ÇOK BİR SEYLER BİLMİYORUM

servo05 hocam yanıtınız için teşekkür ediyorum.

İnşallah dediğiniz gibi kolayca halledebilirim ancak nedense bana hiç öyle gelmiyor :)

Doğrusu bir süredir üzerinde düşünüyorum bu projenin ancak hala rotamı belirleyemedim.

Pwm meselesini iyice anlamam lazım ancak dökümanlarda çok teknik bilgiler var ve Elektronik bilgisi istiyor.

Kafama takılan bir başka mesele kodu nasıl test edebileceğim mesela proteus gibi bir araçla burada yapmak istediğimi simüle edebilir miyim?

Pervanenin kaç voltta kolu ne kadar yukarıya çekeceğini ve dolayısıyla encoderden kaç puls okunacağını bilmeden sağlıklı bir test nasıl yapılabilirki?

Anlayacağınız biraz karamsarım.
 
Arkadaşım şöyle bir şey olurmu acabao kol iki engel arasında hareket ediyor ve belkide bağlı olduğu diski dönderiyor sen o kolun yukarı veya aşağı hareketinden faydalanarak bir çok turlu hassas bir pot yerleştirsen sisteme yani kol yukarı hareket ettiğinde potun orta ucunun konumu değişecek dolayısıylada gnd ile orta uç arasındaki gerilim farkıda değişir şimdi bir tanede referans değerini gireceğin potun olsun bu pota değeri elinle girecen yani bir referans potun olacak birde geribesleme potun geribeslemeden gelen bilgi kolun hareketine göre dolayısıylada encoder'ın hızına göre değişecek ( yani diyelim motor hızı artı kol yukarı çekti dolayısıyada potun orta ucuda +v'ye yaklaştı yani hızla birlikte potun orta ucundaki gerilimde arttı yada kol aşağı indi potun orta ucu gnd'ye yaklaştı dolayısıyla porun orta ucana düşen gerilim azaldı) referans sinyali picde okudun sayısala çevirdin geribesleme sinyalini okudun sayısala çevirdin ve bir hata sinyali buldun (error=referans-geribeslemepotu) burdan ne çıkar biliyormusun çok güzel bir "pid" denetim sistemi çıkar bence sen biraz bu pid nedir ne değildir diye biraz bak bu hata sinyalinide pid denkleminde yerine koydunmu ve pid denkleminin sonucunuda pwm'in duty saykılı olarak ayarlaysın bu pwm sinyali ilede motoru sürersin yani sen şu konuyu araştır bence "pid ile dc motor hız kontrolü" gerçekleştirebilirsen ama şuda var eğer bu pid ile hiç uğraşmayım dersen çünkü biraz sıkıntılı bir şey
aynen şöyle yap referans potunu ve geribesleme potunu öyle ayarlaki örneğin her ikisini değeride 0-5v arasında değişsin atıyorum referans potundan 2.4 volt okudun sayısallaştırdın şimdi dc motoru
pwm ile sür pwm'in çözünürlüğünüde 1024 yap 2.4 voltu bulanan kadar pwm'in duty saykılını artır ve eşitlediğinde iş tamamdır devamlı kontrol edersin her iki pottaki gerilim seviyesini ona göre pwm'i artır veya azalt bir tablo bile çıkarabilirsin ve sonra bunu set değerine daha kolay erişmek için kullanırsın ama pid ile yapabilirsen pid bu işlemleri kendi yapar yani sen bir set değeri girersin oda sistemi bu set değerine oturtur ama biaraz uğraştırır bunu sonradan düzeltim çükü ben bu aralar pi ile dc motor hız kontrolü yapmaya çalışıyorum dediğim gibi bu şekildede yapabilirsin pid'e hiç girmeden.
çok güzel olur.
kolay gelsin
 
Son düzenleme:
SALIH-46 hocam, bırak "pid" konusunu benim hiç pic programlama tecrübem yok.

Bu alanda tek yaptığım picbasicpro diye bir kitap alıp okumak oldu.

Baktım o dil biraz demode ve yetersiz kalıyor araştırdığımda hi-tech ile tanıştım.

Şimdi yaptığınız tarifi acaba doğru mu anladım.

Referans portu ile kastettiğiniz pice gelecek akım, bunu sayısala çevirip pwm sinyali üret ve motoru sür diyorsunuz doğru mu anladım sizi?

Şimdi doğrusu pwm bilgim de yok, ancak okumalarım sonucu asıl yapmam gerekenin bunu öğrenmek olduğunu az çok kestirdim :)

Fırat Deveci'nin pdf'sinde konu ile ilgili kısmı dikkatle okudum.

Kafamda bazı şeyler oluştu ama net değil.

Benim yapmam gereken şu hocam, pervane döndüğünde kolu yukarıya kaldıracak ya, sürekli encoderi okuyup istenen konuma geldik mi bunu öğreneceğim.

Diyelim istenen konuma geldik, motoru durdursak kol aşağı düşer, kolu sabitleyen bir şey yok çünkü.

O yüzden bu sefer bir döngü içinde kolu salınmaya bırakacağım.

Mesela diyelim 300 pulse yukarı git dedik, 300 pulse sayıldığında azalt diye bir fonksiyona gidilecek, burada pervane motoruna giden voltajı düşürerek pervanenin dönüş hızını düşürmeliyim, böylece kol ya inişe geçecek yada yükselme hızı düşecek.

İşte böylece bir ileri bir geri 300 pulse yakalamaya çalışacağız, tabi absolute encoder kullansak bunlara gerek kalmaz.

İşte burada pwm'i bu şekilde nasıl kullanabilirim ve bunu yapmak için elimdeki pdf'yi yeterli mi?

İki gündür okuyorum hocam, şu voltaj ayarlamasını nasıl yapacağımı bir bulsam, encoderin iki bakacağını daima okuyarak voltajı ya artırıp ya düşürüp bu işi yapabilirim diye düşünüyorum.

Belki siz tamda bana bunu anlattınız ancak ben terminolojiyede yabancıyım mazur görün :)

Yönlendirici tavsiyelerinize ihtiyacım var lütfen esirgemeyin.
 
Arkadaşım eğer pic ile fazla uygulama yapmadı isen bence hi-tech c'ye girme
bunu picbasic ilede çok rahat yaparsın ve pibasic de kolay çözersin zorlanmadan yapman gereken bece pic'in adcsi, pwm ve birde timer1'i sayıcı olarak kullan bunlarala ilgili uygulama yap encoder'ın puls sinyali çıkışını doğrudan timer1'i saydıkmak için kullan bunun içinde timer1 i sayıcı olarak kurman gerek yani yapacaklarını şöyle sıralayalı;
-o kolun değişimine göre değişecek bir çok turlu potu mekanik sisteme eklemelisin bu potun orta ucunu bir adc kanalına götür ve sayısallaştır burdan aldığın değere Vg diyelim
-diğer potun referans için kart üstünde veya board üstünde bununda orta ucunuda bir adc kanalına götür ve sayısallaştır bunada Vr diyelim
-şimdi diyelim el ile bir değer girildi bu değeri yani Vr'yi okudun Vg ile karşılaştırdın Vr>Vg ise pwm'i(pwm'in çözünürlüğü 877a için 10 bittir sen buna bir 16bitlik integer tanımlarsın bunada Vpwm diyelim) yani Vpwm'i artır ve bu aradada devamlı Vr ile Vg'yi okuyup karşılaştırmalısın Vr=Vg olduğunda Vpwm
'i artırmassın olduğu yerde kalır eğer denge bozulursa bu döngü Vpwm'i artırır veya azaltır aralrdada şunu yaparsın belli peryotlarda encoder'ı yani timer1 sayıcısının içeriğini oku(okuma işleminde sonra ise timer1!i sıfırla) ve Lcd ekrana aktar ama dediğim gibi bu encoder okuma işlemini aynı peryotlarda yapki sonuç doğru olsun

ve arkadaşım eğer pic bilgin iyi değilse dediğm gibi adc, pwm, timerların zamanlayıcı sayıcı olarak kullanılması üzerine uygulamalar yap ve geliştir
bunun içinde bence başlangı olarak picbasic pro dan başla onu yada ccs c de olabailir çünkü bunların çoğu şeyde hazır kütüphanesi var ama hi-tech de böyle hazır fonksiyonlar yok herşeyi senin yapman gerek aslında asıl ve güzel olan hi-tech ama senin durumun için bence picbasicden bu işi halletmeye bak biraz üzerine düşer ve u8ygulama yaparsan halledersin
kolaygelsin
 
SALIH-46 hocam cevabınıza çok teşekkür ediyorum.

Picbasic bana açıkçası çok yetersiz geldi, aslında hiç C bilgimde yok ancak Java ile programlama yaptım ve bu hi-tech dökümanında gördüğüm dile adapte olmakta zorlanmadım.

Yinede tavsiyenizi aklımda tutacağım, olmazsa döner picbasic ile yazmaya çalışırız.

Tavsiye ettiğiniz yol net olmasada kafamda şekillenen yol ancak önce andığınız birimleri iyi tanımam lazım, yani adc pwm ve timer kullanımı.

Kesme kullanmadan galiba bu işi yapapam değil mi?

Şimdi güzergahımız anladığım şu:

Encoder'in iki çıkışınıda adc kanalına götürüp sayısallaştırmalıyım.

Bu değere dediğiniz gibi Vg diyelim.

Sonra girdi ile yada kod içinde sabit tanımlanacak pulse değeri için Vr değişkenini tanımlayalım.

Vr el ile girilecekse bunu da adc kanalına götürüp sayısallaştırmalıyım.

Programın akış diyagramı:

Vr'yi oku
Vg'yi oku(Encoderin ilk pozisyon bilgisi/şu anki pozisyion bilgisi)
Vr ile Vg birbirine eşit değilse pwm'i ki bunun değişken adı da Vpwm olsun duruma göre artır yada azalt.

Bu arada da sürekli Vr ile Vg'yi okumalıyım, Vr=Vg olduğunda Vpwm'e artma yada eksiltme uygulamam sistem stabil kalır.

Şimdi bu diyagramı koda dökmeliyim, encoder okuma işi timer ile yapılacağına göre kesme için nasıl bir yol izlemeliyim, örneğin kesme için arzulanan pulse değerini sisteme tanıtmam gerekir değil mi?

Birde burada ana fonksiyon alanı içinde

Kod:
void main(void)

bu işlemlerden hangisini gerçekleştirmeliyim sizce, yoka her işlem için interrupt mu tanımlamalıyım?

SALIH-46 hocam size çok teşekkür ediyorum sağolunuz zaman ayırıyorsunuz.
 
ya arkadaşım yapma şimdi "Encoder'in iki çıkışınıda adc kanalına götürüp sayısallaştırmalıyım( zaten encoder çıkışı lojiktir)" bunu nerden çıkardın bak kardeş encoder motorun miline bağlı olan mekanik kısmı ve Elektronik kısmı olan sana hız ve yön bilgisi veren bir parçadır sen bunu +5v, gnd ,puls ve yön bilgisini veren uclarını belirleyecen (encoderlar genelde 4 uçlu oluyor" bunlarda beslemeleri verdikten sonra puls ucunu belirle osilaskop filan kullanarak bir devirde kaç puls ürettiğini bul birazda bu encoder'ın ne olduğuna bakasan iyi olur.
Ya anlatmak istediğim çokmu karışıkki böyle karıştırdın anlamadım kardeş
şimdi sana iki potansiyometre lazım bu potun birini mekanik kısma monte edecen
ona göre uygun bir pot alman lazım bu potun kenardaki bir ucuna +5v diğer kenar ucunu gnd'ye bağlayacan bu potun orta ucunu pic'in bir analog girişine götürecen Bu senin Vg olacak
tekrarlamak istemiyom şimdi bence diğer cevaplayı bir kez daha oku
 
Düzenekte encoder takılı ise mecburen onu kullanacaksınız. Absolute encoder hem pahalıdır ve hem de haberleşme zaman alır. Incremental encoder kullanırsanız çok yavaş hareketlerde puls alamayabilir ve dolayısıyle pozisyon bilgisini sağlıklı kontrol edemeyebilirsiniz. O nedenle encoder çıkışlarını ya yüksek kazançlı bir yükselteç ile (max 5 vol çıkışı olsun) ver veya 877 analog comparatör modunda giriş bacaklarına ver ve dahili karşılaştırma voltajını küçük seç.

Yukarıda örneğini verdiğiniz
degisken=PORTA & %00000011
işleminde %00000011 sayısı, port A nın diğer bacaklarından gelen bilgiyi maskelemek içindir. Sonuçta a0 ve a1 den gelen bilgi (0, 1, 2 veya 3) ne ise ona göre hareket yönünü ve pozisyonu saymak için kullanacaksınız. AB encoder diye araştırırsan görürsün. Bir bacağı alçıda birisinin merdiven basamaklarını çıkması veya inmesi gibidir. Encoderin bacaklarını dijital porta bağlarsan adım sırasından yön bilgisini bulursun.

Hassas pot kullansan daha iyi olabilir. Pot kullanacaksan analog kanalı (A0) ı kullan.

PID yerine PI kontrol algoritması daha iyi olabilir. Kol yatayda hareket ediyor olsa PID kullanmak zoundasın derdim.

Timer1 i hassas zamanlama için kullan (CCP1 compare modunda 50 yada 100 ms. için ayarlayabilirsin). Bu senin delta t zamanını belirler. Floating point aritmetiğine hiç girme. Her türlü hesaplamayı integer aritmetiği ile hem güvenilir ve hem de hızlı bir şekilde yapabilirsin.

CCS derleyicisini kullan. İçerisinde her konuda örnek beraberinde gelir. PWM örneği de mevcut.

Yazdığın programları Proteus ISIS üzerinde test edebilirisin.

Projenin %60'ını bu bilgilerle tamamlamış oldun.

Kolay gelsin.
 
ya arkadaşım yapma şimdi "Encoder'in iki çıkışınıda adc kanalına götürüp sayısallaştırmalıyım( zaten encoder çıkışı lojiktir)" bunu nerden çıkardın bak kardeş encoder motorun miline bağlı olan mekanik kısmı ve Elektronik kısmı olan sana hız ve yön bilgisi veren bir parçadır sen bunu +5v, gnd ,puls ve yön bilgisini veren uclarını belirleyecen (encoderlar genelde 4 uçlu oluyor" bunlarda beslemeleri verdikten sonra puls ucunu belirle osilaskop filan kullanarak bir devirde kaç puls ürettiğini bul birazda bu encoder'ın ne olduğuna bakasan iyi olur.
Ya anlatmak istediğim çokmu karışıkki böyle karıştırdın anlamadım kardeş
şimdi sana iki potansiyometre lazım bu potun birini mekanik kısma monte edecen
ona göre uygun bir pot alman lazım bu potun kenardaki bir ucuna +5v diğer kenar ucunu gnd'ye bağlayacan bu potun orta ucunu pic'in bir analog girişine götürecen Bu senin Vg olacak
tekrarlamak istemiyom şimdi bence diğer cevaplayı bir kez daha oku

SALIH-46 sen güzel anlatıyorsunda ben işin acemisiyim, kusura bakma :)

Hocam bir şeyi düzeltelim, benim projede encoder motora bağlı değil, konuya eklediğim resme bakarsan encoder nerede göstermeye çalıştım.

Bu arada "zaten encoder çıkışı lojiktir" demişsin yani "0" ve "1" mi geliyor A ve B bacağından?
 

Forum istatistikleri

Konular
129,845
Mesajlar
930,720
Kullanıcılar
452,700
Son üye
erdem443035

Yeni konular

Geri
Üst