Elektronik / Mikrodenetleyici Projeleri/

AT89S52 ile Yükseklik Ayarlı Lcd Göstergeli Asansör

Sponsorlu Bağlantılar

Hazırlayan: Volkan Selçuk – Emeği geçen Kişilere Teşekkürler

Adım (Step) Motorlar :

Adım motor, açısal konumu adımlar halinde değişen motordur. Belirli adımlar halinde hareket eden bu motor, sargılarına uygun işaretler gönderilerek kontrol edilir. Herhangi bir uyartımda motorun yapacağı hareketi, adım açısı belirlemektedir. Adım açısı motorun yapısına göre genelde 1, 3, 5, 15, 45 gibi değerler olabilir. Örneğin 30 ’lik adım açısına sahip step motoru 300 hareket ettirebilmek için motora 10 adım attırmak gerekir. Adım motorlarının belirli bir yönde dönmesi için sargılarının sıralı olarak ve belli bir düzen içerisinde enerjilendirilmesi gerekmektedir.

adim-motor-sargi-uclari
Adım motor sargı uçları

Adım motorlar genel olarak 4, 5 ve 6 uçlu olabilmektedir. Piyasada 5 uçlu step motor lar yaygın olarak kullanılmaktadırlar. 5 uçlularda, uçlardan birisi “ V motor ” olarak adlandırılan ortak uçtur. Ortak uca seçilen sürücü katına göre +12V besleme veya toprak uygulanır ( Eğer motor 6 uçlu ise bu sefer 2 uç birleştirilerek +12V besleme veya toprak girişine bağlanır.) Diğer 4 kabloda motor bobinlerine gitmektedir. Motora adım attırmak için “ V motor ” kablosuna +12V( ya da toprak ), Bobinlere bağlı uçlara ise belli bir sıra ile toprak ( ya da +12V ) gönderilmesi gerekmektedir.

Orta güçte bir adım motorunu sürmek için tercih edilen en yaygın yol ULN 2003 tüm devresi kullanılmaktadır. Bu tüm devre, içerisinde 7 adet NPN transistör ve diyot bulundurmaktadır. Mikrodenet- leyici uçlarından ULN 2003 tüm devresinin girişlerine lojik ‘1’ uygulanır, tüm devrenin çıkışından ise motoru sürmek için gerekli olan lojik ‘0’ elde edilir.

Adım motorların uyartımı için birkaç farklı yol vardır. Bunlar:

Tek Fazlı Uyartım( Single Coil ):
Motor sargılarının sadece birisinin uyarıldığı uyartım cinsine tek-faz uyartım denir. Uyartım , saat yönü için 1000, 0100, 0010, 0001 şeklinde saat yönünün tersi için 0001, 00010, 0100, 1000 şeklinde olmalıdır.

tek-faz-uyartim
Tek faz uyartım için sargılara uygulanacak değerler

İki Faz Uyartım(Double Coil):
İki faz uyartım, motor sargılarının ikisinin sıra ile aynı anda uyartıldığı uyartım şeklidir. Bu uyartımda rotorun geçici durum tepkisi tek-faz uyartıma göre daha hızlıdır ancak güç iki katına çıkmaktadır.

2-faz-uyartim
İki faz uyartım için sargılara uygulanacak değerler

Yarım Adım Uyartım (Half Step):
Bu uyartım modunda tek faz ve iki faz arda arda uygulanır. Yarım adım uyartımda rotor her bir uyartım işareti için yarım adımlık bir işaret yapmaktadır. Örneğin: Fabrika çıkışı 2° olan bir motorun adım açısını 1° düşürmek bu sayede mümkün olmaktadır.

yarim-adim-uyartim-sargilari
Yarım adım uyartım için sargılara uygulanacak değerler

Adım motorun kullanımına örnekler:
Adim motorların, endüstriyel ve elektronik uygulamalarda kullanımı oldukça fazladır. En basitinden, bilgisayarımızdaki floppy disket sürücüsünde ve hard diskler de bu teknolojiye başvurulmuştur. Adim motorlar, girişlerine uygulanan lojik sinyalleri dönme hareketine çevirirler. İstediğiniz yönde ve derecede döndürebileceğiniz adim motorlar, hassas hareketleri sayesinde, birçok cihazda konum kontrolü amacıyla kullanılmaktadır. Dışarıdan bakınca çok karışık bir is gibi gözükse de PC ile adim motor kontrolü oldukça kolay ve eğlencelidir.

