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ğerleri
const 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 kesmesi
void 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ı