| Yazar | Mesaj |
seba | | Tarih: 16.05.2007, 13:51 Mesaj konusu: encoderla dc motor hız kontrolü | |
| slm arkadaşlar
encoderlı dc motorun hızını 16f877 kullanarak kontrol etmeliyim.ama nasıl yapacağımı tamolarak bilmiyorum.
yapabildiğim kadarını size anlatayım sizde bana gerisini anlatın[:D]
elimde 100lük encoder var.öncelikle belirli bir sürede encoderın kaç adım gittiğini saydım ve bunu referans hızım olarak kabul ettim. pwm üretip motora gönderdim.(ama sorun burda başlıo)motor pwmin H-L sürelerine göre hızlı yada yavaş dönecek.fakat motor dönerken encoderın kaç adım gittiğini nasıl sayacağımı bilmiyorum.bu konuda bilginiz varmı
-----------------------------------------------------
|
|
kamilmavi | | Tarih: 05.08.2007, 23:25 Mesaj konusu: en iyisi hpwm | |
| Sevgili arkadaşım PIC in HPWM (donanımsal PWM) özelliğini kullanmalısın. HPWM programdan bağımsız çalışır, frekansı sadece osilatöre bağlıdır ve böylece sen sadece ona döngü içerisinde hızın şu dersin. Senin programın çalışırken o aynı frekansta çalışmaya devam eder. ve değiştirene kadar bozulmaz. 16f877 de 2 adet hpwm çıkışı var CCP1 ve CCP2 olacak portc.0 ve portc.1 e bağlı olması lazım. Detaylı bilgi için PIC BASIC pro derslerini indir. orada sanırım ders 9 veya 11 de ayrıntılı olarak anlatıyor. Kolay gelsin.
|
|
ete | | Tarih: 06.08.2007, 08:45 Mesaj konusu: | |
| Öncelikle encoder palslerini okuyacak bir program parçası yazman gerek. Bunun için RB0 kesmesini kullanırsan pals kaçırmamış olacaksın. Programı yazdıktan sonra motor miline bağladığın encoder'in motor milinin her turunda kaç pals ürettiğini sayacaksın. Bunun için motor milini yavaşça tam tur attırman yeterli. Senin ifadenle tur başına 100 pals üreten bir encoderin var. Bu durumda motor milinin her turunda encoder 100 pals üretecektir.
Hız yada devir kontrolü birim zaman içindeki hız yada deviri ifade eder. Özellikle devir konusu bir dakika içindeki atılan turu ifade eder. O halde senin yapacağın iş , öncelikle 1 sn içinde motor milinin kaç tur attığına bakacaksın. Bulduğun tur sayısını 60 ile çarparsan sana kabaca motorun kaç dev/dak. hızla döndüğünü bulabilirsin. Tabiiki bu hassas bir hesap olmayacaktır. En doğrusu 1 dakikalık zaman diliminde encoder in kaç pals ürettiğine bak ve bulduğun rakamı 100'e böl. Böylece gerçek olarak motorun kaç tur/dak. hızla döndüğünü bulmuş olursun.
Formüller şöyle;
1 tur= 100 pals
Dev/dak= xxxx / 100 (burada xxxx sayısı 1 dakikada kaç pals üretildiğidir.)
Encoder palslerinin nasıl okunduğu konusunda bilgin varmı bilmiyorum. Encoderlerin A ve B diye en azından iki çıkışı vardır. Bu iki çıkış birbirinden 90 derece faz farkı ile sinyal üretirler. Bu faz farklı sinyal ile encoderin hangi yöne döndüğü tespit edilir. Şayet yön derdin yok ise direk A çıkışını portB0'a bağlarsan (encoder voltajının 0-5V olmasına dikkat etmen gerek ) gelen palsleri direk sayabilirsin.
Yön tespitide yapacak isen üst üste hem A hemde B çıkılarına bakacaksın. Üst üste yapılan okumalarda bir birinden farklı iki okumayı yakalamaya çalışacaksın. Yakaladığın anda ilk okumanın sıfırıncı biti ile ikinci okumanın birinci bitini XOR yapacaksın bulduğun değer ya sıfır yada bir olacaktır. Encoderin bir yöne dönmesi durumunda bulunan değer hep aynıdır. Ters yöne dönünce bulunan değer bir öncekinin hemen tersi olacaktır. Buradan encoderin hangi yöne döndüğünü anlayabilirsin.
Encoder palslerini saymanın daha kolay bir yoluda Tmr0 zamanlayıcısını kullanmaktır. Bu zamanlayıcıyı şayet harici paslerden tetik alacak şekilde kurarsan ve bölücü seçimini WatchDogTimer için ayarlarsan bire bir olarak Tmr0 dışarıdan gelen palsleri sayabilir. Bu sayıcının pals girişi PortA.4 dür. Böylece PortA.4 e bağlamış olduğun encoder için önce,
- Tmr0 değerini sıfırlarsın
- Sonra 1000 ms lik bir zaman tutarsın.
- Program zaman tutmada beklerken gelen palsler Tmr0 değerini sürekli geri planda artırır.
- 1000 ms sonunda Tmr0 değerini başka bir değişkene eşitlersen 1000 ms de encoderin kaç pals ürettiğini bulmuş olursun.
Ete
|
|
kamilmavi | | Tarih: 17.08.2007, 10:23 Mesaj konusu: pic ile encoder okuma | |
| Arkadaşlar, pic basic pro ile kesme kullanarak yazdığım programlardan verim alamadım. Yani sayma sırasında encoderden okunan değerlerde atlama oluyor. doğru olması için , encoderin çok yavaş dönmesi gerekiyor. Yabancı sitelerde de yaptığım araştırmada pic basic pro'nun interrupt özelliğinin çok hızlı saymalarda verimli olmadığı görünüyor. Hızlı kesme işlemlerinin assembly dili kullanılarak yazılması gerektiği vurgulanıyor. Zaten pic basic pro ' nun kendi yardımında da bu doğrultuda bir bilgi var. Eğer Bu konu da bildiğiniz farklı bilgiler varsa paylaşmanız çok faydalı olur. Teşekkürler
|
|
ete | | Tarih: 19.08.2007, 19:04 Mesaj konusu: | |
| Pic Basic pro ile yazılmış bir programın nasıl encoder okuduğuna örnektir.
Encoder simulasyonu 2 adet D tipi flip flop kullanılarak gerçekleştirilmiştir.
Gerekirse Osiloskop bağlayarak A ve B girişleri arasındaki faz farkını görebilirsiniz.
http://www.4shared.com/file/22379128/f0...coder.html
KOlay Gelsin
Ete
|
|
kamilmavi | | Tarih: 23.08.2007, 20:05 Mesaj konusu: ete usta'ya saygılar | |
| Ete usta yardımların için çok teşekkür ederim. Bugüne kadar yazmış olduğun birçok yazıyı okudum ve çok faydalandım. Bu encoderi pic basic pro ile bir türlü hızlı okutamadım. Göndermiş olduğun devre çok güzel çalışıyor. Fakat basic kodlarını göndermemişsin. Eğer kodları gönderirsen çok işime yarayacak. Kafayı sıyırdım bu sayma işiyle. Yardımcı olursan çok sevinirim. Birde senin mail adresini veya iletişim kurabileceğimiz bir adres verebilirmisin. 2 gündür arıyorum ama bulamadım seninle ilgili şahsi bir bilgi yok proje sitelerinde :) şimdiden Teşekkürler.
|
|
ete | | Tarih: 23.08.2007, 20:34 Mesaj konusu: | |
| aslında programı bilerek vermedim. biraz kafa yorun diye. zorlanıyorsan program aşağıdadır;
Kod:
bır var byte
onn var byte
yuz var byte
bınn var byte
old var byte
new var byte
yon var bıt
ledy var porta.2
ledk var porta.3
trısb =%00000000:trısa=%00011
start:
porta =0:portb =0:high portb.4:high portb.5:high portb.6:high portb.7:pauseus 10
bas: gosub encoder:ıf yon = 1 then
bır = bır + 1:endıf
ıf bır = 10 then bırsıfır
ıf yon = 0 then
bır = bır - 1:endıf
ıf bır = 255 then bıreksı
ekran: portb = bır & 15:high portb.4:low portb.4
portb = onn & 15:high portb.5:low portb.5
portb = yuz & 15:high portb.6:low portb.6
portb = bınn : high portb.7:low portb.7:goto bas
encoder: old = porta & %11
tekrar: new = porta & %11
ıf new = old then tekrar
old = old >> 1:new = new & 1:yon = old ^ new
ıf yon = 0 then
high ledk:low ledy:endıf
ıf yon = 1 then
high ledy:low ledk:endıf
return
bırsıfır: bır = 0:onn = onn + 1
ıf onn = 10 then onsıfır
goto ekran
onsıfır: onn =0:yuz = yuz + 1
ıf yuz = 10 then yuzsıfır
goto ekran
yuzsıfır: yuz = 0:bınn = bınn + 1
ıf bınn = 10 then
bınn = 0:endıf
goto ekran
bıreksı: bır = 9:onn = onn - 1
ıf onn = 255 then oneksı
goto ekran
oneksı: onn = 9:yuz = yuz - 1
ıf yuz = 255 then yuzeksı
goto ekran
yuzeksı: yuz = 9:bınn = bınn - 1
ıf bınn = 255 then
bınn = 9:endıf
goto ekran
haberleşme adresimi direk vermek istemem. sonra bir sürü spam geliyor. lütfen özel mesaj atıver. orada veririm.
ete
|
|
eyazlik | | Tarih: 07.08.2008, 17:42 Mesaj konusu: | |
| Verdiğiniz bilgiler için teşekkürler. Ben, pic 16f877 ile encoder palslerini saydırarak bir motora pozisyon kontrolü yaptırmak istiyorum. Örneğin encoder 1000 pals ürettikten sonra motoru durdursun. Buna benzer bir program parçası gönderebilir misiniz. (Pic basic pro ile yazılırsa gerçekten yararlı olacaktır.) Şimdiden teşekkürler.
|
|
ete | | Tarih: 09.08.2008, 18:04 Mesaj konusu: | |
| aslında yukarıda verdiğim programı direk kullanabilirsin. Normalde encoder 1000'e kadar sayarsa Binler değişkeni değeri=1 (binler=1) olacaktır.
Programın başında motoru bir şekilde aktif edersin ve
Gosub Encoder satırı altına
If Binler=1 Then Motor_Dur
şeklinde bir satır koyup Motor_Dur alt programında da motoru nasıl çalştırdın ise aynı şekilde durdurursun olur biter.
Bunun dışında özel program yazmam mümkün değil. Bak görüyorsun ortada detay yok zaten. Motoru kim çalıştıracak nasıl durdurulacak vs.
Ete
|
|
yudum | | Tarih: 09.08.2008, 23:31 Mesaj konusu: | |
| ifm electronic ten gerekli enkoder lari temin edebilrsin
|
|
|