Notlar..

320volt / Mikrodenetleyici Projeleri/

Mikrodenetleyici uygulamaları bilgiler pic c pic16f877

Mikrodenetleyici Projeleri, blog arşivinde MIKRODENETLEYICI UYGULAMALARI BILGILER PIC C PIC16F877 konusu "dc motor* hd44780 lcd* lcd kullanımı* microchip pic projeleri* PIC C* PIC16F877* pic16f877 pwm* picc dili* picc uygulamaları* servo motor* " ile etiketlendi

Pic c ile pic programlamayı öğrenmeye çalıştığım şu zamanlarda çok işime yarayacak bir döküman tam bir bilgi deposu dc-servo motorlar pwm kullanımı lcd kullanımı ve picc hakkında bilgiler. Emeği geçen kişilere teşekkürler

LCD Yapısı Ve Programlanması

Bu kısımda paralel girişli LCD’nin yapısı ve programlanması verilecektir. LCD (Liquid Crystal Display)’ler bilginin uygulanış yöntemine göre paralel ve seri girişli olmak üzere iki kısımda incelenebilmektedir. LCD’nin kullanım amacı elektronik sistemlerde bilgilendirme için çeşitli karakterleri ve karakter topluluklarını göstermektir.

LCD içerisindeki hazır karakterler kullanılarak veya özel karakterler hazırlanarak üzerinde anlamlı görüntüler oluşturulabilir.

LCD dijital bilgi üreten herhangi bir sistem ile kontrol edilebilir. Yapılması gereken tek şey uygun komutları katalogda gösterilen zamanlama dilimleri ile göndermektir. LCD bilgisayarla veya mikrodenetleyici ile kontrol edilebilir.

LCD’nin yapısı iki kısımdan meydana gelir. Bunlar yazı ya da grafikleri gösteren sıvı kristal display ve bu displayde karakterleri meydana getiren sürücü işlemcidir. LCD incelendiğinde bir yüzünde LCD diğer yüzünde de sürücü işlemci görülür.

İşlemci entegre görünümünde olabileceği gibi siyah epoksi damla şeklinde de olabilir. Şekil 1.9’da HD44780 paralel girişli LCD görülmektedir. HD44780 LCD devresinde yer alan epoksi damla olarak yerleştirilmiş sürücü entegresidir. Bu kısımda piyasada bulunması kolay ve kullanım alanı geniş olduğundan dolayı bu LCD ile ilgili bilgiler verilip uygulama yapılacaktır.

HD44780 işlemci LCD’ler için standart olmuş bir işlemcidir. LCD’nin arkasına bakılıp işlemci seri numarası okunabilir ve işlemcinin yapısı kataloglardan öğrenilebilir. Günümüzde birçok
firmanın ürettiği LCD, HD44780 ile uyumludur.

LCD’ler satır ve sütun sayısı ile tanımlanır. Satır uzunluklarına (sütun sayılarına) göre 8-16-20-24-32-40 karakterli olarak yapılır. Satır sayısına göre ise 1, 2 ya da daha çok satırlı olabilir. 2×8 denince 2 satırlı 8 sütunlu LCD akla gelmelidir. 2×8 ve 1×16 LCD’de sadece bir işlemci kullanılırken, 2×16 ve 2×20 LCD’lerde işlemcinin yanı sıra bir de hafıza entegresi bulunur. Boyut arttıkça hafıza kapasitesi de artar. Tüm entegreler siyah epoksi damla şeklinde veya entegre şeklinde PCB üzerine yerleştirilir.

Şekil 1.9: HD44780 LCD Display
hd44780-lcd-display

LCD’lerde DDRAM ve CGRAM olmak üzere iki adet RAM hafıza hücresi yer alır. CGRAM karakter üretici RAM bellektir ve 64 Baytlık bir hafızadır. Özel karakterler üretmek için kullanılır. DDRAM ise display veri RAM belleğidir ve 80 Baytlık bir hafızadır.

LCD’nin satır ve sütunlarına karakter yazmak için kullanılır. DDRAM içeriği LCD ekranında görülür, fakat görünen veri ancak LCD’nin sütun sayısı ile sınırlıdır. Örneğin 2×16’lık bir LCD’de ancak 16 karakter ekranda görülebilir. Diğer kayıtlı veriler DDRAM’da saklanmaya devam eder. Şekil 1.11’de DDRAM adreslerinin değişimi görülmektedir.

LCD’nin içinde bulunan diğer hafıza ise CGROM’dur. Karakter üretici ROM bellek olarak tanımlanır ve 192 Baytlık bir hafızadır. CGROM içerisinde ASCII karakter tablosunda yer
alan standart karakterler kayıtlıdır. Toplam karakter sayısı 192’dir. Bunlardan 64 tanesi genel olarak kullanılan ascii karakterleri, 64 tanesi Japon karakterleri ve 32 tanesi de özel yunan alfabesi karakterleridir. Bu karakterlerden genel olarak kullanılan 64 tane standart karakter Şekil 1.10’daki ASCII karakter tablosunda görülmektedir.

Şekil 1.10: ASCII Karakter tablosu
ascii-karakter-tablosu

