avatar_ete

PIC Basic Ders-12 (Servo Motor Kontrolü)

Başlatan ete, 28 Ağustos 2011, 16:23:45

pwm3434

sinancnc tusun birisine basınca motor  sağa  diğer  tusa  basınca  sola  döner.  ekteki  bası  inceledim, ıf komutu  içindeki portb  atamaları  iş  gördümü ki. neyse  bir dosya ekledim   iki  tus  var  birisi motoru  sağa  diğer  tus  ise sola  dönderir. sağa  sola  nasıl  dönecektir  diye  soracak gibisin  sinancnc.  motorun  yönünü  değiştirmen için  mesela  video daki  motorun  saat  yönünde  dönüyor  saat  yönü tersine  döndürmen   için  ise  pals  uygulamasını son bobin uçtan  baş  uc yönüne  pals  vermen  gerekli.

mesela saat  yönü  için  şu  komutlarını  verdiğini  varsayalım:
hıgh portb.1
pause 10
hıgh portb.2
pause 10
hıgh portb.3
pause 10
hıgh portb.4
pause 10

saat  yönü  tersine döndürmen için  ise  şu  komutları  vermelisin
hıgh portb.4
pause 10
hıgh portb.3
pause 10
hıgh portb.2
pause 10
hıgh portb.1
pause 10

yani  dikkatlice bakarsan farkı  görebilirsin. iki  yön içinde  palsları aynı uclara  vermeliyiz ancak kombinansyonlar  farklı olmalıdır.
umarım  işine  yarar. 

başka  bir konu  ise  azicane  tavsiyem,    istediğin  soruları  sorabilirsin  ama  biraz  arştır ki karşındaki  insanlar  senin bir şeyler yapmak  istediğini  anlayıp ve  yardım  etsin. çünkü  her  insanın  kendisine  göre  başında  türlü  türlü  işleri  vardır  diye  düşünüyorum  vakit  ayırmak  gerçekten  sorun  başka  bir  değişle zamanın  çok dar  olması. neyse  kolay  gelsin


sinancnc

Alıntı yapılan: pwm3434 - 22 Şubat 2013, 20:54:36
sağa  sola  nasıl  dönecektir  diye  soracak gibisin  sinancnc.

Hocam herşeyi sormamı eleştirmişsin sormadığım soruyu tahmin edip cevaplamışsın öncelikle bu kadar içten yardımcı olduğun için teşekkür ederim.. Projenin son halini ek olarak atayım araştırdığımı gör ve bana yardım et diye .. Saygılar

Örnekte Özellikle ete hoca ,invertör bey, ve ilyas bey katkılarıyla
16f877a ile
LCD + EEPROM + ADC + STEP örneklerinin tümü aynı uygulamada var ve çok güzel bir şekilde uygulamasıda bitti..
Paylaşmayı seven insan toprak olup gitmez. Bir şeyler bırakır...!

pwm3434

sinancnc  eleştiri    olarak  değilde  tavsiye  yönünde  baksan  daha  iyi olur  çünkü  bende  senin  gibi  amatörüm, eleştiri  olarak anlaşılmışsa  mesajımdan  dolayı özür dilerim  çünkü  herhangi  bir  konu da  tartışma  taraftarı değilim.  neyse ekte ki bas uzantılı  dosyaya  baktım, step adım  pals  bölümünde  sorun  yok.yön  kontrolu  bu  şekilde  bildiğim  kadarıyla. başarılar  sinancnc  görüşmek  üzere.

sinancnc

#33
ATAMA        VAR     BYTE[4]
ATAMA[0]= %00000001
ATAMA[1]= %00000010
ATAMA[2]= %00000100
ATAMA[3]= %00001000

üstadlar step motoru yukarıda gördüğünüz şekilde sıra saydırarak ileri ve geri şeklinde sürüyorum . bu tam adım sürme modunda yaznlız ilk sefere mahsus adımı 7.5 derece olan motoru yarım adım 3.75 derece sürüyor ve taki devrenin elektiriğini kapatana kadar hiç hata yapmıyor.. ilk voltajın geldiği bacakta yarım sonrakilerde tam adım sürme şeklinden nasıl kurtulabilirim.
Paylaşmayı seven insan toprak olup gitmez. Bir şeyler bırakır...!

