«

»

Feb
22

PIC 16f628A ve HI-TECH C ile Servo Motor Kontrolü

Ara tatilinde yaptığım ve Proteus ISIS ile simule ettiğim kodum. Butonlara basarak R/C servo motoru 60 derecelik sağa ve sola döndürüyor. R/C servo motorlar amatör Radio Controlled sistemlerde kullanıldığı için R/C adını almışlardır. Radyo kontrollü hobi uçağı yapabilirsiniz bununla :) Asıl motor olmayacaktır elbette kanatların altındaki kanatçıkları oynatarak uçağın yönünü değiştirebilirsiniz. Bu motorlar genellikle belirli bir periyotta (10 ile 20 milisaniye) bir dikdörtgen (pwm asıl adı) sinyalle kontrol edilirler. Bu periyotluk dilimde eğer 1 ms’lik 1 verir ve gerisini sıfır yaparsanız motor eksi yöne 60 dereceye, 1.5 ms 1 ve gerisi sıfır olursa sıfır dereceye ve 2 ms’lik bir sinyal yollarsanız da +60 dereceye oturur. Aslında normal dc motorun biraz kontrol devreli ve dişlili halidir (redüktör). Aşağıda Proteus ISIS simulasyonunun görünüşünü koydum. Analog analiz kısmının çalışması için servo motoru devreden ayırmamız gerekmektedir. Sanırım Proteus’un bir bug’ı.

Hi-Tech C kodları ise aşağıdaki gibidir:

#include

#include
#include 

__CONFIG(WDTDIS&PWRTEN&LVPDIS&INTIO);

void main(void){
    int hiz=0;
    char i = 100;
    PR2 = 255;
    //char k = 0x3D;
    //CMCON = 0x07;
    TRISA = 0x03;
    TRISB = 0x00;
    CCPR1L = 0x3F;
    PORTA = 0x00;
    PORTB = 0x00;
    CCP1X = 1;
    CCP1Y = 0;

    T2CKPS1 = 1; //Prescale özelligi
    T2CKPS0 = 1;
    TOUTPS3 = 0;
    TOUTPS2 = 0;
    TOUTPS1 = 0;
    TOUTPS0 = 0;

    CCP1M0 = 1; //CCP1 PWM MODUNDA
    CCP1M1 = 1;
    CCP1M2 = 1;
    CCP1M3 = 1;

    TMR2ON = 1; //TMR2 ENABLE
    for(;;){
        if(RA0){
            while(RA0);
            RB0 = 1;
            CCPR1L = 0x0E;
             CCP1X = 1;
             CCP1Y = 0;

             T2CKPS1 = 1; //Prescale özelligi
             T2CKPS0 = 1;
             TOUTPS3 = 0;
             TOUTPS2 = 0;
             TOUTPS1 = 0;
             TOUTPS0 = 0;

             CCP1M0 = 1; //CCP1 PWM MODUNDA
             CCP1M1 = 1;
             CCP1M2 = 1;
             CCP1M3 = 1;
             TMR2ON = 1; //TMR2 ENABLE
             __delay_ms(100);
             RB0=0;

    TMR2ON = 1; //TMR2 ENABLE

        }
        if(RA1){
            while(RA1);
            RB1 = 1;
            CCPR1L = 0x9E;
             CCP1X = 1;
             CCP1Y = 0;

             T2CKPS1 = 1; //Prescale
             T2CKPS0 = 1;
             TOUTPS3 = 0;
             TOUTPS2 = 0;
             TOUTPS1 = 0;
             TOUTPS0 = 0;

             CCP1M0 = 1; //CCP1 PWM
             CCP1M1 = 1;
             CCP1M2 = 1;
             CCP1M3 = 1;
             TMR2ON = 1; //TMR2 ENABLE
             __delay_ms(100);
             RB1=0;
        }

    }
}

Burada timer2 nin pwm modülünü kullanarak periyotu ve bu peryodun ne kadarının 1 olması gerektiğini belirledik.
CCPR1L her değer değişimde timer2′nin ve pwm modülünün ayarlarını tekrardan girmemiz gerektiğini 16F628A’nın
datasheetinden bulmak zorunda kalmıştım. 16F877′ler için böyle bir sıkıntı yaşanmamaktadır.

MPLAB proje dosyasını, kaynak kodlarını ve Proteus ISIS simulasyonunu wp’deki bir sorundan dolayı koyamadım. En kısa zamanda ekleyeceğim.

7 comments

  1. Erhan says:

    Resmi de BMP koymuş ellaaam ya :) Kotanın yarısı gitti hocam naptın :) )

  2. Ahmet Kılıç says:

    Merhaba Çağdaş bey.PIC 16f628 ile servo kontrol hakkında sizden biraz daha bilgi alabilir miyim?
    Şimdiden teşekkürler :)

  3. Adnan says:

    hocam bu işte biraz yeniyim de, örnekleri inceleyerek öğrenmeye çalışıyorum
    kodu anladım fakat en başta #include önişlemci komutuyla hangi kitaplıkları yüklediğiniz belli değil

    lütfen açıklayabilir misiniz?

  4. mehmet says:

    hocam marmara tef otomotivden tanıyor gibiyim sizi.

  5. cagdas says:

    Merhabalar,

    @Ahmer Kılıç,

    Endüstriyel servoları kastediyorsanız onlar için microchip üreticisinin sitesinde uygulama notları var işinize yarayacaktır.

    @Adnan

    Evet plugin sıkıntı çıkarmıştı ondan çıkmamıştı. pic.h ve kendime göre ayarladığım delay.h. Üç tane var gibi göründe de yanlış hatırlamıyorsam kendime oluşturduğum delay dosyasının adı farklıydı ve ikisini de eklemiştim. Ama o kadar da önemli değil orası. Delay dosyasının kullanılan frekansa göre ufak değişikliklere ihtiyacı olabiliyor. Kendi içinde de zaten // ile başlayan yorum kısımlarında nasıl ayarlanabileceği anlatılmıştır.

    @Mehmet

    Marmaradan değilim maalesef. Yıldız elektrik mezunuyum.

  6. hakan says:

    merhabalar, sizin servo devrenizi kullanmak istiyorum ama kod falan bilmiyorum(makine müh öğrencisiym) danışman hocam sadece microcode studio ile hex e çevirip proteus a atmayı öğretti. bu kodları herhangi bir şekilde direkt hex dosyasna veya microcode studio gibi bir programda kullanma şansım var mı acaba? teşekkürler.

  7. cagdas says:

    Merhaba Hakan,

    Microcode Studio anladığım kadarıyla picbasic derleyicisi, kodları picbasic dilinde yazmak gerekecektir. Ben C’de yazmıştım, Basic kullanmadım ama herhangi bir pic derleyicisiyle kodu yazabilirsiniz veya picbasic öğrenebilirsiniz. Hex halinde kullanmaktansa kod yazmaya çalışmanız daha güzel olabilir. Zaten simulasyon olacağından çok da sorun çıkacağını sanmıyorum. Kolay gelsin.

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre user="" computer="" escaped="">