LCD’nin dış dünya ile haberleşmesi için pinleri bulunmaktadır. HD44780 uyumlu LCD’de 14 pin bulunmaktadır. Bu pinler 2’şerli 7 sıra halinde olabileceği gibi 14’lü tek sıra olabilir. Bu pinlerin fonksiyonları Şekil 1.14’teki tabloda görülmektedir. LCD 4×40 ise ilave bir pini daha vardır. Ayrıca bazı LCD’lerde ışıklandırma amacıyla 15. ve 16. pinlere de rastlanabilir. 15. ve 16. pinler yoksa LCD devresinde aydınlatma uçlarından da bağlantı yapılabilir. Bu ilave pinlerin karakter gösterilmesinde bir etkisi yoktur. HD44780 LCD ışıklandırma bağlantıları Şekil 1.13’te görülmektedir.

Şekil 1.13: HD44780 LCD displayde ekran ışığı bağlantı uçları
hd44780-lcd-displayde-ekran

LCD Ayak bağlantıları

1- Vdd (5V gerilim ucu)
2- Vss (Şase bağlantı ucu)
3- Vee (Kontrast gerilimi ucu)
4- RS (Komut/Veri seçim ucu)
5- R/W (Yazma-Okuma ucu)
6- E (Uygulama izin ucu)
7- D0 (0. veri (LSB) ucu)
8- D1 (1. veri ucu)
9- D2 (2. veri ucu)
10- D3 (3. veri ucu)
11- D4 (4. veri ucu)
12- D5 (5. veri ucu)
13- D6 (6. veri ucu)
14- D7 (7. veri (MSB) ucu)

a. Vdd ve Vss: LCD Vdd ucuna bağlanan 5V gerilim ile çalışır. Bağlandığı kontrol elemanı ile şase bağlantısı Vss ile mutlaka yapılmalıdır.

b. Vee: Vee ucu ile 5V arasına 10K değerinde bir trimpot bağlanarak LCD ekranın kontrast seviyesi değiştirilebilir.

c. RS: RS ucu lojik-0 ise komut gönderiliyor, lojik-1 ise veri gönderiliyor anlamındadır. Kontol devresinden RS ucuna önce lojik-0 gönderilir. Sonra işlenecek olan komut veri uçlarına(D0..D7) yazılır. RS ucu lojik-1 yapılarak komutun işlevi ile ilgili veri diğer bir değişle ekranda gösterilecek olan veri aynı uçlara gönderilir.

d. R/W: 0 ise LCD hafıza hücresine veri yazılır. 1 ise hafıza hücresinden veri okunur.

e. E: Gönderilen komutun uygulanması için veya verinin işlenmesi için kontrol devresinden bu uca lojik-1’den 0’a düşen (düşen kenar) bir kare dalga sinyal gönderilir.

f: D0..D7: Komut girişi ve veri giriş-çıkışı için kullanılırlar. 8 bitlik modda tümü kullanılırken 4 bitlik LCD çalışmasında D7..D4 uçları kullanılır.

Şekil 1.15: PIC16877-LCD Bağlantısı (8 bit Modu)

pic16877-lcd-baglantisi-8-bit-modu

Şekil 1.15’te PIC16F877 ile LCD bağlantısı için örnek bir devre görülmektedir. PortB’nin ilk üç biti kontrol bitleri için kullanılmış, PortD ise veri bitleri için kullanılmıştır. RV1 potansiyometresi ile LCD’nin kontrastı ayarlanmaktadır. Bu bağlantı ile LCD 8 bit modda kontrol edilebilir. Ancak yazılan programda program kodları 8 bitlik çalışmaya göre yazılmalıdır.

Şekil 1.16’da PIC16F877 mikrodenetleyicinin 4 bitlik moda LCD’yi kontrol ettiği örnek bir devre görülmektedir. Bu devrede LCD’nin 4 bit modda bağlantısı için sadece PortB kullanılmıştır. Böylece mikrodenetleyicinin diğer portları farklı amaçlar için kullanılabilir.

LCD Programlama HD44780 Komut Seti

Şekil 1.16: PIC16877-LCD Bağlantısı (4 bit Modu)

pic16877-lcd-baglantisi-4-bit-modu

PIC-C ile LCD’yi kontrol etmek ve veri alışverişi yapmak çok kolaylaştırılmıştır. PIC Assembly dili ile çok karmaşık olan programlar PIC-C ile başlık ve sürücü dosyaları sayesinde çok daha kısa ve anlaşılır biçimde yazılabilir. Bu kısımda LCD’nin çalışma mantığını anlamak amacıyla kataloglarda gösterilen fonksiyonlardan bahsedilecektir.

  • DDRAM: Display Data RAM
  • CGRAM: Karakter Üretici RAM
  • BF=1 ise komut kabul edilmez.LCD meşguldur. BF=0 ise komut kabul edilir.
  • N=0 ise 1 satır, N=1 ise 2 satır kullanılır.
  • * Önemsiz giriş 1 ya da 0
  • F=1 5×10 karakter fontu, F=0 5×7 karakter fontu
  • I/D=0 Kursör pozisyonunu 1 azalt, I/D=1 Kursör pozisyonunu 1 arttır.
  • S=0 ise display kaymaz, S=1 ise display kayar.
  • C=0 ise kursör kapalıdır, C=1 ise kursör açıktır.
  • R/L=0 ise sola kayma gerçekleşir, R/L=1 ise sağa kayma gerçekleşir.
  • DL=0 ise LCD 4 bit modda çalışır, DL=1 ise LCD 8 bit modda çalışır.
  • S/C=0 ise kursör hareket eder, S/C=1 ise display hareket eder.
  • B=0 ise kursör karartma kapalı, B=1 ise kursör karartma açık.

