RGB LED

8051 projesi olan bu devrede, PWM kullanılarak RGB LED ile istenilen bir renk, butonlar vasıtasıyla oluşturulabilir.

PWM, frekansı belli bir kare dalga işaretinin, frekansı sabit kalmak koşulu ile darbe genişlik oranın değiştirilmesi ile elde edilir. Böyle bir işareti AT89C52 ile gerçekleştirebilmek için projede Timer0 sayıcısı kesmesi kullanılmıştır. Ana program her Timer0 kesmesinde alt programa dallanıp PWM işaretinin oluşturulması sağlanır. Kesme alt programı PWM işaretini oluştururken ana program içerisinde de butonların kontrolü ve butonlar vasıtasıyla da PWM işaretinin darbe genişlik oranının değiştirilmesi sağlanır.

#include <AT89X52.H>
#define PWMresolution 20

sbit P30=P3^0;
sbit P31=P3^1;
sbit P32=P3^2;

sbit RedUp=P1^0;
sbit RedDown=P1^1;

sbit GreenUp=P1^2;
sbit GreenDown=P1^3;

sbit BlueUp=P1^4;
sbit BlueDown=P1^5;
unsigned char bRedLED=0;
unsigned char bGreenLED=0;
unsigned char bBlueLED=0;
unsigned char bRedLEDthreshold=5;
unsigned char bGreenLEDthreshold=5;
unsigned char bBlueLEDthreshold=5;
void main (void)
{
unsigned int i;

P1=0xFF;

//Timer0
TMOD = (TMOD&0xF0)|0x01; 
TH0=0xFF;
TL0=0x1F;
ET0 = 1;                     
TR0 = 1;           

EA = 1;                     

while(1) {

 if(RedUp==0) {   for(i=0; i<300; i++);
      if(bRedLEDthreshold<PWMresolution) bRedLEDthreshold++;
      while(RedUp==0); }
 if(RedDown==0) {  for(i=0; i<300; i++);
      if(bRedLEDthreshold>0) bRedLEDthreshold–;
      while(RedDown==0); }
 if(GreenUp==0) {  for(i=0; i<300; i++);
      if(bGreenLEDthreshold<PWMresolution) bGreenLEDthreshold++;
      while(GreenUp==0); }
 if(GreenDown==0) {  for(i=0; i<300; i++);
      if(bGreenLEDthreshold>0) bGreenLEDthreshold–;
      while(GreenDown==0); }
 if(BlueUp==0) {  for(i=0; i<300; i++);
      if(bBlueLEDthreshold<PWMresolution) bBlueLEDthreshold++;
      while(BlueUp==0); }
 if(BlueDown==0) {  for(i=0; i<300; i++);
      if(bBlueLEDthreshold>0) bBlueLEDthreshold–;
      while(BlueDown==0); }
}

}

void TIMER0_ISR (void) interrupt 1
{

if(bRedLED<bRedLEDthreshold) P30=1;
 else P30=0;
if(bGreenLED<bGreenLEDthreshold) P31=1;
 else P31=0;
if(bBlueLED<bBlueLEDthreshold) P32=1;
 else P32=0;
bRedLED=(bRedLED+1)%PWMresolution;
bGreenLED=(bGreenLED+1)%PWMresolution;
bBlueLED=(bBlueLED+1)%PWMresolution;
TF0=0;
TH0=0xFF;
TL0=0xDF;
}

Keil u2 projesi (dosya uzantısını .rar olarak değiştirin) 

RGB Similasyon (Proteus similasyonudur. Dosya uzantısını .rar olarak değiştirin)

Her Timer0 kesmesi gerçekleştiğinde bRedLED, bGreenLED ve bBlueLED değişkenleri içeriği 1 artırılır ve ana programda belirlenen PWMresolution değerine bölünür. Bölümden kalan değer ise yeniden bu değişkenlerin içerisine yazılır. Bölümden kalanın tekrar değişkene yazılması ile değişkenin hiçbir zaman PWMresolution değerinden büyük olmaması sağlanır. Dolayısı ile her Timer0 kesmesi icra edildiğinde bahsedilen değişkenler 0 ila PWMresolution arasında sırasıyla 1 artırılır ve PWMresolution değerine eriştiğinde yeniden sıfırlanır. Ana programda butonların aldığı değere göre değişen bir başka değişken ise bRedLEDthreshold, bGreenLEDthreshold ve bBlueLEDthreshold dur. Bunlar da basılan ilgili LED butonlarına göre artırılır veya azaltılır. Tüm bu değişkenler PWM darbe genişlik değerini değiştirmek üzere kesme alt programına aktarılır. Eğer bRedLED değişkeni, bRedLEDthreshold değişkeni değerinden küçükse AT89C52 nin kırmızı LED i sürdüğü pinine 1, büyükse ilgili pinine 0 yazılır. Aynı şekilde diğer değişkenlerde değerlendirilir. Bu durumda her LED için ayrı ayrı PWM değeri elde edilmiş olur. bRedLEDthreshold, bGreenLEDthreshold ve bBlueLEDthreshold değişkenlerinin artırılıp azaltılması ile de PWM işaretinin darbe boşluk oranın da değiştirilmesi sağlanır.

D1 devrenin ters beslenmesine karşı alınmış bir önlemdir. Devre için belirlenen besleme gerilimi 9V dur. AT89C52 nin beslemesi ise 7805 regülatör entegresi üzerinden 5V olarak verilir. AT89C52 in çıkışına doğrudan LED ler bağlanmamış ve LED lerin anahtarlanması sırasında oluşabilecek gürültünün AT89C52 nin beslemesine etkisi azaltılmıştır. LED ler devrenin beslemesi olan 9V üzerinden anahtarlanırlar. Bu durumda R6, R7 ve R8 dirençleri verilen formüllere göre hesaplanmalıdır. ( şematik de gösterilen LED direnç değerleri temsilidir! )

formüllerde Vf LED in forward gerilimi Imax ise LED in datasheetinde müsaade edilen max forward akımıdır.

Satın alınan LED için datasheet değerlerine ulaşılmazsa, LED forward gerilimleri VfRedLED: 2.1V, VfGreenLED: 3.2V, VfBlueLED: 3.4V ve VfD1: 0.7V şeklinde alınabilir.

Not: Imax değeri ortalama 20mA dir.

Reklamlar
  1. Henüz yorum yapılmamış.
  1. No trackbacks yet.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: