servoinside

R/C Servo Motor dediğimiz şey dc akımla çalışan ve  istenilen açı aralığında dönen motorardır.  R/C ,  Radio Controlled anlamına gelir. Servco motorlar DC Motorların temel mantığını kullanırlar. Fakat buna karşın elektronik pozisyon kontrol devresi ve elektronik şaft gibi ekstra bileşenleri vardır.  Servo motor şaftın kaç derece ve hangi hızda döndüğünü algılar ve girişe bunu geri besleme olarak verir.  Motorun pozisyonunu algılamak için rotora takılı bir potansiyometre bulunur. Bu potansiyometreden gelen analog değer ile inputtaki sinyal karşılaştırılır ve output olarak motorun yeni pozisyonu kontrol edilir.  

  R/C Servo Motor

  R/C servo motorun pozisyonunu kontrol etmek için PWM sinyali kullanılır. Motoru’un inputuna gelen PWM sinyalinin görev çevrimine(duty cycle)  göre motor, pozisyon değiştirir. R/C Servo Motorlarda pozisyon açısal derece esasına göre kontrol edilir.  Pozisyon kontrol devresi PWM sinyalinin görev çevrimine göre döneceği dereceyi hesaplar.  PWM sinyalinin çevrim süresi aynı kaldığı müddetçe motor pozisyon değiştirmez.

  pwm

  Yalnız önemli olan nokta şudur ki; servo motorda dönmenin gerçekleşebilmesi için PWM siyalinin frekansı 50 Hz olmalıdır. Yani kontrol sinyalinin periodu 20 ms olmalıdır. 0 ve 180 derece arasındaki pozisyonlar PWM sinyalinin görev çevrimi süresinin 1 ms ile 2 ms arasında gerçekleşir. PWM sinyalinin 1 ms görev çevrim süresi için servo motor 0 derecelik pozisyondadır.  Şemadan da  görüldüğü gibi 0.5 ms lik ve 2 ms lik çevrim sürelerinde servo motorun pozisyonu 90 derece değişir. 

   Servo motorların supply voltajı 4.5 volt ile 6 volt arasında değişir. Bu voltaj değerleri motorun tork’una göre değişkenlik gösterir. R/C servo motorların digital olanlarıda vardır. Bu motorlar normale göre daha hassas açı ile dönerler. 

 Şimdi örnek olarak similasyon tabanlı bir servo motor uygulaması verelim.  Bu uygulamada 3 adet R/C servo motorun aynı anda ayrı derecelerde dönmesi sağlanmıştır.  İstenirse denetleyicinin PWM pinleri kullanılarak pwm sinyali üretilebilir fakat bu uygulamanın programında  PWM sinyali, yazılan algoritma ile RB0,1,2 pinlerinden özel olarak oluşturulmuştur…  Program şöyle;

/******************************************************      PIC16F877 İle R/C Servo Motor Uygulaması******************************************/#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları#use delay (clock=20000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.#use fast_io(a);// R/C Servo motor dönme açı değerlericonst int8 servo_derece_1[]={8,9,10,11,12,13,14,15,16,17,18};const int8 servo_derece_2[]={18,17,16,15,14,13,12,11,10,9,8};const int8 servo_derece_3[]={8,12,18,8,12,18,8,12,18,8,12};int i=0,pwm=0,duty_0=0,duty_1=0,duty_2=0;int16 zaman=0; // 16 bitlik değişken tanımlanıyor#int_timer0  // Timer0 taşma kesmesivoid kesme (){   set_timer0(113);  // TMR0 kaydedicisine 113 değeri yükleniyor   if (pwm==0)       // Eğer PWM değişkeni 0 ise   {      output_high(pin_b0); // RB0 çıkışı lojik-1      output_high(pin_b1); // RB1 çıkışı lojik-1      output_high(pin_b2); // RB2 çıkışı lojik-1   }   if (pwm>=duty_0) output_low(pin_b0);   if (pwm>=duty_1) output_low(pin_b1);   if (pwm>=duty_2) output_low(pin_b2);   zaman++; // zaman değişkenini 1 arttır   // Servo motor dönüş adımları arası bekleme süresi için   if (zaman>17350) // 17350x114,4µsn=1.984.840µsn, yaklaşık 2msn   {      zaman=0;  // zaman değişkenini sıfırla              }   pwm++;       // pwm değişkenini 1 arttır   if (pwm>=173) // pwm değeri 173'den büyük ise      pwm=0;    // pwm değişkenini sıfırla}/********* ANA PROGRAM FONKSİYONU********/void main (){   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok   setup_adc(ADC_OFF);             // ADC birimi devre dışı   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_4); // Timer0 ayarları belirtiliyor   set_timer0(113);  // TMR0 kaydedicisine 113 değeri yükleniyor   enable_interrupts(int_timer0); // Timer0 taşma kesmesi aktif   enable_interrupts(global);     // Aktif edilen tüm kesmelere izin ver         output_b(0x00);  // İlk anda B portu çıkışı sıfırlanıyor      while(1)  // Sonsuz döngü   {      duty_0=servo_derece_1[i]; // 1. R/C servo PWM görev saykılı      duty_1=servo_derece_2[i]; // 2. R/C servo PWM görev saykılı      duty_2=servo_derece_3[i]; // 3. R/C servo PWM görev saykılı   }}

Servo

Dökümanlar için; R_C Servo Motor Uygulaması