LCD’nin yukarıdaki komutları işlemesi için ilgili uçlara dijital bilgi uygulandıktan sonra E ucundan 1’den 0’a düşen bir izin darbesi uygulanmalıdır. Bu sinyal uygulanmadan LCD komutu işleyemez.

Enerjinin Gelmesi ve Resetleme

HD44780 LCD’ye enerji uygulandığı zaman dahili reset devresi çalışır. Enerji verildikten yaklaşık 10 msn sonra meşgul bayrağı (BF) lojik-1 olur. BF bayrağı ilk kullanıma hazırlama işlemlerinin sonuna kadar otomatik olarak meşgul durumda kalır. Programda yapılması gereken ilk kullanıma hazırlama temel işlemleri aşağıda verilmiştir.

LCD’ye enerji geldiği zaman mikrodenetleyici programının ilk başlangıçta en az 40 ms beklenmesinde fayda vardır. Kullanılan gerilim kaynağı yeterli akım veremiyorsa ya da kalitesiz ise sistemde hata oluşabilir. Gerilim kaynağı lojik yükselme zamanı 10 msn’den daha fazla ise LCD iç reset devresinin çalışmasında problem çıkabilir. Bu nedenle gerilim kaynağı özenle seçilmelidir. Portların giriş çıkış işlemleri için kurulumu sırasında belirli bir zaman geçtiğinden dolayı port kurulumu için bekleme yapmakta fayda vardır.

Programda ilk işlem olarak lcd fonksiyon kurma komutunun yüksek dört biti ile resetlenmelidir. Bu amaçla 8 bitlik çalışma modunda arka arkaya 3 defa 30h komutu gönderilir. 4 bitlik modda ise arka arkaya 3 defa 20h komutu gönderilir. Meşgul bayrağı kullanılmıyorsa her komut arasında 1 ms’lik gecikme yapılmalıdır.

PICC Dili ile LCD Programlama

CCS C derleyici yaması bilgisayara yüklenip MPLAB programına bağlandığında PICC dili ile program yazılıp derlenebilir. Tabi istenirse başka programlar ve yamaları kullanılabilir. Bilgisayardaki PICC klasörü incelendiğinde iki alt klasör göze çarpar.

Bunlar “Devices” ve “Drivers” klasörleridir. “Devices” klasörü içerisinde mikrodenetleyicilerin donanım tanımlarının yer aldığı başlık dosyaları yer almaktadır. Bu dosyaların uzantısı .h ile biter. Programda PIC16F877 entegresi ile ilgili donanım kullanılacağından dolayı “#include <16F877.h>” komutu programın en başında kullanılmalıdır. Aslında 16F877.h dosyası C dili ile yazılmıştır.

İncelendiğinde PIC16F877 mikrodenetleyicisinin donanım kullanımına yönelik ifadeler ve
fonksiyonlar göze çarpar. 16F877 başlık dosyası programın başında tanımlandığında başlık
dosyasında tanımlanan fonksiyonlar ve ifadeler yazılan PIC-C programında kullanılabilir.
16F877.h başlık dosyasını inceleyiniz.

“Drivers” klasörü içerisinde çeşitli elektronik yapıların sürücü dosyaları yer almaktadır. Burada yer alan dosyaların uzantıları .C ile biter. Bu klasörde LCD’ye özel LCD.C dosyası vardır ve bu dosya içerisinde LCD kulanımı için fonksiyonlar yer almaktadır. Eğer LCD kullanılmak isteniyorsa LCD.C sürücü dosyası programın başında tanımlanmalıdır. Bu amaçla “#include ” komutu kullanılır. Aşağıda CCS C derleyicisi ilk kurulduğunda LCD.C dosyasının içeriğinden bir kısım görülmektedir. Aşağıda görüldüğü gibi, sürücünün en başında sürücü tanımlandığında kullanılabilecek fonksiyonlar gösterilmiştir.

LCD.C sürücüsü HD44780 temelli tüm LCD’ler için kullanılabilen bir dosyadır. İlk başlangıç değeri 4 bitlik çalışma modu için uygundur. Fakat bu haliyle programda kullanılmaz. Öncelikle kullanılacak donanıma uyup uymadığı incelenmelidir. Bu haliyle LCD’nin PortD’ye bağlanması gereklidir. Ancak bu modülde örnek olarak şekil 1.16’daki devreye göre programlar yazılacaktır. Bu devrede LCD PortB’ye bağlanmıştır. Bu nedenle LCD.C dosyası öncelikle açılmalı, yukarıda ok ile gösterilen kısımda gerekli donanım değişiklikleri yapılmalı ve dosyanın orjinalliğini bozmamak için farklı adla kaydedilmelidir.

PICC Örnek 1


//LCD KONTROL PROGRAMI-LCD1_1.C

//LCD ekranında 80H adresine L harfi yazdırma

//PB0-X / PB1-RS / PB2-RW / PB3-E / PB4...PB7 - 4 bit data

