Elektronik / Mikrodenetleyici Projeleri/

AT89C51RC2 ve 7411 ile Kare Dalga Sinyal Jenaratörü

Hazırlayan: Birkan GÖÇERLER

Sinyal Generatörü

Sinyal Generatörü genellikle alıcıların testinde amplifikatörlerin testinde ve bu cihazların onarımında kullanılır. Sinyal kaynağı olarak ta kullanılır. Dalga dedektörü, radyo frekans köprüleri gibi yerlerde kullanılır.

Sinyal Generatörünün Yapısı:
jenarator_yapisi

Sinyal Generatörünün Çalışma Prensibi:
Tipik sinyal Generatörü beş bölümden meydana gelmektedir.

1. Osilatör katı
2. Birleştirilmiş modüleli sinyal katı
3. Zayıflatma katı
4. Sabitlenmiş ve güç seviye katı
5. Çıkış sinyalleri ve zayıflatma katı

Sinyal Generatörü laboratuar uygulamalarında sinyal kaynağı olarak kullanılmaktadır. Devrede kullanılan osilatör kararlı bir osilatördür. Zayıflatıcı çıkışındaki,genlik modülasyonudur. Bu katın çıkışında kazancı arttırılmış modüleli sinyal elde edilir

8051 İle Sinyal Generatörü Yapımı

Giriş: Entegreli sinyal Generatörü, karalı çalışması, maliyetinin düşük olması ve karışık olmaması nedeniyle tercih edilir. Yapılacak sinyal generatörü deneylerde kullanılan 1Hz – 10Hz ve 100Hz frekanslarını üretecektir. İstendiğinde kullanılan program değiştirilerek maksimum 500MHz kare dalga sinyal elde edilebilir.

Kullanılan Araç Ve Gereçler:

AT89C51RC2 Tabanlı Geliştirme Kartı
7 segment ortak anot display (3 adet)
Buton (3 Adet)
Pin (30 Adet)
Delikli baskı devre plaketi
İletken tel
Havya ve Lehim teli
Bilgisayar
Güç kaynağı

İşlem Basamakları:

1. 7 Segment display in avometre ile bacak bağlantıları tespit edildi.
2. Devre şeması simülasyon programı olan ISIS te çizildi.
3. Otomatik olarak ARES te baskı devresi çıkarıldı.
4.7 segment display plaket üzerine lehimlendi.
5. Pinler 10lu gruplar halinde plakete lehimlendi.
6. Displayların bacakları ile pin uçları ileken tel ile birleştirildi.
7. Devrenin çalışması için akış diyagramı oluşturuldu.
8.Akış Diyagramına uygun olarak bilgisayar yardımıyla Keil programı kullanılarak C dili ile devrenin programı yazıldı. Derlendi. Hataları düzeltildi.HEX file oluşturuldu.
9. Oluşturulan HEX file ISIS programında oluşturulan similasyonda test edildi.
10. Bilgisayar ile AT89C51RC2 Tabanlı Geliştirme Kartı arasında seri arabirim kullanılarak haberleştirildi. Keil da yazılmış program derlenerek oluşturulan HEX file kartın üzerindeki mikrodenetleyiciye Atmel Firmasının FLİP isimli programı ile aktarıldı.
11. Devreye Enerji verildi ve çalışması osiloskopta ölçülerek gözlendi.


Devre Hesaplamaları:

devre_hesaplama_1
devre_hesaplama_2

Burada bulunan 1 komutun işletim süresidir.

Not: Uygulamada kullanılan geliştirme kartının üzerinde 11.0592MHz kristal bulunmaktadır. Fakat hesaplamalarda kolaylık olması bakımından 12MHz alınmıştır.

Yukarıdaki formüllerden elde edilen değerleride kullanarak sayıcılara yüklenecek değerleri hesaplayabiliriz.
Örneğin 1Hz kare dalga için yükleme değeri

yukleme_degeri
Yani kare dalganın periyodunu tamamlaması için timer imizin 1 milyon a kadar sayması gerekiyor.

periyot

