16f 628 ile servo motor kontrolü

Başlatan polatli30, 20 Nisan 2015, 23:14:40

polatli30

Merhaba arkadaşlar.
Servo motorlarla ilgili öğrenciler ve ben bir proje yapmak istiyoruz.Ama pic konusundaki bilgim az olduğundan işin içinden çıkamadım hafta sonu forumda yazan ders ve diğer sorulan soruları hep okudum.Proteusda 16f628a ile bir servo'yu direk bağladım ve pic basıc pro da basit bir şeyler yazdım.ama motoru çalıştıramadım.Motor 90 derece dönüyor bir daha dönmüyor.osiloskopla baktığımda sinyalin değiştiğini görüyorum ama motorda bir hareket yok.Bir yerlerde bir eksiklik yapıyorım ama nerede bilemedim.pals genişliğini 1ms yapsamda  motor 90 derece dönüyor 1,5 veya 2ms yapsam da.
@ DEVICE pic16F628A
@ DEVICE pic16F628A,WDT_ON
@ DEVICE pic16F628A,PWRT_ON
@ DEVICE pic16F628A,PROTECT_OFF
@ DEVICE pic16F628A,MCLR_ON
@ DEVICE pic16F628A,INTRC_OSC_NOCLKOUT
'---------------------------------------------------------------------
DEFINE OSC 4
CMCON=7
'-------------------------------------------------------------------
TRISA=%00000000
TRISB=%00000000
'----------------------------------------------------------------------
BASLA:
PORTB.0=1
PAUSEUS 2000
PORTB.0=0
PAUSEUS 18000
END

ete

Servo motorlar 500 us ile 2000 us arasında değişen pulslar ile çalışırkar.
Bu palslar her 20 ms de bir tekrarlanmalıdır. Sitede ete projelerinde yer alan servo motor kontrol projelerini inceleyin.

Ete

polatli30

Proteus da ek deki gibi bağlantı yaptım.

polatli30

Hocam cevabınız için teşekkürler. Hazıra konma gibi anlaşılmasın ama hafta sonundan beri bunu inceliyorum sizin ders 12 konunuzu da okudum.evet servo motorlar 20ms genişliğindeki kare dalga ile çalışıyor bu kare dalganın 500 us high ise 19500 us low olması gerekiyor.1000-19000 ve 2000-18000 veya 1500-18500 gibi bunları okudum ama bir yerde yanlışlık yapıyorum veya tam olayı anlamadım.Bugün yine baktım ama proteusta çalıştıramadım.Proteus şeklim mi yanlı yoksa kodlarda mı sıkıntı var bilemedim.Bir örnekle açıklama yapabilirmisiniz.

ete

İlişikteki örneği incele
İsis servo motoru min 1ms maksimum 2 ms puls ister. Servo üzerine sağ tıklayıp min değerini 0.5 yaparsan standart servoya dönüşür. Örnekte öyle yaptım.

Burada temel mantık şudur. Servo ya 500us ile 2000us arasında bir puls verirsen motor puls süresine göre bir konum alır.
Butonlarla puls süresini 100us lik değişimlere uğratıyorum. Motorda buna uygun konum alıyor.

Sabit tek bir süre verir ve programı sonlandırırsan motor da bir kereliğine konum alır ve durur seninkide öyle yapıyor zaten.

Ete

polatli30

Hocam çok teşekkürler.İnceleyip tekrardan çalışmaya devam edeceğim.

polatli30

Ete hocam iyi akşamlar.Verdiğiniz örneği inceledim ve çok işime yaradı.Ben çalışırken bir şey dikkatimi çekti.Ben servoya sinyali PORTB.0 dan gönderiyordum.halada olmadı.Sizin gibi PORTA.0 dan gönderince düzeldi.Aslında sorun buymuş.Bu servo olayında A İLE B nin bir farkı var mı?

ete

#7
Bir farkı yok aslında. Ben oraya buton bağlayacağım için portA ya bağladım.
Az evvel tuşları PortB.1 ve PortB.2 ye bağladım servoyu da PortB.0 a bağladım sorunsuz çalışıyor.

Ete

polatli30

Hocam verdiğiniz cevaplar için teşekkür ederim.Sorunumu çözdüm sayılır.Bu işte yeni ve hiç eğitim almadığım dan kendimi geliştirmeye çalışıyorum.ben aynı kodları porta.0 da denediğimde olmuyor ama porta.0 da denediğimde oluyor.Bilgi eksikliğinden dolayı olayı anlamadım.Aşağıya kodları ve devreyi yazıyorum.
@ DEVICE pic16F628A
@ DEVICE pic16F628A,WDT_ON
@ DEVICE pic16F628A,PWRT_ON
@ DEVICE pic16F628A,PROTECT_OFF
@ DEVICE pic16F628A,MCLR_ON
@ DEVICE pic16F628A,INTRC_OSC_NOCLKOUT
'---------------------------------------------------------------------
DEFINE OSC 4
CMCON=7
'-------------------------------------------------------------------
TRISA=%00000000
TRISB=%00000000
'------------------------------------------------------------------
BASLA:
PULSOUT PORTB.0,50
PAUSEUS 19500
pause 1000
pulsout PORTB.0,200
PAUSEUS 18000
PAUSE 1000
GOTO BASLA
END

şimdide a olanı
DEFINE OSC 4
CMCON=7
'-------------------------------------------------------------------
TRISA=%00000000
TRISB=%00000000
'------------------------------------------------------------------
BASLA:
PULSOUT PORTA.0,50
PAUSEUS 19500
pause 1000
pulsout PORTA.0,200
PAUSEUS 18000
PAUSE 1000
GOTO BASLA
END

Ben devremi A dan yaptım sorunum çözüldü.Ama sırf merak ettiğimden B de sorunu öğrenmek istiyorum.

ete

Verdiğin komutlar motorun bir sağa bir sola 180 derece döndürme komutlarıdır. Motor bir konumdan 180 derece farklı diğer konuma belirli bir sürede gider. Bu süre kadar bekleyip sonra komutunu verirsen aynı şekilde geri de döner.
Bu yüzden servo motorda komut sürekliliği vardır.

PULSOUT PORTB.0,50
PAUSEUS 19500
pause 1000
şeklinde bir komut kullanımı pek tavsiye edilmez çünki 2 gecikme komutunu peş peşe veriyorusn.
PAUSEUS 20500 desen bu ikisinin toplamı kadar gecikme sağlarsın. Ama bu seferde 20ms lik peryodu aşmış oluyorsun dikkat edersen.
Servoda her 20 ms de bir komut (aynı komut da olsa) verilmesi gerekir.
Bu durumda şöyle bir komut dizisi daha iyi olurdu.
FOR I=0 TO 100
PULSOUT PORTB.0,50
PAUSEUS 19500
NEXT

FOR I=0 TO 100
PULSOUT PORTB.0,200
PAUSE 18  'pauseus yazarsan 18000 yazmalısın
NEXT

goto basla:

Böylece arda arda verilen 101 komut ile motor verilen konuma kolaylıkla zamanında ulaşır. Ardından verilen diğer komutlada eski yerine geri döner.

Ete

Powered by EzPortal