#include <16F877.h>

#use delay(clock=20000000) //Devrede 20Mhz’lik krsital kullnılıyor

#fuses hs,NOWDT,NOPROTECT,NOLVP

#byte port_b=6 // port_b nin adresi

#define RS PIN_B1

#define RW PIN_B2

#define E PIN_B3

#define PB4 PIN_B4

#define PB5 PIN_B5

#define PB6 PIN_B6

#define PB7 PIN_B7

io_setout()

{

set_tris_b(0x00); // port_b = çıkış

}

komutyaz()

{

Output_Low(RS); // RS=0 Komut geliyor.

Output_Low(RW); // R/W=0 Yazma modu

}

veriyaz()

{

Output_High(RS); // RS=1 veri geliyor.

Output_Low(RW); // R/W=0 Yazma modu

}

uyg()



{

Output_High(E); // Uygulamadan önce portların kurulması için 1 ms ile beklenir

delay_ms(1); // Kullanılmazsa LCD çalışması kitlenmektedir.

Output_Low(E);

delay_ms(1);

}

clrdsply()

{

komutyaz();

port_b=0x00;

uyg();

port_b=0x10; //01H ekran temizleme komutu gönderiliyor.

uyg();

}

dsplay_on()

{

komutyaz();

port_b=0x00;

uyg();

port_b=0xC0; //0CH Display açma komutu gönderiliyor.

uyg();

}

lcdreset()

{ komutyaz();

port_b=0x20; // 2 değeri porb7-4'e gönderiliyor.

uyg();

port_b=0x20;

uyg();

port_b=0x20; //4 bit modda resetleme için 3 defa 20h PB7-4'e uygulanıyor.

uyg();

}

lcdkur()

{

komutyaz();

port_b=0x20; // 2 değeri porb7-4'e gönderiliyor.

uyg();

port_b=0x80; // 8 değeri porb7-4'e gönderiliyor.

uyg(); // 28h komutu uygulandı. 4 bit modu 2 satır 5*7 fontu kuruldu.

}

adreskur()

{

komutyaz();



port_b=0x80;

uyg(); // 80H PortB'den gönderiliyor.

port_b=0x00; // DDRAM adresi 00h olarak kuruluyor. 1.satır 1.sütun

uyg();

}

verigonder()

{

veriyaz();

port_b=0x42; // RS'nin 1'de kalması sağlanıyor.

uyg(); // Bu nedenle 42 ve C2 verileri gönderiliyor.

port_b=0xC2;

uyg(); // 4CH verisi gönderildi.

} // DDRAM adresi üzerinden L harfi(4Ch) 1.satır 1.sütuna yazıldı.

giriskur()

{

komutyaz();

port_b=0x00;

uyg();

port_b=0x60;

uyg(); // 06H PortB'den gönderiliyor. Giriş modu sağa hareket

}

void main()

{

io_setout();

lcdreset();

clrdsply();

lcdkur();

dsplay_on();

giriskur();

adreskur();

verigonder();

}

PIC-C Örnek 2


//LCD KONTROL PROGRAM-sürücü dosyalı

//LCD ekranında 2. satır 16. sütuna (4Fh) L harfi yazdırma

//PB0-X / PB1-RS / PB2-RW / PB3-E / PB4...PB7 - 4 bit data

#include  //Gerekli tüm tanımlamalar sürücüde mevcuttur

#fuses hs,NOWDT,NOPROTECT,NOLVP

void main()

{ io_setout();

clrdsply();

lcdreset();

lcdkur();

dsplay_on();

giriskur();

adreskur();

verigonder();

}

LCDdrv.c sürücü programı aşağıda görülmektedir.

//LCD SÜRÜCÜ-LCDdrv.c

//PB0-X / PB1-RS / PB2-RW / PB3-E / PB4...PB7 - 4 bit data

#include <16F877.h>

#use delay(clock=20000000)

#byte port_b=6 // port_b nin adresi

#define RS PIN_B1

#define RW PIN_B2

#define E PIN_B3

#define PB4 PIN_B4

#define PB5 PIN_B5

#define PB6 PIN_B6

#define PB7 PIN_B7

io_setout()

{

set_tris_b(0x00); // port_b = çıkış

}

komutyaz()

{

Output_Low(RS); // RS=0 Komut geliyor.



Output_Low(RW); // R/W=0 Yazma modu

}

veriyaz()

{Output_High(RS); // RS=1 veri geliyor.

Output_Low(RW); // R/W=0 Yazma modu

}

uyg()

{Output_High(E); //Portların kurulması buradaki 1 ms ile bekleme

delay_ms(1);

Output_Low(E);

delay_ms(1);

}

clrdsply()

{komutyaz();

port_b=0x00;

uyg();

port_b=0x10; //01H ekran temizleme komutu

uyg();

}

dsplay_on()

{komutyaz();

port_b=0x00;

uyg();

port_b=0xC0; //0CH Display açma komutu

uyg();

}

lcdreset()

{ komutyaz();

port_b=0x20; // 2 değeri porb7-4'te

uyg();

port_b=0x20;

uyg();

port_b=0x20; //4 bit modda resetleme için 3 defa arka arkaya 20h

uyg();

}

lcdkur()