Adim motor sürücü devresi:

  • 1 X ULN2003 Entegre
  • 1 X 1N4001 Diyot
  • 1 X 12 Volt 5 Cable Step Motor

Adim motor sürücüsü olarak ULN2003 entegresini kullanıyoruz.Sürücü devresi olarak kullanılan ULN2003 içerisinde 7 adet NPN transistör ve dahili diyot barındırmaktadır. Haliyle bizi transistör bacaklarıyla uğraşmaktan kurtarmaktadır.

Kullanımı ise oldukça kolaydır. Devre semasından da anlaşılabileceği gibi 9 numaralı bacağına +12 Volt ve 8 numaralı bacağına da Toprak (ground) uyguluyoruz. Daha sonra 3 ve 6 numaralı bacaklara da paralel portun DATA pinlerinden gelen +5 Voltluk değerleri uygulayacağız. Bu sayede örneğin 3 numaralı bacağa +5 Volt (lojik voltaj) uyguladığımızda 14 numaralı bacak toprak olacaktır. Ayni şekilde sırayla 4 için 13, 5 için 12, 6 için ise 11 numaralı bacaklar toprak olacaktır.


ULN2003 Motor Sürücü Entegresi Bacak Bağlantıları

uln2003-motor-surucu-devresi
ULN2003 Motor Sürücü Entegresi Sürücü Devresi Bağlantıları

5 kablolu adim motoru kullanılmıştır devrede. Çalisma prensipleri ayni olduğundan kablo sayısının değişmesi yazacağımız programın mantığını değiştirmeyecektir. 5 kablolu adim motorunun kablolarından bir tanesi Vmotor dediğimiz ortak kablodur. Önemli olan bu kablonun hangisi olduğunu bulmaktır. Bunun için avometreyi OHM ölçere getiririz ve kabloların uçlarını ikişer ikişer ölçeriz.

Tüm uçlar ile arasındaki direnç ayni olan kablo ortak Vmotor kablosudur. Şekilde gözüktüğü gibi, diğer 4 kablo motor kömürlerine (coil) gitmektedir. Bu 4 kablonun da bir sırası vardır. Eğer bu kablolar yanlış sırada bağlanırsa, motor dönmek yerine sadece titreme yapacaktır. Yukarıda anlatıldığı gibi motora adim attırmak için yapmamız gereken, Vmotor kablosuna +12 Volt verirken, diğer kömürlere bağlı kablolara belli bir sıra ile toprak göndermek. 4 kabloya toprak sinyalini göndermek için entegrenin 3, 4, 5 ve 6. bacaklarına sıra ile +5 Volt gönderilmesi gerekir.

METİN (TEXT) LCD (Liquid Cristal Display) :

2x16-text-lcd
2×16 Text LCD

Şekil de görülen 2×16 Text Lcd’dir. Günümüzde kullanılan Lcd’lerin çalışma ilkeleri ve uç bağlantıları standartlaştırılmıştır. Lcd’nin dışardan veri okuyabilme ve dışarıya veri gönde- rebilmesini D0-D7 arasındaki veri yolu sağlar. Lcd’nin çalışabilmesi için 1 numaralı ucuna (VSS) şase ve 2 numaralı ucuna (VDD) +5 voltluk besleme gerilimi verilir.3 numaralı bacağı Lcd ‘nin görüntü netlik ayarı(kontrast) için kullanılır. Ayrıca saklayıcı seçme (RS, Register Selected) ucu veri girişlerinden gönderilen 8 bitlik bilginin, bir karakter kodu veya komut olduğunu belirler . (RS=0 veri – RS=1 komut) Oku/yaz (R/W, Read/Write) ucu Lcd’ye veri aktarmak veya Lcd ‘den veri okumak için kullanılır.(R/W=1 ise veri okuma işlemi –R/W=0 ise veri yazma işlemi yapılır.) Yetki (E, Enable) ucu istenilen işlemlerin gerçekleşmesi için lojik 1 seviyesine kurulan tek bitlik giriştir.

