Ccs C Yardım!!!
-
pic 16f877 kullanarak basit servo motor uygulaması yapmam gerekiyor devre tasarım dersi projem için. Üst düzey programlama dilleri hakkında bilgim var ama bu konuları pek bilmiyorum. Bir tuşa basınca motoru 90 derece sola döndürmem gerekiyor bunun kodunu nasıl yazabilirim. Açıkçası çok öğrenmek istediğim bir dil olmadığı için hazır birkaç satır kod bulabilirsem çok iyi olur benim için. şimdiden teşekkürler herkese.
-
Baştan sonra bir kılavuz var: http://www.pyroelectro.com/tutorials/servo_motor/index.html
-
bu işler için pwm i kullancaksın hocam. pwm i araştırırsan çözüm bulabilirsin. uğraşmayayım diyorsan serdar çiçek in kitabı var projeleri altas.com ya da com.tr de yayınlanmış orada bahsettiğin tarzda örnek olması lazım. oradaki kodları ve isis devre şemasını kullanabilirsin biraz düzenleyerek
-
Sağ olasın arkadaşım ben biraz kurcalayayım bunu. Ama anladığım kadarıyla burada servo motorun her şeyini anlatıyor. Özellikle yazılımı konusunda önerebileceğin bir şeyler var mı. Basit işlemler yapan örnek pic c kodları falan .
-
bak bakalım hacı, dökümanlardan üstünkörü çektim bunu.
/******************************************************
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ı
}
}
-
çok sağ olun arkadaşlar çok faydası oldu.