pot kontrollu mini servo

Başlatan ihsan5888, 11 Nisan 2014, 01:45:35

ihsan5888

elimde bir adet TowerPro SG90 servo var,, bunu bir potun konumuna göre hareketini kontrol etmek istiyorum. aşağıda hazırladığım kod neden olduğunu anlamadığım bir şekilde çalışmıyor,,protonun help kısmındaki yerleri okudum ve ona göre yaptım. yardım ederseniz sevinirim.


Device 16F877A         
XTAL 4
Dim Pos As Word        ' Servo Position
Dim VAR1 As Word         ' pot Position
LCD_DTPIN = PORTB.4
LCD_RSPIN = PORTB.2
LCD_ENPIN = PORTB.3
LCD_INTERFACE = 4
LCD_LINES = 2
LCD_TYPE = 0
Cls                    ' Clear the LCD
           
ADCON1 = %10000000        ' Set analogue input on PORTA.0
PORTA = 0              ' PORTA lines low to read pot
TRISA = %00000111      ' Enable the button pins as inputs
Declare ADIN_RES 10       ' 10-bit result required
Declare ADIN_TAD FRC      ' RC OSC chosen
Declare ADIN_STIME 50     ' Allow 50us sample time


Main: 
VAR1 = ADIn 0
Pos=  (VAR1 * 2500)/1023 + 500     ' pot un konumu ile servonun konumunu iliskilendiren formül
Servo PORTB.0 , Pos
DelayMS 20             ' Servo update rate
Print At 1 , 1 , "Position=" , Dec,Pos , " "
Print At 2 , 1 ,  Dec,VAR1 , " "
GoTo Main

Maxim

geçenlerde bir servo denemesi yapmış ve ilk başta çalıştıramamıştım
birkaç incelik var, kodu arıyorum bulamadım henüz

pos datası başlangıç ve bitiş değerleri nedir?
delayms 16 yapmanız gerekebilir
kullanılan servoya has, değerler ile ufaktan oynanması gerekiyordu

ete

#2
BU konuda 2 kriter var. Birisi servo motor kontrol komutu her 20ms de bir verilmeli. Verilen puls ise motorun konumuna bağlı olarak 500-2000 us arasında değişmelidir.
Öncelikle Pot dan okunacak değeri maksimum 1023 olacağına göre bu değere karşılık 2000 değerini hesaplamak gerekir.
Min pot değerinde ise 500 değeri hesaplanmalıdır. 500us sabit bir değer olarak karşımıza çıktığına göre 2000-500=1500us lik değerin pot ile değiştirilmesi gerekir. O halde 1500/1024=1,46484375 gibi bir değer bulunur. 32 bit matematiğine uyarlar isek;
1,46484375*256=375 gibi bir değer buluruz. O halde formülümüz;

POS=(ADC+1)*/375+500 şeklinde olmalıdır.

Bu formülün genel matematiğe göre açılımı POS=((ADC+1)*375/256)+500 şeklinde dir.
Hemen bir örnek yapalım. Pot dan 511 (tam orta nokta değeridir) okuduğumuzu varsayalım.
POS=512*375/256+500=1250 değerini buluruz.
Pot Maksimum konumda iken,
POS=(1023+1)*375/256+500=2000 değerini buluruz.
Böylece sistem potun konumuna göre 500-2000 arasında bir değer üretecektir.
Bu sürenin her 20 ms de bir tekrarlanması söz konusu olunca BEKLE=20000-POS şeklinde bir hesaplama yapıp
SERVO Pin,POS komutunu verdikten sonra
Delayus BEKLE
demek yeterli olacaktır.

Ancak Servo komutunun işleyişini bilmiyorum. Bazı basic komutları 10us nin katları şekilnde puls üretiyorlar.
Böyle bir şey söz konusu ise POS değeri 10 a bölünerek SERVO komutuna verilmelidir.

Ete

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

muhittin_kaplan

#3
ben olsam Servo Komutuyla ile hiç uğraşmazdım (Zamanında Bende çalıştıramadım)

dim Duty as byte
Duty=1
TKR:
     PortB=%00000001
     Delayms Duty
     PortB=%00000000
     Delayms 20-Duty 
goto TKR


dener sonrasında ince ayrıntıya geçerdim.

Duty uS cinsinden Yapılırsa Daha Güzel Olur.

ihsan5888

hocam ne kadar uğraştıysam çalıştıramadım,, buradaki yazdığınız herşeyi denedim,, neden çalışmamış olabilir?

muhittin_kaplan

ihsan önce adc yi boşver

        Device 16F877A
        Xtal 4
        
        TRISD=$00
        DelayMS 10
    Dim Duty As Word
    Duty=1500
TKR:
     PORTD=%00000001
     DelayUS Duty
     PORTD=%00000000
     DelayUS 20000-Duty 
GoTo TKR
    Stop


şunu yaz derle ve rc servonun sinyalini portd.0 ına bağla ve besleme uçlarını ver servo ortalara biryere gelecek.