Üstteki resimdende görüldü gibi timer 1 milyon saydığında 1 periyot gecmektedir.
Fakat kullandığımız 8051 de 1 milyon sayabilecek Timer bulunmamaktadır. Mod 1 maksimum 65536 sayabilmektedir.

Bu soruna söyle bir çözüm üretebiliriz. Timer ı 50000 saydırıp bunu 10 defa yaparsak 500000 elde ederiz. Periyodumuzun %50 si 1, %50 si 0 olduğuna göre 2 defa yani bir 1 durumu birde 0 durumu için saydığında 1 milyon saydırmış olacağız.

Yukarıda anlatılan durum Keil de yazılan mikroişlemci kodunda OSC1 isimli fonksiyonda uygulanmıştır.
Diğer 2 aşamadada benzer durum kullanılmıştır. 10Hz için timer in 50000 sayması yeterlidir. 100Hz içinse 5000 sayması gerekmektedir. Bu durumlarda programda OSC10 ve OSC100 isimli fonksiyonlarda uygulanmıştır.

Timer Değerlerinin Belirlenmesi
Buradaki sorunumuz Timer lara değerler nasıl yüklenecek? Bu sorunu bölüm 1 de anlatılanlardan da yardım alarak çözmeye çalışacağız. Örneğin 1 Hz değerini ele alırsak timer imiz in 500000 saymasını istemistik. Bunun içinde timer imizi 50000 saydırıp 10 defa dönmesini istemiştik. Peki timer imiz a 50000 değerini nasıl göstereceğiz. Bunun için Hexadecimal sayı sistemi devreye girer.

formul_8051

Elde ettiğimiz bu 3CAF Hecadecimal sayısı Timer a bölünerek yüklenir.
hecadecimal


7 segment display bacak bağlantıları

7_segment_baglanti

Rakamlar için display lere verilmesi gereken değerler aşağıdaki tabloda gösterilmiştir.

display_deger_tablosu

Not: Burada her display için 8 çıkış ucu gereklidir yani bir display için bir port kullanılması gerekmektedir. Bunu istenmezse 7447 entegresi kullanılarak 4 çıkış kullanılarakta halledilebilir. Böylelikle 3 display için 3×8=24 çıkış yerine 3×4=12 çıkış ucu kullanarak portlardan tasarruf edilmiş olunur. Fakat devremiz başka bir iş gerçekleştirmeyeceği için bu işlem gerekli görülmemiştir.

7411 Entegresi Bacak Bağlantıları
7411_entegresi

Kullandığımız mikrodenetleyicide 3 adet harici kesme olmadığı için böyle bir çözüm üretildi.

Entegre içerisinde yalnızca 1 adet kapı kullanıldı. Bu kapının girişlerine buton girişleri, çıkışıda P1_3 pinine girildi.Bunun yapılmasındaki amaç buton değişikliklerinin algılatılabilmesi idi.

Keil da yazılan program dosyası

/*******************************************************************/
/*******************************************************************/
/*                     8051 PROJESI                                */
/*																   */
/*         1Hz    10Hz   100Hz  Kare Dalga Sinyal Jeneratörü       */
/*                                                                 */ 
/*          Birkan GOCERLER              020304024                 */
/*******************************************************************/
/*******************************************************************/ 

#include <REG51xD2.H>
#include <stdio.h>
/* butonlarin ve cikisin tanimlanmasi*/
#define buton1    P1_0
#define buton10   P1_1
#define buton100  P1_2
#define degistir  P1_3
#define sinyal    P1_7
#define disp1    P0
#define disp2    P2
#define disp3    P3


/* 1Hz lik sinyal üreten fonksiyon*/
void OSC1()
{	
	int i;                          //degisken tanimlamasi
	while(buton1==0);               //buton1 birakilana kadar dön
		while(1)                    // sonsuz döngü (isletim sistemi)
	    {
			for(i=0;i<10;i++)
			{   
				TR0=0;            
				TMOD=0x01;          //timer0'in ilgili moda kurulmasi
	         	TL0=0xAF;           //timer0'in 50.000 kez saymasi için gereken sayilar (3CAFH)            		
	         	TH0=0x3C;
				TF0=0;              //TF bayragini 0'la
	         	TR0=1;                 
			 	while(TF0==0);      //TF bayragi 1 olana kadar dön(50.000 kez say)
		 		TF0=0;              //TF bayragini temizle
            }
		  sinyal=!sinyal;             //cikisi degille
		  if(degistir==0)return;        //P1_3 ucunu kontrol et.Degisiklik varsa ana programa git
		}
}

