|
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.
|