3 adet servo motor kontrolü

Katılım
14 May 2012
Mesajlar
2
Puanları
1
selam arkadaşlar bitirme projem için yapmış olduğum 3 eksenli robot kol'un programında sorun yaşıyorum elimde bir program var ama pic 16f877 ye göre bende ise pic16f877a var ccs c ile yazılmış bunu çevirmek istiyorum ve servoların dönüş açısını değiştirmek istiyorum yardımcı olursanız sevinirim. şimdiden teşekkürler

program


#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.


#fuses XT,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,13,18,8,13,18,8,13,18,8,13};


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(217); // TMR0 kaydedicisine 217 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) // Yaklaşık 115us*17350 = 1,995,250us 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_spi(SPI_SS_DISABLED); // SPI 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_2); // Timer0 ayarları belirtiliyor
set_timer0(217); // TMR0 kaydedicisine 217 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; // 1. R/C servo PWM görev saykılı
duty_1=servo_derece_2; // 2. R/C servo PWM görev saykılı
duty_2=servo_derece_3; // 3. R/C servo PWM görev saykılı
}
}
 
16f877.h ilk satırı 16f877a.h
yap. Çalışır.
 
teşekkürler peki servoların açılarını nasıl değiştiricem
 

Forum istatistikleri

Konular
128,125
Mesajlar
915,219
Kullanıcılar
449,837
Son üye
betül hüsrevoğlu

Yeni konular

Geri
Üst