/* 10Hz lik sinyal üreten fonksiyon*/
void OSC10()
{
	while(buton10==0);               //buton10 birakilana kadar dön
	TMOD=0x01;
	TL0=0xBF;                       //timer0'in 50.000 kez saymasi için gereken sayilar (3CAFH)                      
	TH0=0x3C;
	TR0=1;                          //timer0'i calistir                    
	while(1)
	{
		while(TF0)                  //TF bayragi 1 olana kadar dön(50.000 kez say)
		{
			TR0=0;              	//timer0'i durdur
			TF0=0;              	//TF bayragini temizle
			sinyal=!sinyal;       	//cikisi degille
            TL0=0xBF;           	//timer'a gereken sayilari tekrar yukle
	        TH0=0x3C;
			TR0=1;       	        //timer0'i tekrar calistir
		}
		if(degistir==0)return;          //P1_3 ucunu kontrol et.Degisiklik varsa ana programa git
	}
}
/* 100Hz lik sinyal üreten fonksiyon*/
void OSC100()
{
	while(buton100==0);               //buton10 birakilana kadar dön
	TMOD=0x01;
	TL0=0x77;                       //timer0'in 5.000 kez saymasi için gereken sayilar (EC77H)
	TH0=0xEC;
	TR0=1;                          //timer0'i calistir
	while(1)
	{
		while(TF0)                  //TF bayragi 1 olana kadar dön
			{
				TR0=0;              //timer0'i durdur
				TF0=0;              //TF bayragini temizle
				sinyal=!sinyal;       //cikisi degille
                TL0=0x77;           //timer0'a gereken sayilari tekrar yukle
	            TH0=0xEC;
				TR0=1;              //timer0'i calistir
			}
	if(degistir==0)return;           //P1_3 ucunu kontrol et.Degisiklik varsa ana programa git
	}
}

void bekle (void)      // Yaklaik 1 sn lik gecikme
{
unsigned int i;
for (i=0;i<33000;i++);
}


/* ANA PROGRAM BASLANGICI */

void main(void)
{   /*butonlarin ve cikisin ilk durumlari*/
	sinyal=0;
	buton1=1;
	buton10=1;
	buton100=1;
	degistir=1;

	disp1 = 0x00;    // Display Test
	disp2 = 0x00;
	disp3 = 0x00;
	bekle();
	disp1 = 0x09;    // KOU yazisi
	disp2 = 0x40;
	disp3 = 0x41;
	bekle();
	disp1 = 0x07;    // TEF yazisi
	disp2 = 0x06;
	disp3 = 0x0e;


	while(1)                  //sonsuz döngü
	{
		if(buton1==0)
		{
		disp1 = 0x40;
		disp2 = 0x40;
		disp3 = 0xF9;
		OSC1();    //buton1'e basildiysa OSC1 fonksiyonuna git
		}
 		if(buton10==0)
		{
		disp1 = 0x40;
		disp2 = 0xF9;
		disp3 = 0x40;
		OSC10();   //buton10'ye basildiysa OSC10 fonksiyonuna git
		}
		if(buton100==0)
		{
		disp1 = 0xF9;
		disp2 = 0x40;
		disp3 = 0x40;
		OSC100();  //buton100'e basildiysa OSC100 fonksiyonuna git
		}	
	}
}

Projenin proteus isis simülasyon ve keil kod dosyaları AT89C51RC2 ve 7411 ile Kare Dalga Sinyal Jenaratörü

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

  1. Birkan GOCERLER 2008/07/07
  2. Sunay 2009/01/18
  3. davut 2009/02/26
  4. leyla 2010/07/02
  5. Lathspell 2010/10/09

Yorum

Soru: