pıc basıc servo kontrol cod sıkıntısı!!

Başlatan atknck, 26 Ocak 2016, 02:16:11

atknck

Define LOADER_USED 1
DEFINE OSC 20
DEFINE ADC_BITS 10 ' Set number of bits in result
DEFINE ADC_CLOCK 3 ' Set clock source (3=rc)
DEFINE ADC_SAMPLEUS 50 ' Set sampling time in uS

AD0 VAR WORD '
pos    Var Word     ' Servo position
servo1 Var PORTC.1  ' Alias servo pin
HIZ VAR BYTE
   ADCON1 = %10001110       ' PORTA.0 analog

   Pause 100        ' Wait for LCD to startup

   OPTION_REG = $7f ' Enable PORTB pullups
   Low servo1       ' Servo output low
   Gosub orta     ' Center servo

' Main program loop
basla:

ADCIN 0, AD0' SPEED
IF AD0 > 1000 THEN AD0 = 1000
IF AD0 < 10 THEN AD0 = 10
HIZ = AD0 / 10

   PORTB = 0        ' PORTB lines low to read buttons
   TRISB = $fe      ' Enable first button row

   ' Check for button press to move servo
   If PORTB.6 = 0 Then  ' SW1 on LAB-X1 keypad
      Gosub sag
   Endif
   If PORTB.5 = 0 Then  ' SW2 on LAB-X1 keypad
      Gosub orta
   Endif
   If PORTB.4 = 0 Then  ' SW3 on LAB-X1 keypad
      Gosub sol
   Endif


   servo1 = 1      ' Start servo pulse
   Pauseus 700 + pos
   servo1 = 0      ' End servo pulse
   Pause 10        '
   Goto basla  ' Do it all forever

' Move servo left
sol:
   If pos < 2000 Then
      pos = pos + HIZ
   Endif
   Return

' Move servo right
sag:
   If pos >= 0 AND POS < 65000 Then
    pos = pos - HIZ
      IF POS > 65000 Then  POS = 0
   Endif
   Return

' Center servo
orta:
   pos = 1000
   Return

   End

ete

Hala ne tür bir sıkıntı var belli edilmemiş gözüküyor.
Sistem Pot dan 0-1000 arasında bir değer okuyup bunu 10'a bölerek hız bilgisini oluşturuyor. Bu durumda maksimum hız bilgisi 100 olabiliyor demektir. 
En başta program Orta etiketine giderek oradan Pos=1000 değerini okuyor. Sonra Servo çıkışına 700+Pos=1700 us lik bir puls uyguluyor. Bu puls motoru orta konuma getiriyor.
Ardından sağ yada sol butonlarından hangisine basılır ise bu POS bilgisine HIZ bilgisi ekleniyor yada çıkartılıyor.
Örnek verilecek olursa diyelimki SOL butonuna basıldı. Böylece program POS=POS+HIZ eşitliği ile 1000 olan Pos değerine 100 olan (Pot değerin maksimum da olduğunu kabul ederek) POS=1100 değerini buluyor.
Sonra motora 700+1100=1800 us lik bir puls uyguluyor buda motorun hafifçe sola dönmesini sağlıyor.
Benzer şekilde SAG butonuna basıırsa bu sefer Pos değerinden HIZ miktarı çıkartılıyor. Pos=Pos-HIZ=1100-100=1000 olarak bulunuyor ve motora bu sefer tekrar 700+1000=1700us lik bir puls uygulanmış oluyorki buda motoru tekrar orta konuma alıyor. Tabiiki Motorun sağa yada sola alınış miktarını Pot belirlemiş oluyor. Maksimum konumda artışlar veya eksilmeler 100'er , pot orta konumda iken artışlar veya eksilmeler 51 olarak uygulanmış oluyor. Sonuçta pot servo motorun konum değiştirmesindeki ilerleme miktarını belirlemiş oluyor.
Burada dikkat edilecek husus şudur. Step motorlar çoğunlukla 500-2000 us lik pulslar ile çalışırlar. Burada min puls miktarı 500 değil 700 us olarak uygulanmış. Bu her motora uymayabilir.

Ete

atknck

hocam sağ etiketinde yapılan işlemi anlayamadım devrenin resmini attım hocam

ete

Sağ etiketinde Motorun sağa dönmesi için gerekli zaman hesabı yapılıyor.
Diyelimki HIZ=100 hesaplandı. Sağ etiketinde neler var bakalım;
sag:
   If pos >= 0 AND POS < 65000 Then
    pos = pos - HIZ
      IF POS > 65000 Then  POS = 0
   Endif
   Return

POS değeri başlangıç değeri olan 1000 olmuş olsun.

   If pos >= 0 AND POS < 65000 Then
komut satırınd Pos değeri sıfırdan büyük ve 65000 den küçük olduğu için alttaki satıra geçer program.
POS=POS-HIZ yani POS=1000-100=900 olur.
Program SAĞ etiketine her gelişte POS değeri 100 eksilir. Sonunda önce sıfır olur ve şayet;
POS=0 iken POS=POS-HIZ komut satırı çalışırsa ki çalışacak POS=0-100=65536-100=65436
Bu yüzden hemen altındaki satırda şayet Pos değeri 65000 den büyük ise POS=0 olsun diye komut ilave edilmiş.
Sonuçta kod POS değeri çıkartılacak sayıdan büyük olduğu müddetçe hesap normal şekilde yapılıp işlem tamamlanıyor.
Ancak Pos değeri çıkartılacak sayıdan küçük olunca sonuç 65000 lerin üzerinde çıkıyor ve yazan arkadar bu durma karşı tedbir almış. Bu gibi durumlarda yani POS=POS-HIZ gibi bir formülünüz var ise ve HIZ değeri POS değerinden büyük olma ihtimali var ise hesabı şu şekilde yapabilirsiniz. POS=(POS+65536)-HIZ   
Bu kod daha akıllıca şöyle yazılabilirdi.
sag:
   If pos >= 0 AND POS < 2000 Then
    pos = pos - HIZ
      IF POS > 2000 Then  POS = 0
   Endif
   Return

Ete

Powered by EzPortal