Servo motorların çalışma mantığı hakkında
Türkçe kaynak nerde bulabiliriz ?
www.antrak.org.tr/gazete
burda vardı bişeyler
dostum bir yerlere bununla ilgili bir yazı yazdım ama bir
arama yaptır step yada serv gibi yazarak
Bende bir ara servo motorların çalışma mantığı hakkında
Türkçe kaynak aradım ama bulamadım, sonradan clinic arkadaşın yazdığı program yardımcı oldu tabii. İnternette servo motor
sürücü devreleri bulabilirsin. Duyduğuma göre servo motorlar ile mikron mertebesinden işlem yapabiliyorsun. Bu yüzden CNC
tezgahlarında kullanılıyormuş.
itiraf: ordaki clinic bendim. :lol:
electronicman sana
gönderdiğim word dosyası duruyosa onu buraya kopyalayıp yapıştıralım.herkes öğrensin
:D :D :D :D :) :) :) :)
Piyasada çok kullanılan Hobby servo diye tabir ettiğimiz
servolarda 3 kablo vardır.1.si siyah yada kahverengi olanı toprak kırmızı Vcc sarı olan da
data kablosudur.Kaynaklar Vcc
gerilimini 5v uygulayın desede 12 volta kadar uygulayabilirsin.Bundan fazlası servoda anlamsız hareketlere neden olur.
Pic
16F84 ile kontrol etmek çok kolaydır.Data ucunu dirence gerek kalmadan direk çıkışlardan birine uygulayabilirsin.
Servoya
darbeleri PWM metoduyla yolluyoruz.En az 1ms en fazlada 2 ms doluluk oranına sahip kare dalga gönderiyoruz.ve en önemli
nokta bu
kare dalgaların periyodunun 20 ms olması!!!! Örneğin 1 ms doluluk oranı verirsen (bu tam sol demektir)19 ms de
boşluk vermek zorundasın.1.5ms doluluk
verirsen 18.5ms boşluk gibi.. servonun hareketini tamamlaması içinde bu işlemi en az
15 kere yapmalısın.yani 20 ms *15=300ms boyunca kare dalga
göndermeilsin.Aşağıda örnek bi program yazdım.Daha iyi
anlarsın. Bilmen gereken servoyu 1ms tam sol, 1.5ms orta,2ms tam sağ pozisyona getirir.
örnek: Program
Pic'in RB1 pinine bağlı servoyu sağa ve sola sürekli hareket ettirir.
basla movlw 016h ;2ms lik gecikme
için kullanılacak sabit
movwf doluluk
movlw 0C8h ;18 mslik gecikme için kullanılacak
sabit
movwf boşluk
call PWM
movlw 0Bh ;1ms lik gecikme için kullanılacak
sabit
movwf doluluk
movlw 0D3h ;19mslik gecikme için kullanılacak sabit
movwf bosluk
call PWM
goto basla
PWM bsf PORTB,1
movf doluluk,w
call delay
bcf PORTB,1
movf boşluk,w
call delay
incf sayac,f
movlw 15 ;20 ms periyotlu darbeyi 15 kere vererek
hareketi tamamlamasını sağlıyoruz.
subwf sayac,w
btfss STATUS,Z
goto
PWM
clrf sayac
return
delay movwf count1 ;gecikme hesabı
3*count1*count2 us şeklindedir.
loop1 movlw 01Eh ;3*30*22=1980us =yaklaşık 2 ms
movwf count2 ;3*30*200=18000us =18 ms
loop2 decfsz count2,f
goto loop2
decfsz count1,f
goto loop1
return
sayacı 15 değilde 12 alırsan bu
servonun hareketini hızlandırır. sağa sola daha hızlı hareket eder.20 alırsan da daha yavaş hareket eder.
servoyu istediğin
pozisyona getirmek için 1-1.5ms yada 1.5-2ms arasında doluluk oranlı darbeler uygula.mesela sağa yakın bi yerlerde durması
için
1.8ms ,ortaya yakın bi yerler için 1.6 veya 1.4 gibiii.
Benden bu kadar.Umarım yardımcı
olabilmişimdir.Takıldığın bi yer olursa tekrar sorabilirsin.
Evet arkadaşlar clinic james arkadaşımızın gönderdiği program
ve açıklama yukarıdadır. :D
bende bi yere kaydediyim bunu.yeri geliyor lazım oluyor 8)
8)
Arkadaşlar bilgi için teşekkür ederim.
Kullanım
açısından yardımcı oldu ancak çalışma mantığını nasıl bulabilirim. hani DC motorda içinden akım geçen iletken, manyetik alan
tarafından itilir vs... gibi. Bu şekil çalışma mantığı lazım bana.
:?:
http://www.geocities.com/donis1tr/P/picle.htm
antraktan barbarosun yazısı...
8)
SELAM
ARKADAŞLAR,
Yazdıkların için teşekkürler DOSTUM
Electronicman
Hobby servo diye tabir ettiğimiz bu 3 kablolu servoları en kolay ve
yakın nereden alabilirim.Fiyatı nedir? Bilen var mı?
sen sakaryadasın galiba.izmitte bulabilirsin.fiyatı 16 dolardı
en son aldığımda.
kadıköyde de mustanghobbies diye bi yer var sahra i cedid te .ordakiler daha kaliteli fiyatta 22 dolar civarı..
arkadaşlar servo motorla ilgili antrak'tan başka nerde bilgi
bulabilirim :?: bu konuda bana yardımcı olabilirmisiniz?ayrıca izmir'de bildiğiniz satıcı varmı?
teşekkürler...
hangi modelleri için açıklama arıyosun?servoyla ne
yapmayı düşünüyosun?
8) Teşekkür ederim
james .
Arkadaşlar yukarıdaki açıklama ve program aslında james
arkadaşımızın yazısıdır. Ben sadece siteye ekledim.
Piyasada birçok türde servo motor bulabilirsin,
kullanacağın yere göre türleri değişebilir. En basitleri 3 kablolu olan rc servolardır, dc brush ve dc brushless veya ac motorlar ise
torna tezgahlarında kullanılır.
Sene sonuı bitirm projem için motor arıyorum.Robot kol
yapmayı düşünüyorum.3 tane bağlantı kabosu olan hobi amaçlı faza yüksek güçlü olmayan servo motor arıyorum.Yardımcı
olursan sevinirim. :D
Size 3 kablolu servo yerine stepper motor kullanmanızı tavsiye ederim,
ben yaptığım robotta stepper motor kullandım ve kendi yazdığım software indexer'ı kullandım. Stepper motorlar adım atlasalar da
rc servolardan çok üstünler. Cpu fanları da rc servo tip motorlardır. Sürücü devresini denemek için kullanabilirsiniz. Rc servoları
da maket uçak satan yerlerden satın alabilirsiniz. Güçlü stepper motor satın almak isterseniz elimde az kullanılmış var, yardımcı
olabilirim.
http://www.baldor.com/pdf/manuals/1205-394.pdf
servolar hakkında...
abi ya bu servomotorun step motordan farkı var mı ya?
step ile servo hep karıştırılır ama farkı var servo motor
aslında aynı şaft üzerinde bir potansiyometresi yada buna benzer bir durum bilriren elemanı oılan motordur .step motorda adım
sayabilirsiniz ama servo aslında düz bir motordur....
Servo derken düz 2,4,6 kutuplu ac ve dc olarak çalışabilen
gerilim verildiğinde sürekli bir yöne dönebilen fırçalı fırçasız(kömürlü,kömürsüz) tork u zayıf motor olarak düşünün (özel devrelerle
torku(çevirme kuvveti) çok kuvvetli hale getirilebilir)
step de ise sadece dc 2,4 kutuplu gerilim verildiğinde sadece bir turda
kutup açısı (360/18 yani 20 de 1)kadar dönebilen tork u kuvvetli motor olarak düşünün
her ikiside uygulamalarda kullanılır
mesela yazıcı motorları steptir işlemci fan motoru
servodur ac ve dc çalışanı vardır gibi ama lazer yazıcı durum motoru tek
silindirli ateşlemeli bir motordur
Peki 50kg gibi agir bir robotun hareketini iki servo motorla saglamaya kalkissak nasil bir servo motor almaliyiz. Ayrica bu motorlarin cekecekleri akimlarda bir degisiklik olur mu? Ornegin bizim projede iki motor iki ayri tekerlege baglaniyor. Biri digerinden fazla donerse robot da donmeye baslayacak. Bu durum servo motorda da gecerli mi? Eger gecerliyse servo motorlara giden akimi kontrol etmek mumukun mu?
Selam;
50 kg. yukler icin basit oyuncak icin tasarlanan RC servo kullanamazsin !!!
50 kg hareket ettirilmesi kolay olmayan bir yuktur Step motorlada olacagini hic zannetmiyorum. (Step motorlu sistemlerde motoru iyi sürebilecek maharetli sürücüler var tabii ki, fiyatlari aldigin step motorun fiyatının katlarca fazlası olabilir. www.rta.it )
Tavsiyem, otomobillerde kullanılan cam silecek motorudur. Hem devir sayisi dusurulmus (reduktörlü ) hem de torklari cok iyidir. Hem de fiyatlari düşüktür. Piyasa da tonlarca bulabilirsin. 12 ve 24 VDC olanlari var. Bunlarla sakat arabalari falan yaptıklarını duymuştum. Buna bir de konum ile ilgili bir sensor koyarsin. Al sana mis gibi uzerinden amperlerce akım akıtabilip iyi torklar alabilecegin muthis bir servo. Kolay Gelsin.
selam.
Erol hocam bu konuda tecrübelisin sanırım...
tavsiye için teşekkürler.Sanırım genç arkadaşın ufkunu genişlettin silecek motoru ile. Gerçekten en kestirme çözüm bu sanırım.Eğer hareket sınırlı ise çok turlu potansiyometre ile basit pozisyon kontrolü yapılabilir. Fakat sürekli hareket için çözüm daha zor. Step motor amatör uğraşı için daha kullanışlı. Step motoru redüktöre uygulayabilirseniz işinizi görür. Aksi takdirde 50 kiloluk hareket eden bir nesneyi pozisyon kontrolü yapmak değil istediğin an durdurmak bile motor temin etmekten daha fazla ugraşı ve sürücü bilgisi istiyor. Sonu getirilememiş bir site var www.rahmifiliz.freeservers.com bir bakın yardımcı olabilirlermi...
PIC Based Serial Port Servo Controller
http://www.digitalnemesis.com/ash/projects/picservo/
servo için burada verilen bilgiler gayet güzel ...
ben de kendi yaptığım hs-300 standart servo uygulamasının kodlarını ve servo motorun sürülürken kendi önemli gördüğüm notları sizlere aktaracağım
şu anda hs-300 üretilmiyor. hs-322 en ucuz olan hi-tec servo 13$
yer : MMY mühendislik seyrantepe-ist 212 270 91 27-28
*************************************************************
;servo2.asm
;ekim-03
;16f877/4
;
;ferhat yaldız
;ferhatyaldiz@yahoo.com
;
;servo motorun sürülmesine yönelik programdır.
;basit servo rutinlerini ve zaman hesaplamalarını içermektedir.
;
;servo motor :
; içlerinde potansiyometre ve pozisyon geri beslemesi bulun-
;maktadır. işareti 20ms de bir yenilenmesi gerkmektedir.yani 50 hertz
;servo darbelerin genişliğine göre ileri veya geri çalışmaktadır.
;kare dalganın tepede kalma süresi
; ---1~1,5ms = geri
; ---1,5ms = hareketsizdir
; ---1,5~2ms = ileri
;yönde hareket etmektedir. dalganın toplam süresinin 20 ms olacağı
;unutulmamalıdır.
;hitec hs-300 standart servo motor kullanılmıştır. ve aşağıdaki
;uygulama modifiye edilmemiş(no hacking) servo motor için yani
;-90~+90 derece arası dönebilen motor için geçerlidir.
;hs-300 özellikleri:
; * 6v --->hız :60' - 0.16 sn --->tork :3,5kg/cm
; * 4,8v-->hız :60' - 0.19 sn --->tork :3,0kg/cm
;
;kırmızı = +V
;siyah = toprak
;sarı = signal
;
;servo motorun signal ucu 877 nin portd0 nolu ucuna bağlanmıştır.
;
;program böylece daha modüler bir hale getirilmiştir. çünkü ana
;gecikme timer0 ile sağlandığından bu gecikme sürecince dünya kadar
;işlem mikrodenetleyiciye yaptırılabilir.
;
;servo motor ve gerekli rutinler hakkında servo1.asm'de bilgilere
;bakılabilir.
; 0'
; |
; |
-90'----------+90'
;
;timer0 kullanılmıştır. timer0 önyüklemesi sayesinde bize her 15ms de
;kesme yapacaktır. servo 20ms de bir yenilenmesi gerektiğinden bu
;süre 15ms olarak ayarlanmıştır. Kesmede ise ileri veya geri
;sinyalleri ile ileriden geriye ve geriden ileriye dönüşlerde bekleme
;süreleri oluşturulacak ve bu sürelerin kontrolleri kesme alt
;yordamında yapılacaktır
;
;servo motorun ilk pozisyonu -90' olduğu varsayılıp program buna göre
;yazılmıştır.
;program mplab 6,30 ile yazılmış olup aynı ortamda derlenmiştir.
; -- motor ileri veya geri gittikten sonra diğer pozisyonu alması
;için beklemesi yani signal=0 durumunda belli bir süre tutulması
;gerekiyor. aşağıda bazı sürelerde denemler verilmiştir. bekleme
;süresi motorun içindeki kontrol devresinin diğer yöne dönebilmesi
;gerektiğini anlayabilmesi için gereklidir.
; ** 5ms -- dönme yapmamakta
; ** 120ms-- dönme sorunsuzca yapmakta
; ** 50ms -- 10-15 dönmeden sonra -90 sınır bölgesinde tıkanmakta
; ** 40ms -- 10-15 " " " " " "
;
; --servo motorun bir özelliği görüldü.+90 derecesinden 150ms sola
;git denildiğinde önce belli bir açı(25~30 derece)gidiyor.bu noktayı
;kendisine satıh(girilmemesi gerken bölge)olarak alıyor ve daha sonra
;ileri ve geri giderken bu noktayı geçmemeye çalışıyor ancak -90
;derece sathını belirleyemediğinden o noktaya geldiğinde yazılımdan
;bağımsız olarak kendini o sınır noktasını geçmeye zorlayacaktır ve
;orada tıkanacaktır. bu durumda fazla akım çekecek ve ömrü
;kısalacaktır. bununla ilgili notlar servo1.bmp de verilmiştir.
;
;
;OK! 2nd week october
;
;OK! 2nd week october
;****************************************************************
TITLE "SERVO2.ASM"
LIST P=16F877
INCLUDE <P16F877.INC>
ERRORLEVEL -302
ERRORLEVEL -224
__CONFIG _WDT_OFF&_PWRTE_OFF&_XT_OSC&_CP_OFF
;****************************************************************
CBLOCK 20h ;BANK0 general purpose ram area
w_temp ;kesme için
delayC_1 ;gecikme rutini için
delayC_2
cevrim ;servo gecikme döngü sayısı
coef1 ;gecikme rutin katsayıları
coef2
status_temp ;kesme için
pclath_temp ;kesme için
ENDC
;
BANK0 MACRO ;bank0 macro
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK1 MACRO ;bank1 macro
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
;
INT_giris MACRO ;kesme giriş macro
MOVWF w_temp ;16f87x datasheet den
SWAPF STATUS,W ;alınmıştır
CLRF STATUS
MOVWF status_temp
MOVF PCLATH,W
MOVWF pclath_temp
CLRF PCLATH
ENDM
;
INT_cikis MACRO ;kesme çıkış macro
MOVF pclath_temp,w
MOVWF PCLATH
SWAPF status_temp,w ;16f87x datasheet den
MOVWF STATUS ;alınmıştır
SWAPF w_temp,f
SWAPF w_temp,w
ENDM
;
ser_ileri MACRO ;servo ileri +5v için
MOVLW D'30'
MOVWF coef1
MOVLW D'22'
MOVWF coef2
ENDM
;
ser_geri MACRO ;servo geri +5v için
MOVLW D'10'
MOVWF coef1
MOVLW D'32'
MOVWF coef2
ENDM
;
ser_neu MACRO ;servo neutral +5v için
MOVLW D'5'
MOVWF coef1
MOVLW D'100'
MOVWF coef2
ENDM
;************************************************************
ORG 0
GOTO MAIN
ORG 4
GOTO SERVO
;************************************************************
MAIN
CALL init877
CALL dongu
;************************************************************
init877
BANK1 ;bank 1 e geç
CLRF TRISD ;portd çıkış
MOVLW B'10010111';rpbu=1 pull-up disable
;t0cs=0 internal cycle clock
;t0se=1 high-to-low ra4 clock
;psa=0 prescaler for timer0
;ps2:ps0=1/256
MOVWF OPTION_REG
BANK0
MOVLW B'10100000';gie=1 blobal int enable
;t0ie=1 enable tmr0 int
;t0if=0 tmr0 did not overflow
MOVWF INTCON
CLRF PORTD
CLRF delayC_1
CLRF delayC_2
CLRF coef1
CLRF coef2
CLRF w_temp
CLRF status_temp
CLRF cevrim
MOVLW D'197' ;saymaya başla her 15,1ms de bir kesme
MOVWF TMR0 ;tmr0=1us*256*(256-197)=15,1ms
BCF PORTD,0 ;pd0 ="0"
RETURN
;***********************************************************
dongu
BCF PORTD,0
GOTO dongu
;************************************************************
;int subroutine
;
;cevrim = 0~20 arası servo_ileri (~300ms)
;cevrim = 20~30 arası servo_wait1 (~150ms)
;cevrim = 30~50 arası servo_geri (~300ms)
;cevrim = 50~60 arası servo_wait2 (~150ms)
SERVO
INT_giris
INCF cevrim,f ;cevrim=cevrim+1
MOVLW D'20';ileri veya geri çarpanı =20 ayarlanır
SUBWF cevrim,w
BTFSC STATUS,C ;cevrim < 20 ise servo_ileri ye atla
GOTO servo_wait1 ;cevrim >= 20 ise servo_wait
servo_ileri ;----->ileri
BSF PORTD,0 ;pd0="1"
ser_ileri
CALL Delay ;1ms bekle
BCF PORTD,0
GOTO int_son_
servo_wait1
BCF PORTD,0
MOVLW D'30'
SUBWF cevrim,w
BTFSC STATUS,C ;cevrim 20~ 30 arasında int_son_
GOTO servo_cont ;cevrim >= 30 ise servo_ileri
GOTO int_son_
servo_cont
BCF PORTD,0
MOVLW D'50' ;
SUBWF cevrim,w
BTFSC STATUS,C ;cevrim 30~ 50 arasındaysa servo_geri
GOTO servo_wait2 ;cevrim >=50 ise bekle
servo_geri ;<------ geri
BSF PORTD,0 ;pd0="1"
ser_geri
CALL Delay ;2ms bekle
BCF PORTD,0
GOTO int_son_
servo_wait2
BCF PORTD,0
MOVLW D'60'
SUBWF cevrim,w
BTFSC STATUS,C ;cevrim 50~ 60 int_son_
CLRF cevrim ;cevrim >=60 ise cevrim = 0
int_son_
BCF INTCON,T0IF;timer enable
MOVLW D'197' ;saymaya başla her 15,1ms de bir kesme
MOVWF TMR0 ;tmr0=1us*256*(256-197)=15,1ms
INT_cikis
RETFIE
;***********************************************************
;Delay
;servo ileri
;coef1=30, coef2=22--->3*30*22 + 4*30 =2,1 ms ---> +5v
;servo geri
;coef1=10, coef2=32 --->3*10*32 + 4*10 =1 ms ----> +5v
;servo neutral
;coef1=5, coef2=100 --->3*5*100 + 4*5 =1,52ms ----> +5v
;
;coef1=200, coef2=200-->3*200*200 + 4*200 =120ms
Delay
MOVF coef1,w
MOVWF delayC_1
Dongu1_
MOVF coef2,w ;1*coef1
MOVWF delayC_2 ;1*coef1
Dongu2_
DECFSZ delayC_2,F ;1*coef2*coef1
GOTO Dongu2_ ;2*coef2*coef1
DECFSZ delayC_1,F ;1*coef1
GOTO Dongu1_ ;1*coef1
RETURN
;***********************************************************
END
servo için burada verilen bilgiler gayet güzel ...
ben de kendi yaptığım hs-300 standart servo uygulamasının kodlarını ve servo motorun sürülürken kendi önemli gördüğüm notları sizlere aktaracağım
şu anda hs-300 üretilmiyor. hs-322 en ucuz olan hi-tec servo 13$
yer : MMY mühendislik seyrantepe-ist 212 270 91 27-28
*************************************************************
;servo2.asm
;ekim-03
;16f877/4
;
;ferhat yaldız
;ferhatyaldiz@yahoo.com
;
;servo motorun sürülmesine yönelik programdır.
;basit servo rutinlerini ve zaman hesaplamalarını içermektedir.
;
;servo motor :
; içlerinde potansiyometre ve pozisyon geri beslemesi bulun-
;maktadır. işareti 20ms de bir yenilenmesi gerkmektedir.yani 50 hertz
;servo darbelerin genişliğine göre ileri veya geri çalışmaktadır.
;kare dalganın tepede kalma süresi
; ---1~1,5ms = geri
; ---1,5ms = hareketsizdir
; ---1,5~2ms = ileri
;yönde hareket etmektedir. dalganın toplam süresinin 20 ms olacağı
;unutulmamalıdır.
;hitec hs-300 standart servo motor kullanılmıştır. ve aşağıdaki
;uygulama modifiye edilmemiş(no hacking) servo motor için yani
;-90~+90 derece arası dönebilen motor için geçerlidir.
;hs-300 özellikleri:
; * 6v --->hız :60' - 0.16 sn --->tork :3,5kg/cm
; * 4,8v-->hız :60' - 0.19 sn --->tork :3,0kg/cm
;
;kırmızı = +V
;siyah = toprak
;sarı = signal
;
;servo motorun signal ucu 877 nin portd0 nolu ucuna bağlanmıştır.
;
;program böylece daha modüler bir hale getirilmiştir. çünkü ana
;gecikme timer0 ile sağlandığından bu gecikme sürecince dünya kadar
;işlem mikrodenetleyiciye yaptırılabilir.
;
;servo motor ve gerekli rutinler hakkında servo1.asm'de bilgilere
;bakılabilir.
; 0'
; |
; |
-90'----------+90'
;
;timer0 kullanılmıştır. timer0 önyüklemesi sayesinde bize her 15ms de
;kesme yapacaktır. servo 20ms de bir yenilenmesi gerektiğinden bu
;süre 15ms olarak ayarlanmıştır. Kesmede ise ileri veya geri
;sinyalleri ile ileriden geriye ve geriden ileriye dönüşlerde bekleme
;süreleri oluşturulacak ve bu sürelerin kontrolleri kesme alt
;yordamında yapılacaktır
;
;servo motorun ilk pozisyonu -90' olduğu varsayılıp program buna göre
;yazılmıştır.
;program mplab 6,30 ile yazılmış olup aynı ortamda derlenmiştir.
; -- motor ileri veya geri gittikten sonra diğer pozisyonu alması
;için beklemesi yani signal=0 durumunda belli bir süre tutulması
;gerekiyor. aşağıda bazı sürelerde denemler verilmiştir. bekleme
;süresi motorun içindeki kontrol devresinin diğer yöne dönebilmesi
;gerektiğini anlayabilmesi için gereklidir.
; ** 5ms -- dönme yapmamakta
; ** 120ms-- dönme sorunsuzca yapmakta
; ** 50ms -- 10-15 dönmeden sonra -90 sınır bölgesinde tıkanmakta
; ** 40ms -- 10-15 " " " " " "
;
; --servo motorun bir özelliği görüldü.+90 derecesinden 150ms sola
;git denildiğinde önce belli bir açı(25~30 derece)gidiyor.bu noktayı
;kendisine satıh(girilmemesi gerken bölge)olarak alıyor ve daha sonra
;ileri ve geri giderken bu noktayı geçmemeye çalışıyor ancak -90
;derece sathını belirleyemediğinden o noktaya geldiğinde yazılımdan
;bağımsız olarak kendini o sınır noktasını geçmeye zorlayacaktır ve
;orada tıkanacaktır. bu durumda fazla akım çekecek ve ömrü
;kısalacaktır. bununla ilgili notlar servo1.bmp de verilmiştir.
;
;
;OK! 2nd week october
;
;OK! 2nd week october
;****************************************************************
TITLE "SERVO2.ASM"
LIST P=16F877
INCLUDE <P16F877.INC>
ERRORLEVEL -302
ERRORLEVEL -224
__CONFIG _WDT_OFF&_PWRTE_OFF&_XT_OSC&_CP_OFF
;****************************************************************
CBLOCK 20h ;BANK0 general purpose ram area
w_temp ;kesme için
delayC_1 ;gecikme rutini için
delayC_2
cevrim ;servo gecikme döngü sayısı
coef1 ;gecikme rutin katsayıları
coef2
status_temp ;kesme için
pclath_temp ;kesme için
ENDC
;
BANK0 MACRO ;bank0 macro
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK1 MACRO ;bank1 macro
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
;
INT_giris MACRO ;kesme giriş macro
MOVWF w_temp ;16f87x datasheet den
SWAPF STATUS,W ;alınmıştır
CLRF STATUS
MOVWF status_temp
MOVF PCLATH,W
MOVWF pclath_temp
CLRF PCLATH
ENDM
;
INT_cikis MACRO ;kesme çıkış macro
MOVF pclath_temp,w
MOVWF PCLATH
SWAPF status_temp,w ;16f87x datasheet den
MOVWF STATUS ;alınmıştır
SWAPF w_temp,f
SWAPF w_temp,w
ENDM
;
ser_ileri MACRO ;servo ileri +5v için
MOVLW D'30'
MOVWF coef1
MOVLW D'22'
MOVWF coef2
ENDM
;
ser_geri MACRO ;servo geri +5v için
MOVLW D'10'
MOVWF coef1
MOVLW D'32'
MOVWF coef2
ENDM
;
ser_neu MACRO ;servo neutral +5v için
MOVLW D'5'
MOVWF coef1
MOVLW D'100'
MOVWF coef2
ENDM
;************************************************************
ORG 0
GOTO MAIN
ORG 4
GOTO SERVO
;************************************************************
MAIN
CALL init877
CALL dongu
;************************************************************
init877
BANK1 ;bank 1 e geç
CLRF TRISD ;portd çıkış
MOVLW B'10010111';rpbu=1 pull-up disable
;t0cs=0 internal cycle clock
;t0se=1 high-to-low ra4 clock
;psa=0 prescaler for timer0
;ps2:ps0=1/256
MOVWF OPTION_REG
BANK0
MOVLW B'10100000';gie=1 blobal int enable
;t0ie=1 enable tmr0 int
;t0if=0 tmr0 did not overflow
MOVWF INTCON
CLRF PORTD
CLRF delayC_1
CLRF delayC_2
CLRF coef1
CLRF coef2
CLRF w_temp
CLRF status_temp
CLRF cevrim
MOVLW D'197' ;saymaya başla her 15,1ms de bir kesme
MOVWF TMR0 ;tmr0=1us*256*(256-197)=15,1ms
BCF PORTD,0 ;pd0 ="0"
RETURN
;***********************************************************
dongu
BCF PORTD,0
GOTO dongu
;************************************************************
;int subroutine
;
;cevrim = 0~20 arası servo_ileri (~300ms)
;cevrim = 20~30 arası servo_wait1 (~150ms)
;cevrim = 30~50 arası servo_geri (~300ms)
;cevrim = 50~60 arası servo_wait2 (~150ms)
SERVO
INT_giris
INCF cevrim,f ;cevrim=cevrim+1
MOVLW D'20';ileri veya geri çarpanı =20 ayarlanır
SUBWF cevrim,w
BTFSC STATUS,C ;cevrim < 20 ise servo_ileri ye atla
GOTO servo_wait1 ;cevrim >= 20 ise servo_wait
servo_ileri ;----->ileri
BSF PORTD,0 ;pd0="1"
ser_ileri
CALL Delay ;1ms bekle
BCF PORTD,0
GOTO int_son_
servo_wait1
BCF PORTD,0
MOVLW D'30'
SUBWF cevrim,w
BTFSC STATUS,C ;cevrim 20~ 30 arasında int_son_
GOTO servo_cont ;cevrim >= 30 ise servo_ileri
GOTO int_son_
servo_cont
BCF PORTD,0
MOVLW D'50' ;
SUBWF cevrim,w
BTFSC STATUS,C ;cevrim 30~ 50 arasındaysa servo_geri
GOTO servo_wait2 ;cevrim >=50 ise bekle
servo_geri ;<------ geri
BSF PORTD,0 ;pd0="1"
ser_geri
CALL Delay ;2ms bekle
BCF PORTD,0
GOTO int_son_
servo_wait2
BCF PORTD,0
MOVLW D'60'
SUBWF cevrim,w
BTFSC STATUS,C ;cevrim 50~ 60 int_son_
CLRF cevrim ;cevrim >=60 ise cevrim = 0
int_son_
BCF INTCON,T0IF;timer enable
MOVLW D'197' ;saymaya başla her 15,1ms de bir kesme
MOVWF TMR0 ;tmr0=1us*256*(256-197)=15,1ms
INT_cikis
RETFIE
;***********************************************************
;Delay
;servo ileri
;coef1=30, coef2=22--->3*30*22 + 4*30 =2,1 ms ---> +5v
;servo geri
;coef1=10, coef2=32 --->3*10*32 + 4*10 =1 ms ----> +5v
;servo neutral
;coef1=5, coef2=100 --->3*5*100 + 4*5 =1,52ms ----> +5v
;
;coef1=200, coef2=200-->3*200*200 + 4*200 =120ms
Delay
MOVF coef1,w
MOVWF delayC_1
Dongu1_
MOVF coef2,w ;1*coef1
MOVWF delayC_2 ;1*coef1
Dongu2_
DECFSZ delayC_2,F ;1*coef2*coef1
GOTO Dongu2_ ;2*coef2*coef1
DECFSZ delayC_1,F ;1*coef1
GOTO Dongu1_ ;1*coef1
RETURN
;***********************************************************
END
Arkadaslar aslında kavram kargaşası var.
Servo uygulamalarında kullanılan motora servo motor denir. Bu
motor
DC, AC yada herşey olabilir.
Servo motorla yapılmış servo sistemine de kısaca servo denir.
Model uçaklarda vs gördüğünüz küçük kutucuk servo
sistemdir.
Giriş yapma açısından kısa bilgiye www.geocities.com/pidpwm sayfasından erişebilirsiniz.
:arrow: http://www.imagesco.com/articles/picservo
Teşekkürler 00050319 ,
Using Servomotors with the PIC Microcontroller
Link'i tekrar yazayım dostum.
http://www.imagesco.com/articles/picservo/01.html
http://www.imagesco.com/articles/picservo/02.html
http://www.imagesco.com/articles/picservo/03.html
.............
Konudan bir örnek:
(http://www.imagesco.com/images/picservo/fig02.gif)
----Listing 1----
' First servomotor program
' Sweeps left to right, then reverses
Symbol B1 = pw ' create a variable pw
pw = 100 ' start at extreme left
sweep: pulsout 0,pw ' send pulse to motor
pause 18 ' set frequency to about 50 Hz
pw = pw + 1 ' increase pw by 1
if pw > 200 then back ' at extreme right, turn CCW
goto sweep ' otherwise, continue
back: pulsout 0,pw ' send pulse to motor
pause 18 ' set frequency to about 50 Hz
pw = pw - 1 ' decrease pw by 1
if pw < 100 then sweep ' at extreme left, turn CW
goto back ' otherwise, continue
----End of Listing 1----
****
********
Controlling Stepper Motors with a PIC Microcontroller
Bu konuya ait link de aşağıda.
http://www.imagesco.com/articles/picstepper/01.html