sinancnc

#34
çözüm olarak bir üstadın devresini buldum (MUCİT 23) benim için bayağı aydınlatıcı oldu kendisine ekteki fotoğrafta eklediği devre için buradan teşekkür ederim. sizce l297 ve l298 devresi ile kurulan bir devre kaç amper motor sürebilir.

Paylaşmayı seven insan toprak olup gitmez. Bir şeyler bırakır...!

Mucit23

l298 in Max kapasitesi kadar tabiki,

Datasında 2A yazıyor ama çok iyi soğutulması gerekir. 
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

yusuf.ozyer

hocam iyi akşamlar hocam ben robot kol yapıyorum 6 adet servo motor var kendim sizin verdiğiniz örneklerle biraz uğraştım lcd yi kaldırdım onun gibi şeyler yaptım
elimde sadece bir tane  servo var (5 tane daha alacağım) o sadece 1 taneyi çalıştırmak istedim ama olmadı bi karışık çalışıyor. pot olarak 100k kullandım servo ise futaba s3003
kodlar :
'****************************************************************
'*  Name    : ROBOT KOL  .BAS                                   *
'*  Author  : [YUSUF ÖZYER]                                     *
'*  Notice  : Copyright (c) 2007 [E.T.E]                        *
'*          : All Rights Reserved                               *
'*  Date    : 24.11.2007                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
PORTA=0:TRISA=%11111111
PORTB=0:TRISB=%00000000
PORTC=0:TRISC=%00000000
PORTD=0:TRISD=%00000000
PORTE=0:TRISE=%11111111
ADCON1 =9
'-----------------------------------------------------------------
@ DEVICE PIC16F877A, WDT_OFF 'Watch Dog timer kapalı
@ DEVICE PIC16F877A, PWRT_ON 'Power on timer açık
@ DEVICE PIC16F877A, PROTECT_OFF 'Kod Koruma kapalı
@ DEVICE PIC16F877A, BOD_ON
@ DEVICE PIC16F877A, XT_OSC
'-----------------------------------------------------------------
Define ADC_BITS 8
Define ADC_CLOCK 3
Define ADC_SAMPLEUS 50

HAMA var byte
HAMB VAR BYTE
HAMC VAR BYTE
HAMD VAR BYTE
HAME VAR BYTE
HAMF VAR BYTE
SUREA VAR BYTE
SUREB VAR BYTE
SUREC VAR BYTE
SURED VAR BYTE
SUREE VAR BYTE
SUREF VAR BYTE
SURE VAR WORD

pause 250

BASLA:
PORTC = 0
    pulsout PORTC.0,SUREA
    pulsout PORTC.1, SUREB
    pulsout PORTC.2, SUREC
    pulsout PORTC.3, SURED
    pulsout PORTC.4, SUREE
    pulsout PORTC.5, SUREF
    SURE = (SUREA + SUREB + SUREC + SURED + SUREE + SUREF)*10
    SURE = 12000 - SURE  'ASLINDA 20.000 DEN ÇIKARMAK GEREK AMA KOMUT GECİKMELERİ NEDENİ İLE 12000
   
    pauseus SURE
   
    Adcin 0, HAMA :SUREA=(HAMA+1)*/200
    Adcin 1, HAMB :SUREB=(HAMB+1)*/200
    Adcin 2, HAMC :SUREC=(HAMC+1)*/200
    Adcin 3, HAMD :SURED=(HAMD+1)*/200
    Adcin 4, HAME :SUREE=(HAME+1)*/200
    Adcin 5, HAMF :SUREF=(HAMF+1)*/200
    goto BASLA
end


ete

100 K lık pot bu iş için uygun değil. 1K olmalıdır. Uygun değil derken çalışır ama 1K daha iyi netice verir.