{ komutyaz();

port_b=0x20; // 2 değeri porb7-4'te

uyg();

port_b=0x80; // 28h 4 bit modu 2 satır 5*7 fontu

uyg();



}

adreskur()

{ komutyaz();

port_b=0xC0;

uyg(); // DDRAM adresi 4Fh 2.satır 16.sütun

port_b=0xF0;

uyg();

}

verigonder()

{ veriyaz();

port_b=0x42;

uyg();

port_b=0xC2;

uyg(); // DDRAM adresine L harfi(4Ch) 2.satır 16. sütuna yazılıyor.

}

giriskur()

{komutyaz();

port_b=0x00;

uyg();

port_b=0x60;

uyg(); //06H PortB'den gönderiliyor. Giriş modu sağa hareket

}

LCD’de Karakter Oluşturma

LCD’nin CGRAM belleği kullanılarak Şekil 1.10’da görülen ASCII tablosundaki karakterlerin dışında özel karakterler gerçekleştirilebilir. Örneğin Türkçe karakterler ASCII tablosuna göre LCD’ye yazdırılamaz. Aynı şekilde yukarı ok, dörtgen, ağaç figürü gibi karakterler için hazır bir kod mevcut değildir. Bunlar gibi özel karakterleri LCD ekranına getirmek için CGRAM kullanılır. Ancak LCD enerjisi kesildiğinde CGRAM’da oluşturulan karakter de silinir. CGRAM’in yapısı ve kullanımı Şekil 1.21 ile anlaşılabilir.

Şekil 1.21: CGRAMYapısı

cgram-yapisi

CGRAM’de toplam 8 adet özel karakter oluşturulabilir. Bu amaçla yukarıda 0-7 aralığında gösterilen 8 adet karakter kümesi kullanılır. Her kümenin bir adresi vardır ve CGRAM’deki karakter bu adresle DDRAM’e aktarılır ve ekranda gösterilir. Yukarıdaki şekilde küme adreslerine ulaşmak için gerekli komutlar görülmektedir. Örneğin 4. kümeye ulaşmak için 60H komutu kullanılmalıdır. Daha önce anlatıldığı gibi DB6 biti CGRAM kurma komutunu bildirir.

SERVO MOTOR KONTROLÜ

Otomasyon sistemlerinde üretimin otomatik olarak gerçekleşmesi için elektrik enerjisinin harekete çevrilmesi gerekmektedir. Hareket elde etmek için kullanılan en önemli elemanlar motorlardır. Daha önceki modüllerde doğru akım motoru ve adım motorunu öğrenmiştiniz. Bu öğrenme faaliyetine başlamadan önce bu motorların yapısını incelemenizde fayda vardır. Doğru akım motoru ve adım motoru ile hassas açılara dönme hareketi yapmak zordur. Özellikle robot sistemlerinde belirli açılarla dönme hareketi yapılmalıdır.

Bu nedenle doğru akım motorları geliştirilmiş ve “servo motor” ortaya çıkmıştır. Servo-motorlar, verilen girişe göre istenen açısal konuma gelen motorlardır. Günümüzde ac veya dc gerilimle çalışabilen, çeşitli güçlerde ve ebatlarda servo motorlar mevcuttur. Servo motorların çok çeşitli uygulamalarda kullanılmasını nedenleri;

  • Güvenilir olması
  • Yüksek tork değerlerine sahip olması
  • Konumlamada yüksek doğruluk göstermesi
  • Kolay kurulum ve bağlantı özelliği
  • Kontrol kolaylığı
  • Ekonomik oluşu

olarak verilebilir. Bu öğrenme faaliyetinde literatürde “RF Servo Motor” ya da “RC Servo Motor” olarak da geçen DC Servo Motorun temel yapısı incelenecektir.

Servo Motorun PIC16F877 Mikrodenetleyici ile Kontrolü

PIC16F877 mikrodenetleyici kullanarak çok kaliteli zamanlama sinyalleri elde edilebilir ve servo motor hassas açılarla hareket ettirilebilir. Bu bağlamda program içerisinde PIC-C dilinin avantajarını kullanmak gerekir. Örneğin 1 ms’lik bir zamanlama için “delay_ms(1)” komutunu kullanmak yeterlidir.

Şekil 2.8’de servo motoru kontrol etmek için gereken akış diyagramı görülmektedir. PIC16F877’yi ilk kullanıma hazırladıktan sonra servonun konumlanacağı açıyı bildiren zamanlama sinyali oluşturulur. Bu sinyal alt program yardımıyla da oluşturulabilir.

Öncelikle servo motorun kontrol ucuna bağlı port biti lojik-1 yapılır. Kullanılan servo motorun karakteristiğine göre Ton süresi ayarlanır ve bu süre kadar bekleme yapılır.Böylece kontrol ucuna açı kontrol bilgisi ulaşmış olur. Lojik-1 seviyesindeki beklemeden sonra PIC ucu lojik-0 yapılır. Aynı şekilde 10-18 ms lojik-0’da bekleme yapılır. Bu işlemler sürekli tekrarlanırsa motor mili boşta kalmadan sürekli açı pozisyonunu korur.