EA (External Accsess) :
Mikrodenetleyicinin (AT89S52) 31. ucu olan bu uç düşük seviyede aktiftir. +5 voltluk besleme gerilimine ya da şaseye bağlanır. +5 volta bağlanırsa programlar dahili romdan şa- seye bağlanırsa programlar harici bellekten çalışır.

Oku/Yaz (Read/Write, R/W) Ucu:
LCD ‘ye veri aktarmak veya LCD ‘den veri okumak için kullanılır. Eğer bu uçta lojik ‘1’ seviyesi varsa LCD ‘den veri okuma işlemi, lojik’0’ seviyesi varsa LCD ye bilgi giriş işlemi yapılır. LCD ‘ye veri girişinde bilginin komut ya da karakter olduğunu yukarıda anlatıldığı gibi RS belirler eğer RS bu verinin karakter olduğunu gösterirse LCD bu veriyi İçerisindeki ASCII kod çözücü bir tüm devre ye verir ve karakterin görüntülenmesini sağlar.

Yetki ( Enable, E) Girişi:
LCD de gerekli ayarlamalar yapıldıktan sonra istenile işlemlerin gerçekleştirilebilmesini sağlayan tek bitlik giriştir. LCD ‘deki bütün işlemler (okuma yazma komut vb.) düşen kenarda gerçekleştirilir. Dolayısıyla işlemlerden önce E ucu ‘1’ kurulmalı daha sonrada ‘0’lanmalıdır. Bu şekilde düşen kenarlı bir işaret elde edilmiş olur.

AT89S52 Özellikleri ve Pin Konfügürasyonu :

Özellikleri:

  • Kontrol uygulamalarına yönelik 8-bit CPU
  • Mantıksal işlemci
  • 8051-Tabanlı Düşük-Voltaj 16MHz CMOS Kontroller 4 adet 8-bit giriş/çıkış(I/O) portu(32 uç)
  • 3 adet Zamanlayıcı/sayıcı
  • Watchdog Zamanlayıcı
  • 2 öncelik seviyesine sahip 8 kesme donanım yapısı
  • UART, 2 DPTRs,
  • 8K Byte Flash hafıza (ISP), 256 Byte On-chip RAM

AT89S52 Pin konfigürasyonu
at89s52-pin-konfigurasyonu

Uygulamanın Devre Şeması:
stepmotor_kontrol-asansor

Devrede Kullanılan Malzemeler:

  • 1 adet 5 uçlu step motor
  • 1 adet AT89S52 Mikrodenetleyici
  • 1 adet ULN2003 paket step motor sürücü transistor
  • 1 adet 2×16 metin LCD
  • 5 adet buton
  • 1 adet Kristal 11,0592MHz
  • 1 adet 10µF kondansatör
  • 1 adet 8.2K direnç
  • 4 adet 10K direnç
  • 2 adet 22pF kondansatör

Uygulamanın C Kodları:
Bu kaynak kodlar Keil derleme programı kullanılarak C programlama dilinde yazılmıştır ve gerekli açıklamalar kodların yanında yapılmıştır.

Ana program;

#include <AT89X52.H>
#include "T_LCD.h"
#define stepmotor P2
#define YUKARI  P3_0
#define ASAGI   P3_1
#define GIRIS   P3_3
#define RESET	P3_2

static code unsigned char adim[8]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};
static code unsigned char sayi[10]={'0','1','2','3','4','5','6','7','8','9'};
unsigned char yuks,konum;
unsigned char c1=0,c2=0,c3=0;
bit kesme=0;

