PIC 16f628A ve HI-TECH C ile Servo Motor Kontrolü
Ara tatilinde yaptığım ve Proteus ISIS ile simule ettiğim kodum. Butonlara basarak R/C servo motoru 60 derecelik sağa ve sola döndürüyor. R/C servo motorlar amatör Radio Controlled sistemlerde kullanıldığı için R/C adını almışlardır. Radyo kontrollü hobi uçağı yapabilirsiniz bununla
Asıl motor olmayacaktır elbette kanatların altındaki kanatçıkları oynatarak uçağın yönünü değiştirebilirsiniz. Bu motorlar genellikle belirli bir periyotta (10 ile 20 milisaniye) bir dikdörtgen (pwm asıl adı) sinyalle kontrol edilirler. Bu periyotluk dilimde eğer 1 ms’lik 1 verir ve gerisini sıfır yaparsanız motor eksi yöne 60 dereceye, 1.5 ms 1 ve gerisi sıfır olursa sıfır dereceye ve 2 ms’lik bir sinyal yollarsanız da +60 dereceye oturur. Aslında normal dc motorun biraz kontrol devreli ve dişlili halidir (redüktör). Aşağıda Proteus ISIS simulasyonunun görünüşünü koydum. Analog analiz kısmının çalışması için servo motoru devreden ayırmamız gerekmektedir. Sanırım Proteus’un bir bug’ı.
Hi-Tech C kodları ise aşağıdaki gibidir:
#include
#include
#include
__CONFIG(WDTDIS&PWRTEN&LVPDIS&INTIO);
void main(void){
int hiz=0;
char i = 100;
PR2 = 255;
//char k = 0x3D;
//CMCON = 0x07;
TRISA = 0x03;
TRISB = 0x00;
CCPR1L = 0x3F;
PORTA = 0x00;
PORTB = 0x00;
CCP1X = 1;
CCP1Y = 0;
T2CKPS1 = 1; //Prescale özelligi
T2CKPS0 = 1;
TOUTPS3 = 0;
TOUTPS2 = 0;
TOUTPS1 = 0;
TOUTPS0 = 0;
CCP1M0 = 1; //CCP1 PWM MODUNDA
CCP1M1 = 1;
CCP1M2 = 1;
CCP1M3 = 1;
TMR2ON = 1; //TMR2 ENABLE
for(;;){
if(RA0){
while(RA0);
RB0 = 1;
CCPR1L = 0x0E;
CCP1X = 1;
CCP1Y = 0;
T2CKPS1 = 1; //Prescale özelligi
T2CKPS0 = 1;
TOUTPS3 = 0;
TOUTPS2 = 0;
TOUTPS1 = 0;
TOUTPS0 = 0;
CCP1M0 = 1; //CCP1 PWM MODUNDA
CCP1M1 = 1;
CCP1M2 = 1;
CCP1M3 = 1;
TMR2ON = 1; //TMR2 ENABLE
__delay_ms(100);
RB0=0;
TMR2ON = 1; //TMR2 ENABLE
}
if(RA1){
while(RA1);
RB1 = 1;
CCPR1L = 0x9E;
CCP1X = 1;
CCP1Y = 0;
T2CKPS1 = 1; //Prescale
T2CKPS0 = 1;
TOUTPS3 = 0;
TOUTPS2 = 0;
TOUTPS1 = 0;
TOUTPS0 = 0;
CCP1M0 = 1; //CCP1 PWM
CCP1M1 = 1;
CCP1M2 = 1;
CCP1M3 = 1;
TMR2ON = 1; //TMR2 ENABLE
__delay_ms(100);
RB1=0;
}
}
}
Burada timer2 nin pwm modülünü kullanarak periyotu ve bu peryodun ne kadarının 1 olması gerektiğini belirledik.
CCPR1L her değer değişimde timer2′nin ve pwm modülünün ayarlarını tekrardan girmemiz gerektiğini 16F628A’nın
datasheetinden bulmak zorunda kalmıştım. 16F877′ler için böyle bir sıkıntı yaşanmamaktadır.
MPLAB proje dosyasını, kaynak kodlarını ve Proteus ISIS simulasyonunu wp’deki bir sorundan dolayı koyamadım. En kısa zamanda ekleyeceğim.


Ledasi Yazılım / Medya CRM 1