servo motor titriyor

Başlatan tolgacansabah, 13 Aralık 2015, 07:13:33

tolgacansabah


@  __config _XT_OSC & _WDT_ON & _PWRTE_ON & _LVP_OFF & _CP_OFF


PORTA=0:TRISA=%00000111
PORTB=0:TRISB=%00000000
PORTC=0:TRISC=%00000000
PORTD=0:TRISD=%00000000
PORTE=0:TRISE=%00000000
ADCON1 = %00000010


Define ADC_BITS 8
Define ADC_CLOCK 3
Define ADC_SAMPLEUS 50

HAMSAGSOL      var byte
HAMILERIGERI   VAR BYTE
HAMASAGIYUKARI VAR BYTE 
SUREA VAR BYTE
SUREB VAR BYTE
SUREC VAR BYTE
SURE VAR WORD

pause 250




BASLA:

    HIGH PORTB.1
    PORTC = 0
    pulsout PORTC.0,  SUREA
    pulsout PORTC.1,  SUREB
    pulsout PORTC.2,  SUREC
 
    SURE = (SUREA + SUREB + SUREC)*10
    SURE = 13000 - SURE 
   
    pauseus SURE
   
    Adcin 0, HAMSAGSOL         :SUREA=(HAMSAGSOL+1)*/200
    Adcin 1, HAMILERIGERI      :SUREB=(HAMILERIGERI+1)*/200
    Adcin 2, HAMASAGIYUKARI    :SUREC=(HAMASAGIYUKARI+1)*/200
    LOW PORTB.1
    goto BASLA
end

PIC 16F877 kullanıyorum
devrede A0 A1 A2 pinleri pot girişi
             C0 C1 C2 pinleri servo sürüyor
iki servoyu sorunsuz süren devreye herhangi üçüncüyü bir servo ekleyince ya  tüm motorlar videodaki gibi titriyor ya da üçüncü servo cızırtı sesiyle çalışıyor.
----------------------------
servo gerilimlerini ölçtüm 5 volt
devrenin çektiği akımı güç kaynağım karşılayabiliyor
pot ve servo girişlerini değiştirerek denedim üç pot ve üç servo sağlam
13000 ms değerini deneme yanılma yoluyla buldum , 12000 ve 20000 aralığı için üç servoyu birlikte düzgün şekilde çalıştıramadım .
-----------------------------
https://drive.google.com/file/d/0BxaLBUD2bAGMNkUtSU1LM3hGWjg/view?pli=1

karacan451


karacan451

Senin kullandığın  servo motor büyük ihtimalle 1-2 ms aralığındadır.

ete

Servoların büyük çoğunluğu 20 ms lik puls sıklığı ile çalışırlar. Yani vereceğiniz 0,5-2ms puls ları 20 ms lik aralıklarla tekrarlamanız gerekir.
Bu durumda 3 adet servo kullanınca 20 ms lik peryodu sağlayacak gecikme hesabında şöyle mantık kullanılması gerekir.
SURE=20000-(SUREA+SUREB+SUREC)*10

Diğer yandan pot lar aracılığı ile hesapladığın süre değerlerinde de bir sorun var. Servo motora verilecek PULS 0,5-2ms aralığındadır Değişim miktarı ise 2-0,5=1,5ms (1500us) dir. O halde pot ile siz maksimum 2000 us, min 500us hesaaplamanız gerekir. O halde doğru formül şöyle olmalı.;
SUREA=(HAMSAGSOL+1)*/150+50
Diğerleride bu eşitliğe uygun yazılmalı. Böylece hesaplayacağınız süre değerleri 500 -2000 us aralığında olur.
Aksi halde sıfır süre de hessaplama ihtimaliniz olurki bu servo için geçerli bir süre değildir.

Ete


tolgacansabah

@  __config _XT_OSC & _WDT_ON & _PWRTE_ON & _LVP_OFF & _CP_OFF


PORTA=0:TRISA=%00000111
PORTB=0:TRISB=%00000000
PORTC=0:TRISC=%00000000
PORTD=0:TRISD=%00000000
PORTE=0:TRISE=%00000000
ADCON1 = %00000010


Define ADC_BITS 8
Define ADC_CLOCK 3
Define ADC_SAMPLEUS 50

HAMSAGSOL      var byte
HAMILERIGERI   VAR BYTE
HAMASAGIYUKARI VAR BYTE 
SUREA VAR BYTE
SUREB VAR BYTE
SUREC VAR BYTE
SURE VAR WORD

pause 250




BASLA:

    HIGH PORTB.1
    PORTC = 0
    pulsout PORTC.0,  SUREA
    pulsout PORTC.1,  SUREB
    pulsout PORTC.2,  SUREC
 
    SURE = (SUREA + SUREB + SUREC)*10
    SURE = 13000 - SURE 
   
    pauseus SURE
   
    Adcin 0, HAMSAGSOL         :SUREA=(HAMSAGSOL+1)*/100+100
    Adcin 1, HAMILERIGERI      :SUREB=(HAMILERIGERI+1)*/100+100
    Adcin 2, HAMASAGIYUKARI    :SUREC=(HAMASAGIYUKARI+1)*/100+100
    LOW PORTB.1
    goto BASLA
end

Kullandığım motorlar 1000 ve 2000 mikro saniye aralığını kullandığı için SUREA=(HAMSAGSOL+1)*/100+100 komutunu kullanarak sorunu çözdüm herkese çok teşekkür ediyorum.
İyi çalışmalar.

Powered by EzPortal