Şekil 2.9’da PIC16F877’li bir servo sürücü devresi örneği görülmektedir. Örnek devrede görüldüğü gibi PIC ile servo motor arasına n kanal bir mosfet bağlanmıştır. Servo motor dönüş hareketi yapmaya başladığında gerilim kaynağından akım çeker. Akım çekilmesi esnasında gerilim kaynağındaki dalgalanma mikrodenetleyiciyi etkiler.

Mosfet kullanılmadan da 5V’luk servo motorlar doğrudan mikrodenetleyici portuna bağlanarak dönme hareketi yapabilir. Ancak mosfet gibi arada bir tampon eleman kullanıp servo motor için ikinci bir besleme kaynağı kullanmak sürücü devrenin ve tüm sistemin çok daha kaliteli ve güvenilir olmasını sağlayacaktır. Özellikle servo motor bir yükü hareket ettirdiği zaman daha fazla akıma ve dolayısıyla güce ihtiyaç duyacağından harici besleme kaynağı yararlı olacaktır. Harici besleme kaynağının kullanılıp kullanılmayacağı yapılan sisteme göre tasarımcının karar vereceği bir problemdir. Şekil 2.9’da mosfet ve servo motor için ikinci besleme kaynağı(Vcc) kullanılmıştır.

PIC C Örnek


//SERVO MOTOR KONTROL PROGRAMI- ORNEK-1

//PD0: Servo kontrol sinyali için kullanılacak

#include <16F877.h>

#use delay(clock=20000000)

#fuses HS,NOWDT,NOPROTECT,NOLVP

#byte port_d=8 //portd'nin adresi

#define CNT PIN_D0

io_setout()

{

set_tris_d(0x00); // port_d = çıkış

}

void main()

{io_setout();

while(1)

{

Output_High(CNT);

delay_us(1750); // Lojik-1 süresi 1,75 ms

Output_Low(CNT);

delay_us(18250); // Lojik-0 süresi 18,25 ms

}

} // Periyot 20 ms

picc-servo-motor-surucu-mosfet-pic16f877

Şekil 2.10’da N kanal mosfet çıkışı görülmektedir. Mosfet çıkışı ile mikrodenetleyici çıkışı aynı fazlıdır. Mosfet kapı girişine lojik-1 seviyeli sinyal geldiğinde mosfet iletime geçer. Kaynaktaki R3 direncinin üst ucu lojik-1 olur. Böylece giriş lojik-1 iken çıkış da lojik- 1’dir.

Tam tersi bir şekilde kapı girişine lojik-0 seviyeli sinyal geldiğinde mosfet yalıtımdadır. Bu durumda mosfet yalıtımda olduğu için R3 direncinin üst ucu şase potansiyelindedir, diğer bir deyişle lojik-0’dır. Sonuç olarak girişdeki zamanlama sinyalinin aynısı çıkışta elde edilir. Mosfet sayesinde servo motor kendisi için gereken akımı gerilim kaynağından çeker. Mosfet çıkışındaki sinyalin Ton süresi 1,75 ms, Toff süresi de 18,25 ms’dir. Mosfet
çıkışındaki sinyalin periyotu ise;

T=Ton+Toff formülüne göre
T=1,75+18,25=20 ms bulunur.

Zamanlama sinyaline göre servo motor 1,75 ms ile ifade edilen açıya doğru dönüş yapar ve bu açıda bekler.

Şekil 2.10: Servo sürücü devresi mosfet çıkışı Time/div=5 ms Volt/div=2V

mosfet-cikis-surucu-devresi

Devrenin Çalışması: Devreye ilk enerji verildiğinde servo motor başlangıç pozisyonunda olacaktır. Bu aşamadan sonra B1 buTonuna basıldığında motor mili -90 dereceye gelecek, B2 buTonuna basıldığında ise +90 dereceye dönecektir. Çalışma sürekli +90 ve -90 derece arasında gerçekleşecektir.

PWM KONTROLÜ

PWM Teorisi : Bu faaliyette dc motor, PIC16F877’de bulunan PWM modülü ile kontrol edilecektir. Otomasyon sistemlerinde PWM tekniğinin kullanıldığı birçok uygulama mevcuttur. Bunlardan en yaygın olanı da dc gerilim değerinin değiştirilmesi işlemidir. Dc gerilimin değeri “dc-dc konverter” adı verilen sistemler ile değiştirilebilmektedir. Bu sistemlerde dc gerilimin seviye dönüşümü için bir veya daha fazla transistör, mosfet vb. gibi yarı iletken anahtar kullanılır. Ortalama çıkış gerilimi anahtarlama elemanının Ton ve Toff zamanı ayarlanarak yapılır. Anahtarlamalı güç kaynaklarında gerilim regülasyonunu sağlamak için yapılan bu işleme “Darbe Genişlik Modülasyonu”(PWM) adı verilir. PWM sinyali üreten bir devreye de “PWM Modülatörü” adı verilir. Kare dalga bir sinyalin periyotu için;

T=Ton+Toff

eşitliği kullanılır. Bu formülde “Ton” ifadesi kare dalga sinyalin lojik-1 değerinde kalma
süresi, “Toff” ise kare dalga sinyalin lojik-0 değerinde kalma süresidir.

