CCS C ile RC Servo Motor Uygulaması

pr_01_37_max

 

/******************************************************
 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.

// 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
 i++; // i değişkeni değerini 1 arttır
 if(i==11) // Eğer i değeri 11 ise-Tüm adımlar bitti ise
 i=0; // i 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ı
 }
}

RC Servo Motor Uygulaması

Bu yazı CCS C Örnekleri kategorisine gönderilmiş ve , ile etiketlenmiş. Kalıcı bağlantıyı yer imlerinize ekleyin.