Bir genelleme yapacak olursak Servo Motorlar (RC tipi Servolar) genellikle 500us ile 2000us lik peryot aralığında çalışır ve verilen puls süresine göre konum değiştirir. Bu birinci paramtremiz oluyor.
İkinci parametre ise verilen puls lerin her 20ms de bir tekrarlanması zorunluluğudur.
Şimdi bu iki tedmel bilgi üzerinden programına bakalım.
ADC portundan pot değerini okuyup ona uygun pals değerini hesaplayıp motora veriyorsun. Programın temel mantığı bu. Ancak hesapları doğru yapıyormusun ona bakalım.
Adcin 0, HAMA :SUREA=(HAMA+1)*/200  , komut satırında SUREA maksimum ne hesaplanabilir hesabı yaptınmı?
Programın başında yer alan komutlara bakılırsa ADC okumanı 8 bitlik değer elde edecek şekilde yapıyorsun.
Bu durumda okunacak enbüyük değer 255 olacaktır. Bunu okuduğumuzu varsayalım.
SUREA=(255+1)*/200=200 olarak hesaplanır. Demekki seninformülün pot değerine bağlıolarak 0-200 arasında bir sayı hesaplar. Pulsout komut 4Mhz frekansda 10 katı olarak çalışır. Yani PULSOUT Pin,200 şeklinde komut verdiğin zaman bu aslında Pulsout pin,2000 olarak çalışır. Yani ilgili pinden 2000us (2ms) lik bir puls çıkartır.
Buraya kadar yanlış olan bir şey yok. Ancak yanlış olan bir şey var oda hiç bir zaman servo motora değeri sıfır olan puls verilmez verilmemelidir. Senin formülünde bu veriliyor maalesef.
Min 500 maksimum 2000us lik puls demiştik.
Bu durumda senin formülün 0-1500us lik aralığı hesaplamalı sen buna birde 500us eklemelisinki verilecek pulslar 500 ile 2000 aralığında olabilsin.
O halde formül SUREA=(HAMA+1)*/150+50 şeklinde kullanılmalıdır.
Böylece maksimum pot değerinde SUREA=(256)*/150+50=2000 olarak sonuç çıkacaktır. Min pot değerinde ise sonuç 50 çıkacaktırki buda bizim aradığımız bir şeydir.

İkinci kriterin uygulanabilmesi için süreleri toplayıp 20000 den çıkarmayı planlamışsın ve komut gecikmeleri nedeni ile 20000 yerine 12000 den çıkarmışsın bu doğru. Tabiiki komut gecikmesinin 8000us denk gelip gelmediğini bilemiyorum ama yaklaşık böyle ise sorun yok demektir.
Sonuç olarak kullandığın formülleri verdiğim formül şekli ile değiştirirsen çalışma düzelecektir.

Ete


Candusunur

Sevgili hocam ve arkadaşlar dc servomotor kontrolü ödevini yapacam buna uygun .hex dosyası ve isis- ares çiziminde bana yardımcı olabilirmisiniz

alisumer

PULSOUT  PORTA.0 ,A1 +200
8mhz de çalışan sistemde bu komutta A1 a 0-200  arasında analog veri geliyor ve sıkıntısız çalışıyor ama benim istediğim vericiden gelen A1 verisi bağlantı anlık kopmalarda yada ilk başlangıçta veri gelene kadar 0 oluyor ve servo en dibe dayanıyor bunun için +200 yerine  +300 yazıp A1 verisini 100 den büyükse kalan yüzü 300 e eklemek 100 den küçükse 300 den çıkararak bağlantı koptuğunda da orta noktada tutmak ve hesaplama konusunda sıkıntı yaşıyorumyüzden büyük olduğunda 1 e eşitleyip artırabilirim ama 100 den geriye gelirken örnek 98 verisini 300 den çıkarırsam ters oluyor eksilen 2 sayısını çıkarmalıyım algoritma kuramadım bir yardım lütfen umarım anlatabilmişimdir
Hep meraktan

ete

Çok karmaşık anlamakta zorlanıyorum.
PULSOUT  PORTA.0 ,A1 +200
komutu portdan bir puls çıkartır. A1 değeri işlemci frekansına uygun olarak seçilmelidir.
4 mhz işlemci frekansında  Ara=4/4=1 , A1=(1/1)*10=10us lik artırımlar ile çalışır. A1=5 dediğinizde bu size 5x10=50us lik bir HIGH palsi üretir.
Aynı hesabı 8 Mhz OSC frkenası için yaparsak,
Ara=8/4=2 A1=(1/2)*10=5 us lik bir artırım kademesi verecektir. Dolayısıyla A1=5 dediğinizde bu size 25us lik bir HIGH sinyali üretecektir.
KOmutu bu şekilde kullanmayın. Önce A1=A1+200 deyin sonra PULSOUT PORTA.0,A1 deyin. Yoksa işlem hataları ortaya çıkar.

