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

Arkadaşım şimdi senin yapmak istediğin şu değilmi atıyorum kol yukarı doğru hareket edecek ve 400 puls olduğu zaman o seviyede sabitleyecek ve senin gelecek olan puls'in maksimum 900 ise böyle bir durumda yani puls sayısı 900 bulabileceği için timer1 kullanman (sayıcı olarak) bencede mantıklı çünkü timer1 16bitlik zamanlayıcı/sayıcı ve şimdi bence zamanlayıcı olayını (şunun için zamanlayıcı ile işin olmayacak gibi) boş ver
sadece şunu yap şimdilik timer1 sayıcı olarak ayarla prescaler oranınıda 1:1 yap yani encoder dan gelen herbir puls sinyalinin düşen veya yükselen kenarında kesme oluştur kesme programında yön bilgisine göre puls sayısını artır veya azalt bu arada a0 analog olarak ayarla bir potun orta ucunuda a0 getir a0 dan aldığın değeri sayısallaştırdın atıyom 300 şimdi sen pwm'in duty saykılını artırmaya başlarsın ( motor gittikce hızlı dönmeye başlar) kol yukarı doğru hareket ettikce gelen pulsleri sayarsın puls sayın 300 bulduğunda pwm'in duty saykılını artırmassın olduğu yerde kalır eğer denge bozulursa o kurduğun döngü sayesinde pwm'i artırır veya azaltırsın

aşağıdaki koda gelince sana attığım mail'i dikkate al bence ve burda timer1 sayıcı olarak kullnıyorsan encoder'ın puls ucu pic'in 15 nolu bacağına yani rc0(tc1ck timer1'in sayıcısı için harici giriş) bacağına gelmeli ama yön sinyalini istediğin yerden alırsın ve timer1'sayıcısına gelen pulsleri bölmeyeceksin hergelen pulsde kesmeye gitmen lazım yani oran 1:1 olacak
 

Hocam yapmak istediğimi çok güzel tarif etmişsiniz.


Hocam sizi doğru anlamışmıyım diye soruyorum, neticede kavramlara bile yabancıyım.

Şimdi bundan önce yaptığım gibi bir şey yapmamı mı tavsiye ediyorsunuz, yani encoder'in a ve b bacağını kesme pinlerine bağlayıp (mesela RB4 ve RB5 gibi) sinyal geldikçe interrupt metodu içinde pulse değerini tutan değişkeni sinyalin geldiği bacağa göre artır yada azalt diyorsunuz.

Doğru mu anladım?


Evet hocam burayı da az çok anladım ancak hi-tech ile galiba buranın hakkından gelemeyeceğim(yine de şansımı bir deniyeceğim) mailinizi dikkate aldım, kitabı sipariş edeceğim İnşallah.
 
şimdi timer1 sayıcı ve zamanlayıcı olarak kullanabilirsin zamanlayacı olarak kurduğunda pic'in çalışma frekansına göre 16bitlik yazmacın değeri artarak 65536'ya kadar devam eder eğer sen 4mhz lik kristal kullanırsan her komut 4 cycle sürdüğünden 1/4 =0.25us çarpı 4 dersen bir komutu 1us işlemiş olursun vede 1us timer1'in değeri bir artar bu şekilde timer1'i zamanlayıcı olarak kullanabilirsin ama sen sayıcı olarak kullanacağı için timer'i sayıcı moduna kurdun sayıcı modo dışarıdan gelen (rc0 pini timer1 için harci clock girişidir) yani rc0 pininden gelen sinyallerin yükselen veya düşen kenarlarında (bunuda ayarlayabiliyorsun) timer1'in değerini bir artırır işte senin timer1'i sayıcı olarak kullanmadaki amacında encoderdan gelen pulsleri rc0 pinine verek timer1'i artırman/azaltman yani puls ucun rc0 pinine gelecek ve peki artırma ve azaltmayı neye göre yapacan burda herhangi portun bir pinini giriş olarak tanımlayacan (diyelim a0) bu pine getirip encoder'ın yön bilgisini veren çıkışını bagayacan bu yönbilgisi pulsleri encoder sağa ve sola dönmesine göre değişmekte şimdi rc0 pinine encoder'ın puls ucundan bir puls geldi diyelim ve keme oluştu gittin kesmeye a0 pinini kontrol edecen "0" mı "1" mi diye 0 ise timer1 sayacının bir azaltacan 1 ise bir artıracan şimdi sana görsellik olsun diye bir mail atacağım ona bak
 
SALIH-46 hocam aslında anlattığın mantık çok net, bende anlıyorum ama işte şu dediğini hi-tech'e şuanki bilgimle dökemiyorum, çünkü elimdeki kaynakta timer1 için böyle bir kullanım örneği yok, gerekli bayrakları nasıl düzenleyebileceğimi çözemedim.

Ben senin önerdiğin kitabı alayım ve en iyisi ccs c'ye bir an önce başlayayım.

İlgine çok teşekkür ederim.
 
bende de buna benzer bi duzenek var u profil ortasindan mile tutturulmus bi ucunda bldc motor ve pervane var. u profilin uzerindede top var. cubuga paralel uzaklık sensoru var. mile baglida encoder var. fircasiz motorun kontrolunu ESC ile yapacagım. milin açısını timer1 i sayıcı olarak kullanarak Counter devresiyle alacagım. birde IR uzaklık sensorunden konum bilgisini alıp cubuk uzerindeki topun konumunu kontrol edecegim inş
 
Vayyy , heliköfter yapacak gibisiniz.

Encoderin muhtemelen rotary encoderdir.
A-B çıkışlarında yön bilgisi olur.
Tek yöne çalışacaksa belki timer ile olurda kol indi-kalktı izleyeceksen A-B kullanmalısın.
B4-7 kesmesi kullan yoksa encoderi izlemeyi kaçırırsın.
Kesme içerisinde A-B işaretlerini izle ve değerlendir buna görede bir sayacı arttır ya da eksilt.
Fazla oyalanmadan çık kesmeden...


Başlığı açan kaybolmuş gitmiş , sonucu bile paylaşmamış.
Bakalım sen nasıl yapacaksın ?...
 
kazım abim ben de araştırdım dediginiz gibi A B kanalı için B4-7 kkullanacagım birde z kanalı içinde rb0 ı kullanıcam.

bu işi adam akıllı yapabilmek için yoklama degil kesme mantıgıyla yapmak lazım.

A nın yukselen kenarında kesme girecek, B ile (^) xor layacam, sonuc 1 ise sayat++, 0 ise sayac--. Z kesmesi geldiginde de sayacı sıfırlayacak olası kaçırmaya hatalara karşı. mutlak encodermiş gibi olacak.
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…