/*prototip tanimlamalar*/
unsigned char konum_bul(void);
void hareket(unsigned char,unsigned char);
void ekran_yaz(void);
void arttir_azalt(unsigned char *sayi,unsigned char dgskn,unsigned char alt,unsigned char ust)
{
	if(!ASAGI)
	{
		while(!ASAGI);
		if ((*sayi)>alt)
			*sayi=(*sayi)-dgskn;
		else
			*sayi=ust;
	}
	if(!YUKARI)
	{
		while(!YUKARI);
		if ((*sayi)=konum)
	{
		adim_say=4*(yukseklik-konum);
		bas=konum_bul();
		for(i=bas+1;i<(bas+adim_say+1);i++)
		{
			stepmotor=adim[(i%8)];
			Gecikme(100);
		}
	}
	else
	{
		adim_say=4*(konum-yukseklik);
		bas=konum_bul();
		x=8*((adim_say/8)+1);
		for(i=bas-1+x;i>(bas-1+(x-adim_say));i--)
		{
			stepmotor=adim[(i%8)];
			Gecikme(100);
		}
	}

}
void ekran_yaz(void)
{
	Komut(Sil);
	Komut(IkinciSatir);
	VeriDizi("Konum: ",0);
	c1=konum/100;		Veri(sayi[c1],0);
	c2=(konum/10)%10;	Veri(sayi[c2],0);
	c3=konum%10;		Veri(sayi[c3],0);
	VeriDizi("mm",0);
	Komut(BirinciSatir);
	VeriDizi("Yukseklik:    mm",0);
	Komut(ImlecGeri);Komut(ImlecGeri);Komut(ImlecGeri);Komut(ImlecGeri);Komut(ImlecGeri);
}
void main(void)
{   
	LcdAc();
	Komut(Sil);
	yuks=0;
	konum=0;
	stepmotor=0x03;	//baslangic konumu verme
	Komut(IkinciSatir);
	VeriDizi(" Volkan SELCUK  ",0);
	Komut(BirinciSatir);
	VeriDizi("Yukseklik:    mm",0);
	Komut(ImlecGeri);Komut(ImlecGeri);Komut(ImlecGeri);Komut(ImlecGeri);Komut(ImlecGeri);
	while(1)
	{
		if(GIRIS && !kesme)
		{
			arttir_azalt(&yuks,5,0,250);	//mm olarak degerler girin	-->1 = 1mm artarak asagı yukarı kontrol 0 ile 250 mm yani 0 ile 25 cm arasinda degerler girilir. 
			c1=yuks/100;		Veri(sayi[c1],0);
			c2=(yuks/10)%10;	Veri(sayi[c2],0);
			c3=yuks%10;			Veri(sayi[c3],0);
			Komut(ImlecGeri);Komut(ImlecGeri);Komut(ImlecGeri);
		}
		else
	{
			if(yuks!=konum)
			{
				while(!GIRIS);
				hareket(konum,yuks);
				konum=yuks;
			   	ekran_yaz();
			}
			kesme=0;
		}
	}
}

Alt program T_LCD adında uzantısı h olan bir başlık dosyası olarak kayd edilmiş bir fonksiyondur; ana program LCD ile ilgili işlem yapacaksa buraya dallanarak işlemi gerçekleştirir.

Yukarıda yazmış olduğumuz programın, LCD’de istenilen karakterleri ekrana basabilmesi bazı başlangıç ayarlarının yapılması gerekmektedir. Göstergenin açılması, kullanılacak bit sa- yısının belirlenmesi LCD’nin çalışması için ilk yapılması gereken işlemlerdir.

Metin ekran LCD uygulamalarında standart olarak kullanılacak olan komut gönderme, LCD’nin başlangıç koşullarını ayarlama vb. rutinleri bir fonksiyon olarak tanımlamak ve gerektiğinde çağırmak için aşağıdaki T_LCD fonksiyonundan yararlanılmıştır. Bu fonksiyon kütüphane dosyası olarak kaydedilmiştir.

Alt Program

/****************************************************************/
/* 				     T_LCD.H	 	 		                    */
/****************************************************************/

/* LCD'de kullanılan komutların tanımlanması */
#define Sil 		 1	// Ekranı temizler
#define BasaDon 	 2	// İmleci sol üst köşeye getirir
#define SolaYaz 	 4  // İmlecin belirttiği adres azalarak gider
#define SagaYaz 	 6   // İmlecin belirttiği adres artarak gider
#define ImlecGizle	 12	// Göstergeyi aç, kursör görünmesin
#define ImlecYanSon	 15	// Yanıp sönen blok kursör
#define ImlecGeri	 16	// Kursörü bir karakter geri kaydır
#define KaydirSaga	 24	// Göstergeyi bir karakter sağa kaydır                   
#define KaydirSola   28	// Göstergeyi bir karakter sola kaydır   
#define EkraniKapat	 8	// Göstergeyi kapat (veriler silinmez)
#define BirinciSatir 128	// LCD'nin ilk satir başlangıç adresi       
                          // (DDRAM adres)
#define IkinciSatir  192	// İkinci satırın başlangıç adresi
#define KarakUretAdres 64	// Karakter üreteci adresini belirle  
                          // (CGRAM adres)

/* LCD'de Kullanılan Fonksiyon Seçimi */
#define CiftSatir8Bit  56	 // 8 bit ara birim, 2 satır, 5*7 piksel
#define CiftSatir4Bit  48	 // 8 bit ara birim, 1 satır, 5*7 piksel
#define TekSatir8Bit   40	 // 4 bit ara birim, 2 satır, 5*7 piksel
#define TekSatir4Bit   32	 // 4 bit ara birim, 1 satır, 5*7 piksel

/* LCD Girişlerinin Tanımlanması */
#define Data  P1	  // LCD Data girişleri için port ata
#define RS	P3_7 // Saklayıcı seçme girişi RS=0 komut, RS=1 veri
#define RW	P3_6  // Oku/Yaz girişi RW=0 yaz, RW=1 oku
#define EN	P3_5    // Yetki girişi 

/* LCD Gecikme Fonksiyonu */
void Gecikme (long int sure)
{
  long int i;
  for (i=1;i<=sure;i++)
    {;}
}

/* LCD Hazır Olana Kadar Bekle Fonksiyonu */
void LcdHazir ()
{
   Data=0xFF;	      // LCD den veri almaya hazirlan 	  	
   RS = 0;	      // komut modu
   RW = 1;	      // LCDden okuma
   EN = 1;         // yetki için düşen kenar ayarı
   Gecikme(200);   // kısa bir bekleme süresi
   while(Data & 0x7F == 0x80); // mesgul bitini kontrol et.
}

/* LCD'ye Komut Yazdırma Fonksiyonu */
void Komut (int komut) 
{
  LcdHazir();      // LCD hazir olana kadar bekle
  RS=0;	      // RS komut modunda
  RW=0;	      // RW yaz modunda
  EN=1;	// işlemin yetkilendirilmesi için düşen kenar ayarı           
  Data=komut;	      // LCD data girişlerine komut bilgisini aktar
  EN=0;	      // yetki için düşen kenar sağlandı
  Gecikme(1000);   // gecikme
}	
/* LCD'ye Tek Bir Karakter Yazdırma Fonksiyonu */
void Veri (char veri, long int hiz)	
{
  LcdHazir();      // LCD hazir olana kadar bekle
  RS=1;	      // RS komut modunda
  RW=0;	      // RW yaz modunda
  EN=1;	      // yetki için düsen kenar ayar işlemi
  Data=veri;       // LCD data girişlerine veri bilgisini aktar
  EN=0;            // yetki için düşen kenar sağlandı
  Gecikme(hiz); // Ekranda karakterlerin görünmesi arasındaki süre
}

/* LCD'ye Karakter Dizisi (String) Yazdırma Fonksiyonu */
void VeriDizi (char veri[], long int hiz)	
{
  int i=0;
  while(veri[i]!=0)
  {
    LcdHazir();     // LCD hazir olana kadar bekle
    RS=1;	       // RS komut modunda
    RW=0;	       // RW yaz modunda
    EN=1;	       // yetki için düsen kenar ayar işlemi
    Data=veri[i];   // LCD data girişlerine veri bilgisini aktar
    EN=0;           // yetki için düşen kenar sağlandı
    i++;   // bir sonraki veri bitini almak için dizi'yi 1 arttır 
    Gecikme(hiz);   // karakterlerin görünmesi arasındaki süre
  }
}
/* LCD Başlangıç Ayarlarını Yapan Fonksiyon */
void LcdAc(void)            
{ 	
  Komut(ImlecGizle);
  Komut(CiftSatir8Bit);
  Komut(SagaYaz);
}

Asansör projesine ait Keil ve proteus ares isis dosyaları: AT89S52 ile Yükseklik Ayarlı Lcd Göstergeli Asansör

Dosya indirme LINK listesi (HTML formatında) link-3263.zip şifre-pass: 320volt.com

  • Ömer

    Merhaba hocam

    link silinmiş linki yenileyebilir misiniz?