E

7 SERVO MOTORU BUTONLA KONTROL DEVRESİ

Başlatan emrw53, 29 Ekim 2013, 17:57:42

emrw53

Arkadaşlar bu devre hakkında bilgisi olan varmı yardımcı olursanız çok sevinirim

emrw53

Arkadaşlar programlamada sıkıntı yaşadığımız için yardım istiyorum

ete

#2
Ben olsam tasarımı biraz değiştirirdim.
BUton kontrolü yada buton pinleri pullup yada pulldown ister. PortB de dahili pullup dirençleri mevcuttur.
Butonları PortB ye taşır servoları ise C veya D portuna alırdım. Bu şekilde tasarımı yapmak  daha kolay olur.

Bir servo motor 500us ile 2000 us arasında puls ile çalışır. Verdiğiniz pulsin süresine bağlı olarak da bir kereliğine konum değiştirir. Aynı palsi sürekli versenizde konum bir kere değişir ve puls süresinin yeniden değişmesini bekler. Kısaca servoda her bir puls süresi karşılığında bir konum belirlenmiştir. Diğer bir kriter ise bu palsleri 20 ms lik peryotlar halinde viermeniz gerekiyor.
SOnuç ollarak mşotora hier 20 ms den bir genişiği 500us ile 2000 us arasında değişen bir puls vermeniz gerekmektedir.
Aslında Donanımsal PWM bu iş için çok uygun. Ancak ne yazıkki 50 hz lik (20 ms lik peryot 50 Hz ye tekabül etmektedir) bir sinyal normal frekanslarda elde edilmesi zor . Ya kristal frekansını düşürmek yada kesme ile sinyali elde etmek gerekiyor.
Bu projede 7 ayrı sinyal çıkartılmasıda enteresan.  KOmut gecikmeleri sinyalin tutturulmasında etkili olacaktır.

Teorik olarak düşünürsek, bu projeyi yapmanın bir kaç yolu olabilir.
Birincisi;
- her 20 ms de bir kesme oluşturup, kesme içinde önce en kısa süreli puls alacak olan motorun sinyalini vermeli
- ardından ikinci süreye sahip motor sinyali açılmalı
- bu şekilde 7 motorun sinyali verilerek arada kapanması gerekenleri kapatmalıdır.
- sonra bütün hepsi kapatıldığında kesmeden çıkılmalıdır.
Bu biraz karmaşık bir metod olsa gerek. Çalışması gerçekten zor olur.
Diğer metod ise belirli bir kademe seçmek ile yapılabilir. Kademeden kastım kesme oluşturma süresi olarak düşünmek gerekir. Mesela her 100us de bir kesme oluşturabiliriz.  Bundan sonrasını örnekle açıklayayım.

Diyelimki 1 nolu motor 500us , 2 nolu motor 700us , 3 nolu motor 800 us , 4 nolu motor 1100us 5 nolu motor 1500us .....şeklinde süreler alacak. Hepsini yazmadım çünki sistem bir birinin aynısı olacak.
Bu durumda bu süreleri 100us lik dilimlere bölmek gerekecek. 1. motor 5 kesme, 2 nolu motor 7 kesme, 3 nolu motor 8 kesme , 4 nolu motor 11 kesme, 5 nolu motor ise 15 kesme süresi kadar puls oluşturacaklardır.
Her bir motorun kesme sayılarını bir dizi değişkeninde saklarsak kesme oluştuğunda bunları kolaylıkla saymak mümkün olur.
Program ilk açıldığında
Motor1=1, Motor2=1,Motor3=1, motor4=1 ve Motor5=1 şeklinde ilgili port pininden high sinyalleri çıkartırız.
Sonra kesme oluştuğunda,
Kesme=Kesme+1:IF kesme=7 them kesme=0  'kesme sayacını oluşturduk
For I=0 to 6 '(7 adet motor için)
  IF KES[I]=KESME THEN
      TOGGLE PORTC.0[I]  'motor pini konumunu değiştirdik
      KES[I]=20-KES[I]     'Şimdide LOW süresini sayacak .
  ENDIF
NEXT
şeklinde işlem yapılabilir.
LOW süresi ayarlama işini örnekle açıklamak gerekirse;
Diyelimki Motor1=500 us lik bir high süresi var idi. Bunun kesme karşılığı ise 5 kesmedir. O halde bu motor 5 kesme HIGH ve 20-5=15 kesme de LOW sinyali uygulayacaktır.

Programı bu mantık üzerinden oluşturursanız birlikte sonuçlandırabiliriz.

Ete

Powered by EzPortal