Darbe genişlik modülasyonunda çıkış gerilimi izlenir ve sabit bir gerilim ile karşılaştırılır. Şekil 3.1’de görüldüğü gibi Vo çıkış gerilimi ile Vr referans gerilimi arasındaki fark alınarak yükseltilir. Vo çıkış gerilimi, fark yükselticinin pozitif girişine uygulandığı için çıkış gerilimi arttığında hata gerilimi artacak, çıkış gerilimi azaldığında ise hata gerilimi azalacaktır. Vhata gerilimi ile bir üçgen dalga sinyali opampla yapılan karşılaştırıcı ile kıyaslanır.

Karşılaştırıcı çıkışında modüleli kare dalga sinyal elde edilir. Hata gerilimi karşılaştırıcının negatif girişine verilmişse, hata gerilimi artınca darbe genişliği azalacak, hata gerilimi azalınca darbe genişliği artacaktır. Böylece gerilim regülasyonu sağlanacaktır. Bu durum şekil 3.2’deki sinyal şekillerinde görülmektedir.

PIC16F877’DE PWM Özelliği

2. öğrenme faaliyetinde servo motor kontrolü için PIC16F877 mikrodenetleyici ile pwm sinyali üretilmişti. Daha önceki program uygulamalarında pwm sinyali üretmek için herhangibir port pini belirli süreler ile lojik-1 ve lojik-0 yapılmıştı. Bu programlar dikkatli bir şekilde incelenirse, özellikle mikrodenetleyici ile birden fazla iş yapılması durumu göz önüne alındığında, mikrodenetleyicinin sürekli meşgul durumda olduğu ve ikinci bir iş yapıldığında pwm sinyalinin bundan etkileneceği anlaşılır.

PWM üretiminin de yer aldığı kompleks sistemlerde mikrodenetleyicilerin çok fonksiyonluluk özelliğinden etkili bir şekilde yararlanılırsa, sistemin verimliliği ve güvenirliği artarken karmaşıklığı ve maliyeti azalır. Bu bağlamda, PIC16F877 mikrodenetleyici iç yapısında birçok elektronik modül vardır ve konumuzla ilgili olduğundan burada PWM modülünün kullanılmasına değinilecektir. PWM modülü sayesinde ana programın çalışmasını meşgul etmeden otomatik olarak bağımsız bir hattan PWM sinyali elde edilebilir. PIC-C dili ile PWM sinyali üretmek hazır fonksiyonlar sayesinde oldukça kolaylaştırılmıştır. Bu konuya girmeden önce PWM için kullanılan yazmaçlara göz atalım.

PIC16F877 ile Dc Motor Kontrolü

Daha önceki mikrodenetleyici modüllerinde doğru akım motorunun kontrolü ile ilgili bilgiler verilmişti. Bu kısımda aynı bilgiler tekrar verilmeyecek, sadece PIC16F877 PWM modülü ve PIC-C dili kullanılarak bir doğru akım motorunun hızının nasıl değiştirileceği işlenecektir.

Şekil 3.7: PIC16F877 ile DCMotor sürücü devresi bağlantısı

dc-motor-kontrolu-picc-pic16f877

Şekil 3.7’de dc motor sürücü devresi ile PIC16F877 mikrodenetleyicinin bağlantısı görülmektedir. Mikrodenetleyici programı ile üretilen PWM sinyali RC2/CCP1 ucundan
alınarak N-Kanal Mosfetin kapı girişine uygulanır. Mosfet PWM sinyalinin Ton sürelerinde
iletimde Toff sürelerinde ise yalıtımdadır. Mosfetin iletimde olduğu sürelerde Motor içerisinden bir akım geçer. Motorun dönme hareketi sırasındaki hızı ve devir sayısı Vm gerilimi ve aktarma oranına bağlıdır. Bu bağlamda motor için ortalama gerilim değerinden

Şekil 3.8’de PIC16F877 analog dijital çevirici modülü girişine bağlanan bir potansiyometre ile analog bir değer girilmiş ve bu değer dijitale çevrilmiştir. Analog değerin dijital karşılığı da PWM sinyalinin Ton süresini belirlemek için kullanılmıştır. Böylece potansiyometreyi çevirerek DC motorun hız kontrolü yapılmış olur.

Şekil 3.8: Analog gerilim ile DC motorun PWM kontrolü

dc-motor-hiz-kontrolu-pwm

PWM için Kullanılan PIC-C Komutları

PIC16F877 Mikrodenetleyicide PIC-C dili kullanarak PWM sinyali üretmek için 3 fonksiyonu kullanmak yeterlidir.

a. SET_PWM1_DUTY() [SET_PWM2_DUTY()] : Aktarma saykılını(Ton) kurmak için 10 bitlik değer bu fonksiyon ile belirtilir. Düşük değerli bitler gerekli değilse 8 bitlik değerde bu fonksiyon ile kullanılabilir. Sadece PIC16F877 gibi CCP/PWM modülü içeren mikrodenetleyiciler için kullanılabilir. Herhangibir sürücü veya başlık dosyası gerektirmez.

Kullanımı: set_pwm1_duty(X)
set_pwm2_duty(X)