İşlemci çalışıyor ise bu komut da çalışır ve gereken puls miktarını çıkartır. Kopmaların sebebini bulmaya çalış.
Ete
 

alisumer

Alıntı yapılan: ete - 26 Eylül 2020, 11:50:09Çok karmaşık anlamakta zorlanıyorum.
PULSOUT  PORTA.0 ,A1 +200
komutu portdan bir puls çıkartır. A1 değeri işlemci frekansına uygun olarak seçilmelidir.
4 mhz işlemci frekansında  Ara=4/4=1 , A1=(1/1)*10=10us lik artırımlar ile çalışır. A1=5 dediğinizde bu size 5x10=50us lik bir HIGH palsi üretir.
Aynı hesabı 8 Mhz OSC frkenası için yaparsak,
Ara=8/4=2 A1=(1/2)*10=5 us lik bir artırım kademesi verecektir. Dolayısıyla A1=5 dediğinizde bu size 25us lik bir HIGH sinyali üretecektir.
KOmutu bu şekilde kullanmayın. Önce A1=A1+200 deyin sonra PULSOUT PORTA.0,A1 deyin. Yoksa işlem hataları ortaya çıkar.

İşlemci çalışıyor ise bu komut da çalışır ve gereken puls miktarını çıkartır. Kopmaların sebebini bulmaya çalış.
Ete
 
atlamışım o kısmı hocam puls devamlılığını tmr0 ile 20 ms de bir yapıyorum 8 mhz de 200 sayısı 5 ile çarpılıp  1000 us aynı 1ms puls üretiyor bu da servoyu en sol konuma alıyor A1 e de 0 - 200 arası değer gelince 1000 us ile 2000 us arası veri oluyor sıkıntım benimm seervonun orta konumdan başlaması sabit değere 300 verince 1500 us (1,5ms)puls üretiyor oda servoyu tam orta noktaya getiriyor 1500 -2000 arası artırmada sıkıntı olmuyor ama 1500 1000 arası nı gelen veri ile nasıl ayarlarım
Hep meraktan

ete

Hala tam olarak ne istediğini anlamadım. Her şey ortada tespitlerin doğru.
Servoyu en sola almak için PULSOUT PORTA.0,200 komutunu vermen (A1=200)
Servoyu orta konuma almak için PULSOUT PORTA.0,300 (A1=300) komutunu vermen,
Servoyu en sağa almak için PULSOUT PORTA.0,400 (A1=400) vermen gerekecek.
A1 sabit bir sayımıdır ki ona eklemeler yapıyorsun. Anlamadım maalesef.
Ete

alisumer

yok hocam A1 pottan okunup nrf24 ile gelen 0-200 arasında ayarlanmış veri joystikten .işlemesinde sıkıntı yok ama bazen bağlantı kopukluğu oluyor 1 saniye bile olsa alıcıda A1 verisi 0 düşüyor oda servoyu dibine kadar dayıyor doğal olarak kontrolden çıkıyor benim istediğim alıcı kopsa bile servo orta konumda kalsın onun için sabit olan sayıyı 300 ayarlamayı düşündüm ama bu seferde hesaplama 1500 us ile 1000 us arasında nasıl yapılır onu çözemedim çünkü gelen veri 0 ile 200 arası bu durumda da 0 100 arasını servoyu en soldan ortaya almak için 100 ile 200 arasını da servoyu en sağa almak için kullanmam gerekiyor sorun şu ki bu hesaplama ile bu gelen A1 verisini 1500 ün üstüne eklerken sıkıntı yok ama aynı zamanda da çıkarma işlemi de yapmam lazım ki 1000 ile 1500 arasında puls üretip servoyu en sola da alabilmeliyim sorun çıkarma işleminde oluyor çünkü A1 doğrusal artıyor yada eksiliyor toplarken sıkıntı olmuyor ama diyelim A1 verisi 200 orta noktası olan 100 beni 1500 e ulaştıracak yani çok karıştı kafam telafuz bile edemiyorum düşün :))
Hep meraktan

MB_77

#44
bu mesaj tarafımdan silinmiştir.

Powered by EzPortal