Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

servo problemi

Başlatan predator, 26 Aralık 2013, 10:19:19

predator

pulsout ile servo sürüyorum 20ms periyotlarla 1.5 ile 2.5 ms arası dalga genişliğinde sinyallerle çalışıyor servom, portc.4e bir 5v sinyal geldiğinde bir başa gitsin sonra diğer başa gitsin istiyorum, bu kadar yani, sinyal çıkışım portd.7'de, aşağıdaki gibi bir kod yazdım ama sapıtıyor, yardımcı olursanız sevinirim;
trisc=255
portc=0

portd=0
portd=0

i var byte
a var byte
for i=1 to 10     'ilk konuma getir
pulsout portd.7,150
pauseus 19850
next
kontrol:
if portc.4=1 then
goto servosur
endif
pause 100
goto kontrol

servosur:
i=0
for i=1 to 10     'bir başa gel
pulsout portd.7,150
pause 20
next

for a=1 to 10     'diğer başa gel
pulsout portd.7,250
pause 20
next
pause 500
goto kontrol

end

ete

Servo nun 0,5 ile 2 ms lik puls süreleri ile konum değiştirdiğini biliyorsun sanırım.
Diğer yandan PUlsout komutuda işlemci frekansına göre puls üretir. Programında ne işlemci belli, ne sigorta ayarı var nede işlemci frekansı belli. Bunları tamamlaman gerekir.

Diyelimki 4 Mhz işlemci frekansı ile çalışıyorsun. Bu durumda Pulsout 10us nin katları şeklinde puls üretir. Üreteceğin puls süresinin us cinsiden değerini 10'a bölerek oraya değer olarak yazman gerekir. Örnek verecek olursak 500us (0,5ms) için 50 vermen 1500 us için 150 vermen gerekir.

Bu pulsların 20 ms lik aralıklarla verilmesi ayrıca gerekiyor. Kurduğun döngüye bakılırsa bunu yapmaya çalışmışsın en azından birisinde. Ama peryod tam olrak hesaplanamamış galiba. Birinci döngüye bakalım.
pulsout portd.7,150 bu komut PORTD.7 pininden 1500 us lik (1,5ms) bir puls çıkartır. Bu durumda bekleme süresi 20000-1500=18500 olması daha doğru olur.

Motora verdiğin 1500us lik puls süresi motoru bir konuma getirir. Genelde sıfır noktası için sanırım 500us lik puls vermen gerekiyor. 180 derecelik (yada 90 derecelik ) konum için ise 2000us lik puls vermen gerekiyor.
Sen 250 değerini vermekle motora 2500us lik puls süresi veriyorsunki bu sınır dışındadır.
Bana kalırsa şunları dene.
Motoru maksimum pozisyona almak için
PULSOUT PORTD.7,200
motoru tekrar ilk konumuna lamak için
PULSOUT PORTD.7,50
komutlarını döngü içinde ver.

Programındaki eksiklikleri yeniden sıralıyorum.
1. Programın başına sigorta ayarlarını ekle.
2. Define OSC 4 şeklinde çalışma frekansını belirt. Bu kodların düzgün çalışmasını sağlayacaktır.
3. Programa bir açılış gecikmesi ekle.  Değişken tanımlamalarından sonra Pause 300 komutunu ekleyerek bunu yapabilirsin. Bu işlemci registerlerinin yerlerine yerleştirilmesi için gereklidir.

Unutma, motor sürekli çalışacak ise bu pals leri süreki 20 ms lik peryotlar içinde vermelisin. Bunun en güzel yolu kesme kullanmaktır. Her 20 ms de bir kesme oluşturur ve motora orada puls verirsen sorun kalmayacaktır.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com