PIC16F84 İle ADC Kullanarak Servo Motor Kontrol Uygulaması

Bu uygulamada PIC16F84 ve ADC0831 kullanarak hem bir ADC uygulaması hem de servo motor kontrol uygulamasını beraber yapıyoruz. Bildiğiniz gibi 16F84'ün kendi ADC'si yok, ee bize de 16F877'deki gibi 40 pin gerekmiyor ve içinde adc olan PIC12C671-72 Türkiye'de zor bulunabildiğine göre (hatta yok!!) geriye ADC0831 gibi bi entegre kullanarak kendi ADC'mizi yapmak kalıyor. Siz zahmet etmeyin diye ben uğraştım, yaptım ve oldu... Projede yaptığım uyguşama ise şöyle; bildiğiniz gibi (ya da bilmiyosanız aşağıdaki linkleri ziyaret edin!!) servo motorlar konum kontrolü yapılabilen motorlar, yani gönderdiğiniz sinyalin süresine göre döndürülebilen motorlar. Yaklaşık olarak 1ms süreli bir sinyal gittiğinde tam sağ, 2ms sinyal gittiğinde tam sol (tersi de olabilir :)) tarafa dönen, arada bi değer gittiğinde ise bu süreyle orantılı değerde dönen motorlardır. Peki ben ne yaptım? ADC'den standart bir potun değerini okuyırak elde ettiğim değer kadar motoru döndürdüm. Bu tip bir uygulamayla elimizin altındaki potu döndürerek motoru da aynı oaranda döndürmüş olduk. Mesela siz motora bi düzenekle Web-Cam bağlayıp istediğiniz gibi döndürebilirsiniz...

Uygulamanın yazılımını PICBasic Pro dili ile oluşturdum. Kod aşagıdaki gibi.
Include "Modedefs.Bas"
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 2
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 3
csenable var portA.0 'ADC0831 ENABLE GİRİŞİ
clock var portA.1 'ADC0831 CLOCK GİRİŞİ
veri var portA.2 'ADC0831 DATA ÇIKIŞI
i var byte
digital var byte 'ADC DEN OKUNAN DEĞERİN YAZILDIĞI BYTE
TRISA=%00000100
PORTA=%00000000
MAIN:
WHILE 1 'SONSUZ DÖNGÜ
GOSUB ADC 'ADC ALT PROGRAMINA GİT
LCDOUT $FE,1,"ADC= ", #digital 'LCD YE OKUNAN DEĞERİ YAZ
pulsout PORTA.3,digital
WEND 'SONSUZ DÖNGÜ
ADC:
low csenable 'ENABLE 0
PAUSEUS 10 'BEKLE
'veri Yİ OKUMAYA BAŞLAMADAN ÖNCE 2 CLOCK GÖNDERME KISMI........
for i=0 to 1 '2 DEFA
high clock 'CLOCK 1
PAUSEUS 1 'BEKLE
low clock 'CLOCK 0
PAUSEUS 1 'BEKLE
next i
'MSB BİTİ OKUMA VE BİR SONRAKİ BİT İÇİN CLOCK GÖNDERME KISMI
for i=7 to 0 STEP -1 '8 DEFA DÖN
digital.0[i]=veri 'veri PİNİNİN DEĞERİNİ digital İÇİNE YAZ
'veri DEN ÖNCE MSB BİT GELİR.... ( 7 TO 0 STEP -1 )
high clock 'CLOCK 1
PAUSEUS 1 'BEKLE
low clock 'CLOCK 0
PAUSEUS 1 'BEKLE
next i
'veri Yİ OKUDUKTAN SONRA veri SONU İÇİN 2 SON CLOCK DARBESİ
for i=0 to 1 '2 DEFA
high clock 'CLOCK 1
PAUSEUS 1 'BEKLE
low clock 'CLOCK 0
PAUSEUS 1 'BEKLE
next i
PAUSEUS 10 'BEKLE
high csenable 'veri Yİ OKUDUKTAN SONRA ENABLE 1
PAUSE 200 'BEKLE
RETURN 'ALT PROGRAM SONU
END
Üstte görülen devrede RV1 potu ile motorun dönüşünü ayarlıyoruz...
Not: Proteus simulasyonları Proteus 6.5 ile hazırlanmıştır. Eski versiyonlarda açmak konusunda sorun çıkabilir.

Servo motorlar hakkında bilgi için...