RC Servo Motor Kontrolu Yardım.

Başlatan ovaliiismail, 14 Mayıs 2017, 16:46:57

ovaliiismail

Hocam motor seçiminde sıkıntı yok ama komut butonuna bastığımda servo altyordamına gitmiyor galiba çünkü motorlar hareket etmiyor.
@ __config _CONFIG1, _INTRC_CLKOUT & _WDT_OFF& _LVP_OFF & _CP_OFF & _MCLR_OFF
DEFINE ADC_BITS 8 'SONUCU 8 BİT OLARAK AL.'
DEFINE ADC_CLOCK 3 'SAAT KAYNAĞI DAHİLİ.'
DEFINE ADC_SAMPLEUS 50 'ÖRNEKLEME ZAMANI 50 MİKRO SANİYE.'
CMCON=7 'KARŞILAŞTIRICILARI KAPATIR.'
ADCON1=%00000000 'SONUÇ SOLA YASLI VE 8 BİT.'
ANSEL=%00000010 'A1 PORTU ANALOG GİRİŞ.'
TRISA=%01010010 'PORTA NIN 1. 4. 6. PİNİ GİRİŞ DİĞERLERİ ÇIKIŞ.'
TRISB=0 'PORTB ÇIKIŞ.'
ADCDEGER VAR BYTE 'ADCDEGER DEĞİŞKENİ TANIMLANDI.'
SERVONO VAR BYTE 'SERVONO DEĞİŞKENİ TANIMLANDI.'
SYMBOL SERVOBUTON=PORTA.6 'SERVO SEÇME BUTONU.'
SYMBOL KOMUTBUTON=PORTA.4 'KOMUT BUTONU.'
SYMBOL SERVO1=PORTA.2 'SERVO1 SİNYAL.'
SYMBOL SERVO2=PORTA.3 'SERVO2 SİNYAL.'
SYMBOL LED1=PORTB.0 '1.İNDİKATÖR.'
SYMBOL LED2=PORTB.1 '2.İNDİKATÖR.'
SAYAC VAR BYTE 'DÖNGÜ SAYACI.'
DEGER VAR WORD 'DEGER ARALIĞI.'
ALTDEGER CON 100 '4MHZ DE 1 PULSE=10US.'
'10US X 100 =1MS SERVO 0 AÇISI:BAŞLANGIÇ DEĞERİ.'
SERVONO=1 'AÇILIŞTA 1 NOLU SERVO ETKİN.'
PROGRAM: 'PROGRAM BAŞLATILDI.'
    ADCIN 1,ADCDEGER 'DEĞERİ OKU ADCDEGER E ATA.'
    DEGER=(ADCDEGER*58)/100 'SKALA 150;0-180 DERECE.'
    IF SERVOBUTON=0 THEN 'IF SERVOBUTON=0 İSE.'
        PAUSE 30 '30MS BEKLE.'
        SERVONO=SERVONO+1 'SERVONO NUN DEĞERİNİ 1 ARTTIR.'
    ENDIF 'IF BİTİRİLDİ.'
    IF SERVONO>2 THEN 'SERVONO BÜYÜKTÜR 2 İSE.'
        SERVONO=1 'SERVONOYA 1 DEĞERİNİ ATA.'
    ENDIF 'IF BİTİRİLDİ.'
    SELECT CASE SERVONO 'SELECT CASE BAŞLATILDI.'
        CASE 1 'SERVONO 1 İSE.'
            LED1=1 'LED1 YANSIN.'
            LED2=0 'LED2 SÖNSÜN.'
        CASE 2 'SERVONO 2 İSE.'
            LED1=0 'LED1 SÖNSÜN.'
            LED2=1 'LED2 YANSIN.'
    END SELECT 'SELECT CASE BİTİRİLDİ.'
    IF KOMUTBUTON=0 THEN 'EĞER KOMUT BUTON 0 İSE.'
        PAUSE 30 '30MS BEKLE.'
        GOSUB SERVO 'SERVO ALTYORDAMINA GİT.'
    ENDIF 'IF BİTİRİLDİ.'
GOTO PROGRAM 'PROGRAMA GİT.'
SERVO: 'SERVO ALT YORDAMI.'
    FOR SAYAC=0 TO 40 'SAYAC 0DAN 40 A KADAR.'
        SELECT CASE SERVONO 'SELECT CASE BAŞLATILDI.'
            CASE 1 'SERVONO 1 İSE.'
                PULSOUT SERVO1,DEGER+ALTDEGER
            CASE 2 'SERVONO 2 İSE.'
                PULSOUT SERVO2,DEGER+ALTDEGER
        END SELECT 'SELECT CASE BİTİRİLDİ.'
        PAUSE 19 '19 MS BEKLE.'
    NEXT 'FOR A GERİ DÖN.'
RETURN 'PROGRAMA GERİ DÖN.'

ete

#1
Programın hangi frekansta çalışacak belli değil.  Define OSC 4 eklemen gerek.
Ayrıca bu işlemcinin bir osilatör control registeri, vardır. OSCCON=%01101100 ona bu değeri vermen gerek.
Programa açılış gecikmesi eklememişsin.  PROGRAM etiketinden önce PAUSE 300 eklemen gerek.

Programın SERVO alt programına gidiyor. Bunu anlamak için SERVO etiketi altına TOGGLE PORTB.7 şeklinde komut ilave et ve butona basınca PORTB.7 nin HIGH olduğunu görebilirsin. Sorun SERVO alt programında ki kodlarda ve en önemlisi devre şemanda servo motor bağlantılarında.
Kullandığın servo motorun sol taraftaki pinine +5V ortadaki pine Kontrol sinyali ve sağdaki pine de GND vermen gerekiyor.
Sen tamamen farklı ve yanlış bağlantı yapmışsın o motorlar hareket etmez.
Gördüğüm kadarı ile ADC pininden okuduğun değeri Servolara konum vermek için kullanacaksın.
Hesaplamadaki mantığınıda pek anlamadım. Adc den okunacak 0-255 arasındaki değerin %58'ini alıyorsun ve ona 100 ekliyorsun.
Bir örnek hesap yapalım.  ADC den 255 okuduk diyelim bunun %58'i 147 dir. Buna 100 ekleyince 247 oldu değişken değeri.
Sonra bunu PULSOUT komutuna vermişsin.  PULSOUT SERVO1,(DEGER+ALTDEGER)  Bu şu demek oluyor. SERVO1 pininden 2470 us lik bir puls çıkart!!!!.
Servo lar 0,5ms (500us) ile 2 ms (2000us) lik pulslar ile çalışırlar.  Toplam 2000 us lik sinyalin 500us lik kısmı sabit olduğundan pot ile 1500 us lik bir değişim hesaplaman gerekir. Senin yapman gereken şey ADC den okunan 0-255 arasındaki değeri 2000-500=1500 yani 0-1500 arasındaki bir puls'e dönüştürmek olmalı idi. Pulsout 10 un katları şeklinde puls ürettiği için bulman gereken değer 0-150 arasında olmalı.
Bu durumda ADC okumasında şu formülü kullansan iyi edersin. Deger=(ADC*/1556)  /10 bu sana 0-150 arasında bir değer verecektir.
Altdeğer ise sabit 50 olmalı.Bu 500 us ye eşdeğerdir.  Böylece ADC den gelen 0-150 ile sabit olarak alınan 50 sana 500-2000 us lik bir puls aralığı sağlayacaktır.
İlişikte düzeltilmiş program ve devre şemasını bulabilirsin.

Ete


ovaliiismail

Çok sağolun hocam hakkınızı ne yapsam ödeyemem.Allah sizden razı olsun.

Powered by EzPortal