Bu uygulamada PIC 16F628A kullanarak servo motor kontrol
edeceğiz. RA0 pinine bağlı butona basınca servo
motor orta konuma(0o)
gelecek. Öncelikle servo motordan biraz bahsedelim. Servo motor istenilen
konuma getirilebilen temel olarak potansiyometre ve dc motordan oluşan bir
motor çeşididir. Servo motor ilk olarak hangi konumda olursa olsun aynı darbe
gönderildiği sürece hep aynı pozisyona gelecektir. PWM servo motorlar şekildeki
gibi kare dalga gönderilerek çalıştırılırlar. Servonun pozisyonunu belirleyense
gönderilen lojik 1(+5V) seviyesinin süresidir. Gönderilecek kare dalga 10-20 ms
arasında değişebilen periyoda sahiptir. 1.5 ms uzunluğunda gönderilen lojik 1
seviyesi servoyu orta pozisyona(0o),
0.6 ms en sol pozisyona(-90o), 2.4 ms ise en sağ pozisyona(+90o)
getirmektedir, ancak bu değerler kullanılan servo modeline göre
değişebilmektedir. Bu uygulamada kullanacağımız servo motor maks. 180o
dönebilmektedir, 210o dönebilenleri de vardır. Bu kadar bilgiden
sonra artık uygulamaya geçebiliriz.
Kullanılacak
Malzemeler
- 1xPIC16F628A
- 1xPWM
servo motor(Hitec-HS-322HD)
- 1x4
Mhz kristal
- 2x22pf
seramik kondansatör
- 1x100nF
seramik kondansatör
- 2x4.7
kΩ direnç
- 2x100
Ω direnç
- 2xButon
- 5 V
DC kaynak(Batarya, pil, adaptör veya güç kaynağı)
Pic 16F628A Pin Diyagramı Pic ve Servo Devresi
PIC Assembly Kodu
LIST P=16F628A
#INCLUDE "P16F628A.INC"
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _DATA_CP_OFF & _CP_OFF
CBLOCK H'20'
SAYAC1
SAYAC2
IS
BEK
NUM
ENDC
;---------------------------------------------------------------
;0,6 MS EN SOL(-90 DERECE)
;1,5 MS ORTA KONUM(0 DERECE)
;2,4 MS EN SAĞ(+90 DERECE)
;---------------------------------------------------------------
MOVLW H'07'
MOVWF CMCON
BANKSEL TRISB
CLRF TRISB
MOVLW H'FF'
MOVWF TRISA
BANKSEL PORTA
CLRF PORTB
MOVLW D'05'
MOVWF NUM
TEST_ET
BTFSC PORTA,0
GOTO TEST_ET
DONDUR
MOVLW D'05'
MOVWF IS
MOVLW D'100'
MOVWF BEK
BSF PORTB,3
CALL GECIKME
MOVLW D'50'
MOVWF IS
MOVLW D'100'
MOVWF BEK
BCF PORTB,3
CALL GECIKME
DECFSZ NUM,F
GOTO DONDUR
GOTO TEST_ET
GECIKME
MOVF IS,W
MOVWF SAYAC1
DONGU1
MOVF BEK,W
MOVWF SAYAC2
DONGU2
DECFSZ SAYAC2,1
GOTO DONGU2
DECFSZ SAYAC1,1
GOTO DONGU1
RETURN
END
Kodun Mantığı
TEST_ET
BTFSC PORTA,0
GOTO TEST_ET
;PORTA,0’ı
kontrol ediyoruz eğer 0 seviyesindeyse yani butona basılıyorsa kare dalga
göndermek için bir sonraki komuta geçiyoruz, eğer butona basılmıyorsa tekrar
butonu kontrol etmek üzere işlemi başa alıyoruz.
DONDUR
MOVLW D'05'
MOVWF IS
MOVLW D'100'
MOVWF BEK
BSF PORTB,3
CALL GECIKME
MOVLW D'50'
MOVWF IS
MOVLW D'100'
MOVWF BEK
BCF PORTB,3
CALL GECIKME
DECFSZ NUM,F
GOTO DONDUR
GOTO TEST_ET
;Bu kısımda servoya kare dalga gönderiyoruz, kare dalga
oluşturmak ise oldukça basit; öncelikle çıkışı +5 V seviyesine getiriyoruz ve
ardından belli bir süre gecikme koyarak çıkışın bu seviyede o süre boyunca
kalmasını sağlıyoruz, daha sonra çıkışı 0 seviyesine çekip gene ardından belli
bir süre gecikme koyuyoruz.
IS
ve BEK değişkenlerini ise bu gecikme
sürelerini ayarlamak için kullanıyoruz, NUM
değişkenini de bu döngüyü NUM sayısınca
tekrarlamak için yani NUM sayısı kadar darbe
göndermek için kullanıyoruz. Butona basmamız ve çekmemiz arasında geçen süre
boyunca servoya kare dalga gönderdiğimiz için NUM
sayısına yüklediğimiz 5 sayısı yeterli olmaktadır, buton kullanmasaydık bu sayı
yeterli olmayacaktı ve motor dönmeyecekti. Eğer buton kullanmayacaksanız NUM değişkenine 100 sayısını yüklemenizi tavsiye
ederim.
GECIKME
MOVF IS,W
MOVWF SAYAC1
DONGU1
MOVF BEK,W
MOVWF SAYAC2
DONGU2
DECFSZ SAYAC2,1
GOTO DONGU2
DECFSZ SAYAC1,1
GOTO DONGU1
RETURN
END
;Burada çift döngülü bir gecikme oluşturuyoruz. Bu gecikme
miktarı ise yaklaşık olarak şu şekilde hesaplanmaktadır:
Gecikme(μs)=IS*BEK*3
Bu uygulamada servoyu orta pozisyona getirdiğimiz için 1
süresini 1.5 ms, 0 süresini ise 15 ms olarak ayarladım, siz de 1 süresini 0.6
ve 2.4 ms arasında değiştirerek diğer açı değerlerini bulabilirsiniz. 0
süresini ise hepsinde 15 ms olarak kullanabilirsiniz.
|
|
|
Re: atalay54
Yazan:: Tuna (Kayıtlı ) Tarih: 10-10-2008 16:59
» Yorumu cevapla...