X değeri için 8 veya 16 bit genişliğinde bir sabit veya değişken kullanılabilir. Değer 10 bitlik bir sayı ise bu sayı için kullanılan değişken veya sabit en az 16 bitlik olmalıdır. Fonksiyonun dönüş değeri yoktur. Değer 8 bitlik bir sayı ise, 10 biti elde etmek için donanım tarafından lsb bitlerinde 2 adet lojik-0 biti ile kaydırma yapılır. 10 bitlik değer bir periyot içerisindeki PWM sinyalinin lojik-1’de kaldığı zaman miktarını saptamak için kullanılır. Ton zamanı (Aktarma saykılı) aşağıdaki formül ile bulunur.

b. SET_CCP1() [SET_CCP2()] : CCP modülünün çalışma modunu ayarlar.

Kullanımı: setup_ccp1 (mod)
setup_ccp2 (mod)

“mod” bir sabittir. Her mikrodenetleyicinin başlık dosyasında geçerli sabitler tanımlanmıştır. Mod değeri için kullanılan sabit ifadeler PWM modu için aşağıda verilmiştir.

“CCP_OFF” : CCP modülünü pasif yapar.
“CCP_PWM”: Darbe genişlik modülatörünü (PWM) aktif yapar.

c. SETUP_TIMER_2() : Timer2 yazmacını PWM sinyali için uygun değere ayarlar. Timer2 yazmacına sahip mikrodenetleyiciler için kullanılabilir.

Kullanımı: setup_timer_2 (mod, periyot, son bölücü)
Bu fonksiyonda mod, T2_DISABLED, T2_DIV_BY_1, T2_DIV_BY_4,

T2_DIV_BY_16 ifadelerinden biridir. Mod osilatör saat darbesinin kaça bölüneceğini
bildirir.

Periyot: Fonksiyon periyot katsayısıdır. Saat darbesi değerinin sıfırlandığı zamanı
belirleyen 0-255 arasındaki int tamsayı tipinde bir değişkendir.

Son bölücü: Bir kesme sinyalinden önce zamanlayıcının kaç defa sıfırlanacağını belirleyen 1-16 arasında bir sayıdır. Örneğin bu sayı 1 olursa zamanlayıcı 1 kere, 2 olursa 2 kere resetlenir. PWM modunda CCP modülü PWM sinyali üretir.


////Program Analog girişi okur ve bunun dijital değerini aktarma oranı için kullanır.

//// Pwm çalışıyorken analog giriş sürekli okunur. Analog değer değiştikçe Ton süresi

değişir.

#include <16F877.h>

#fuses HS,NOWDT,NOPROTECT,NOLVP

#use delay(clock=20000000)

void main()

{ byte X;

setup_ccp1(CCP_PWM); // CCP1 PWM moduna ayarlanıyor

setup_timer_2(T2_DIV_BY_16, 127, 1); // Periyot (1/clock)*4*t2div*(period+1)

setup_port_a(ALL_ANALOG); // Fosc=20000000 ve periyot katsayısı=127

setup_adc(adc_clock_internal); // (1/20000000)*4*16*128= 409,6 us or 2,44 khz

set_adc_channel( 0 );

while( TRUE )

{

X=read_adc();

set_pwm1_duty(X); // X*4*(1/clock)*t2div

}

}


//// PWM Uygulama programı ////

//// Programın başında PWM aktarma oranı %50 ////

//// ART buTonuna basıldığında PWM oranı %5'er artacak, AZAL buTonuna

basıldığında PWM oranı %5'er azalacak

//// Pwm çalışması %0 ile %100 arasında değişecek

#include <16F877.h>

#fuses HS,NOWDT,NOPROTECT,NOLVP

#use delay(clock=20000000)

#define art input(PIN_C7)

#define azal input(PIN_C6)

byte port_c=7;

int Ton,T;

io_set()

{

set_tris_c(0xF0); //7. ve 6. bitler giriş, 1. bit çıkış

}

pwmkur()

{

setup_ccp2(CCP_PWM); // CCP2’yi PWM moduna ayarla

setup_timer_2(T2_DIV_BY_16,30,1);

}

up()

{

delay_ms(10);

while(1)

{

if(art==1){Ton=Ton+5;break;} //BuTon titreşiminin geçmesi bekleniyor.



else continue;

}

delay_ms(10);

}

dwn()

{ delay_ms(10);

while(1)

{

if(azal==1){Ton=Ton-5;break;} //BuTon titreşiminin geçmesi bekleniyor

else continue;

}

delay_ms(10);

}

pwm()

{

set_pwm2_duty(Ton); //PWM sinyali CCP2’de oluşturuluyor.

}

void main()

{io_set();

pwmkur();

T=30;

Ton=15; //D=%50 başlangıç değeri

pwm();

while(1)

{

if((art==0)&(Ton!=30)) up();

if((azal==0)&(Ton!=0)) dwn();

pwm();

}

}

yukarıda özetler verilmiştir tamamı

Dosyalar: mikrodenetleyici-uygulamalari-bilgiler-pic-c-pic16f877.rar

  • emre bölme

    merhabalar….


    Ellerinize sağlık açıklamalarınız çok güzel ve anlaşılır olmuş. ;)

  • esrefcelik

    elimde kafası olmayan dijital oto teypler var. acaba sizin bu programla bu teyblerin kafasındaki lcd controller ve key scan chipleri emulate edilebilri mi??

  • varol drhsn

    hakkaten en anlaşılır açıklamalar burada çok teşekkürler :)

  • ilker

    sağ ol , çok net ve anlaşılır bir izah olmuş , çok teşekkürler