A- Gerekli Malzemeler:
1 – 1 adet 16F877A mikrodenetleyici
2 – 1 adet kırmızı LED
3 – 1 adet 220 ohm direnç
4 – 1 adet 4k7 direnç
5 – 2 adet 22pF kapasitör
6 – 1 adet 20Mhz kristal
7 – 1 adet LM7805 regülatör
8 – 1 adet servo motor
9 – 2 adet düğme
10- 2 adet 10k direnç
B- Açıklamalar:
Bu uygulamada PIC 16F877A mikrodenetleyicisini kullanarak bir servo motoru kontrol edeceğiz. Kontrol ederken iki düğme kullanacağız. Düğmelerin birine basıldığında servo bir yöne, diğerine basıldığında servo başka bir yöne ve düğmelere basılmadığında bir yöne dönecektir.
Kullanacağımız servo motorun 3 adet iğnesi bulunmaktadır. İlk iğne (sarı kablo) veri iğnesidir. İkinci iğne (kırmızı kablo) gerilim (5V) ve üçüncü iğne (siyah kablo) topraktır. Servo motor veri iğnesinden gelen 20ms lik veriyi alır ve bu verideki 1 (yani +5V) miktarına göre yönünü ayarlar. Mesela:
- bit_set(b_kapisi,7);
- delay_us(2400);
- bit_clear(b_kapisi,7);
- delay_ms(17);
- delay_us(600);
Kodu ile B kapısının yedinci iğnesine bağlı bir servo motoru 2,4ms 1 ve 17,6ms 0 vererek saat yönünde döndürebiliyoruz. Motoru ortalamak için ise aşağıdaki kodu kullanıyoruz:
- bit_set(b_kapisi,7);
- delay_us(1500);
- bit_clear(b_kapisi,7);
- delay_ms(17);
- delay_us(1500);
Görüldüğü gibi 1,5ms 1 ve 18,5ms 0 verilmesi motoru ortalıyor. Benzer şekilde 0,6ms 1 ve 19,4ms 0 vererek motoru saat yönünün tersinde bir konuma getirebiliriz. Burada dikkat edilmesi gereken şey gönderilen sinyaldeki 1 (yani +5V) süresinin 0,6ms ile 2,4ms arasında değişmesidir. Daha büyük veya daha küçük (servo motorun özelliklerine göre bu 0,6ms ve 2,4ms değerleri oynama gösterecektir) değerler istenmeyen sonuçlar doğuracaktır.
Unutulmaması gereken bir detay servo motorun düz DC motorun aksine belirli bir konuma (bizim yukarıdaki verilerle belirttiğimiz) gelindiğinde durmasıdır. Yani açılı döndürme gibi işlemler yapılabilir.
Düğmeler bağlanırken de pull-down dirençlerin bağlanmasına özen gösterilmelidir (aksi takdirde A kapısından veri okunurken istenmeyen sonuçlar elde edilecektir).
C- Devre Şeması (ISIS):
pic_2dsn.txt (uzantısını .DSN olarak değiştiriniz)
D- Kod (CCS C):
pic_2.hex : pic_2.txt (uzantısını .hex olarak değiştiriniz)
pic_2.c :
- #include “D:\scozturk\pic_2.h”
- #BYTE a_kapisi = 0x05 // A kapısını tanımla
- #BYTE b_kapisi = 0x06 // B kapısını tanımla
- void ayarla()
- {
- setup_adc_ports(NO_ANALOGS);
- setup_adc(ADC_OFF);
- setup_psp(PSP_DISABLED);
- setup_spi(FALSE);
- setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
- setup_timer_1(T1_DISABLED);
- setup_timer_2(T2_DISABLED,0,1);
- setup_comparator(NC_NC_NC_NC);
- setup_vref(FALSE);
- }
- void main()
- {
- int i; // Döngülerde kullanılan sayaç
- ayarla(); // PIC’i ayarla
- delay_ms(2000); // 2 saniye bekle
- set_tris_a(0xFF); // A kapısını giriş olarak kullanacağımızdan giriş olarak ayarlayalım
- set_tris_b(0x00); // B kapısını çıkış olarak ayarlayalım
- bit_set(b_kapisi,0); // RB0 daki LED’i yak
- for( ; ; ) // Sonsuz döngü
- {
- if(bit_test(a_kapisi,0)) // RA0 daki düğmeye mi basılmış?
- {
- for(i = 0 ; i < 5 ;++i) // Servo motoru sağa döndür
- {
- bit_set(b_kapisi,7);
- delay_us(2400);
- bit_clear(b_kapisi,7);
- delay_ms(17);
- delay_us(600);
- }
- }
- else if(bit_test(a_kapisi,1)) // RA1 deki düğmeye mi basılmış?
- {
- for(i = 0 ; i < 5 ;++i) // Servoyu sola döndür
- {
- bit_set(b_kapisi,7);
- delay_us(600);
- bit_clear(b_kapisi,7);
- delay_ms(17);
- delay_us(2400);
- }
- }
- else
- {
- for(i = 0 ; i < 5 ;++i) // Servoyu ortala
- {
- bit_set(b_kapisi,7);
- delay_us(1500);
- bit_clear(b_kapisi,7);
- delay_ms(17);
- delay_us(1500);
- }
- }
- }
- }
pic_2.h :
- #include <16F877A.h>
- #device *=16
- #device adc=8
- #FUSES NOWDT //No Watch Dog Timer
- #FUSES HS //High speed Osc (> 4mhz)
- #FUSES NOPUT //No Power Up Timer
- #FUSES NOPROTECT //Code not protected from reading
- #FUSES NODEBUG //No Debug mode for ICD
- #FUSES NOBROWNOUT //No brownout reset
- #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
- #FUSES NOCPD //No EE protection
- #FUSES NOWRT //Program memory not write protected
- #use delay(clock=20000000)
E- Devrenin Resmi:
F- Vidyo: