11 Aralık 2011 Pazar

LM35 Sıcaklık sensörü ile sıcaklığı lcd ekrana yazdırma ve sıcaklığa göre pwm üretme


T.C.
Kocaeli Üniversitesi
Mühendislik Fakültesi
Elektrik Mühendisliği Bölümü





Proje III

Mikroişlemcinin Sıcaklığının Ölçülüp LCD Ekrana Yazdırılması ve Fan Hız Kontrolü




Proje Yöneticisi:
Prof. Dr. Bekir ÇAKIR




Proje Öğrencisi:
Alper ÖZKAN
080206069






Proje mikrodenetleyici kontorlü ile yapılmaktadır, mikrodenetleyici olarak ise 16f877A kullanılmıştır. Mikrodenetleyiciyi programalamak için ise C dili kullanılmıştır.  LM35 ile sıcaklık bilgisi okunup mikrodenetleyiciye aktarılmış A/D dönüşüm yapılıp LCD ekrana sıcaklık bilgisi yazdırılmıştır. 30 C°’de ilk fan, 80 C°’de ise ikinci fan devreye girecek ve sıcaklığa göre gerekli PWM üretilip hız kontrolü yapılmaktadır ve yine aynı şekilde 30-80 C° arasında PWM ile RGB led kontrolü yapılmıştır.



A/D Dönüşüm


         Projede sıcaklık ölçümü için LM35 sıcaklık sensörü kullanılmıştır.



         LM35 sıcaklık sensörü  -55 C° ile 150 C° arasında ölçüm yapabilmektedir fakat bu projede aralık 0 ile 150 arası belirlenmiştir. Sensör her C° için 10mV üretmektedir.




PWM Periyodunun ve Görev Süresinin Hesaplanması

PWM periyodu,PR2 registerine yazılarak belirtilir ve aşağıdaki formülle hesaplanabilir.

T=PWM periyod = [(PR2) + 1] . 4 . TOSC . (TMR2 prescale değeri)     

PWM frekansı periyodun tersi olup eşitlik f=1/T  ile hesaplanır.



PWM çıkışı

         TMR2, görev saykılı’na (Ton) eşit oluncaya kadar CCPR1L’de lojik1 bilgisi görülür. TMR2 içeriği görev saykılına eşit olduğunda seviye lojik 0’a düşer TMR2 içeriği sıfırlanmadan PR2’ye eşit oluncaya kadar çalışmaya devam eder. Böylece,  bir periyotluk süre tamamlanmış olur. Burada;

f = PWM sinyalinin frekansını (Hz)
T = PWM sinyalinin bir saykılını (s) gösterir.

Bir periyodluk PWM süresi ise;

T=Ton+Toff                                                      
eşitliği ile bulunabilir. Burada;

Ton = Pozitif PWM sinyal süresini veya PWM görev saykılını (s)
Toff = Sıfır veya negatif PWM sinyal süresini (s) göstermektedir.


RGB Led
RGB led bünyesinde 3 farklı rengi bulunduran ve bunlar ile farklı renkleri elde edebilmemizi sağlayan bir leddir.

Bu projede RGB led için PWM sinyali üretilip NPN transistörü ile farklı renkler üretilmiştir.

R direnci ise 
formülüne göre hesaplanır.




PIC 16F877
         16F877 40 bacaklı içinde A/D dönüştürücü, kesme, PWM modülü, 3 tane zamanlayıcı, 33 tane giriş-çıkış pini bulunan bir mikrodenetleyicidir.



Besleme bacakları 11 ve 32 numaralı (+) bacaklardır, 12 ve 31 numaralı bacaklar ise (-) uçlarıdır. 13 ve 14 numaralı bacakları osilatör bacaklarıdır ve bu projede 2tane 22pf’lık kondansatör ile 4Mhz lik kristal osilatör kullanılmıştır.

PIC’in A portunun A0 pini A/D dönüştürücü olarak kullanılmıştır. A/D işlemi 10 bit ile yapılmıştır. Gerilim 5v’dur. Yani 0-5 1024’e bölünmüştür. A0 pininden okunan değer (5/1024)*100 ile çarpılarak sıcaklık değeri oluşturulmuştur.

B portu ise LCD ekran için kullanılmıştır. RB0 pini LCD’nin E pinine, RB1 RS’ye, RB2 RW’ye, RB4-RB7 pinleri ise D4-D7(Data) pinlerine bağlanmıştır.


C portu ise fan için PIC’in sahip olduğu PWM özelliği kullanılmıştır. RC2 fan 1, RC1 ise fan 2 için PWM üretir.A0 pininden okunan değer 8bitlik PR2 yazmacına yüklenir ve RC2 30 C ̊ de, RC1 ise 80 C ̊ de PWM üretmeye başlar.

E portu RGB led için kullanılmıştır.  E0 pini RGB’nin kırmızı ledinin transistörüne , E1 pini yeşil ledin transistörüne , E2 pini de mavi ledin transistörüne bağlanmıştır. Projede 2 tane PWM kullanıldığından RGB için gerekli PWM TIMER1 kesmesi kullanılarak elde edilmiştir.




Projenin C Kodu


#include <16f877.h>   

#device ADC=10 

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000)

#use fast_io(a)
#use fast_io(c)
#use fast_io(e)

#define preload 65458
#define red pin_e0
#define green pin_e1
#define blue pin_e2
#define use_portb_lcd TRUE  

#include <lcd.c>  
#priority timer2,timer1

unsigned long int bilgi;
float sicaklik;
unsigned int8 hiz;
int8 red_duty;
int8 green_duty;
int8 blue_duty;
int sayici;

void adc()
{
      bilgi=read_adc(); 
      sicaklik=(0.0048828125*bilgi)*100; 
}

void pwm()
{
if (sicaklik<=80)
             {
             set_pwm2_duty(0);
             delay_ms(20);
             }
         else
         {
            if(sicaklik>124)
            {
            hiz=255;
            }         
         set_pwm2_duty(hiz);
         delay_ms(20);
         }
         if(sicaklik<=30)
            {
            hiz=0;
            set_pwm1_duty(hiz);
            delay_ms(20);
            }
         else
            {
            if(sicaklik>124)
            {hiz=255;}
            set_pwm1_duty(hiz);
            delay_ms(20);
            }
}

void lcd()
{
      lcd_gotoxy(10,1);
      printf(lcd_putc,"%3.0f'C",sicaklik);
      delay_ms(20);
      lcd_gotoxy(1,2);
      printf(lcd_putc,"\nAlper OZKAN");
}


#INT_TIMER1
void timer()
{
    set_timer1(preload);
   
   if (sayici < 255)
    {
      if (sayici == red_duty)   output_low(red);
     
      if (sayici == green_duty) output_low(green);

      if (sayici == blue_duty)  output_low(blue);

    }
  
   else if(sayici == 255)
    {
      sayici = 0;
      if (red_duty==0) output_low(red);
      else output_high(red);
      if (green_duty==0) output_low(green);
      else output_high(green);
      if (blue_duty==0) output_low(blue);
      else output_high(blue);
    }
   sayici++;
}

void rgb ()
{
   if(sicaklik<32){red_duty=255; green_duty=255;   blue_duty=255;} //beyaz
   if(sicaklik>=32 && sicaklik<34){red_duty=255; green_duty=0;   blue_duty=255;} // pembe
   if(sicaklik>=34 && sicaklik<36){red_duty=204; green_duty=0;   blue_duty=255;}
   if(sicaklik>=36 && sicaklik<38){red_duty=153; green_duty=0;   blue_duty=255;}
   if(sicaklik>=38 && sicaklik<40){red_duty=102; green_duty=0;   blue_duty=255;}
   if(sicaklik>=40 && sicaklik<42){red_duty=51;  green_duty=0;   blue_duty=255;}
   if(sicaklik>=42 && sicaklik<44){red_duty=0;   green_duty=0;   blue_duty=255;} // mavi
   if(sicaklik>=44 && sicaklik<46){red_duty=0;   green_duty=51;  blue_duty=255;}
   if(sicaklik>=46 && sicaklik<48){red_duty=0;   green_duty=102; blue_duty=255;}
   if(sicaklik>=48 && sicaklik<50){red_duty=0;   green_duty=153; blue_duty=255;}
   if(sicaklik>=50 && sicaklik<52){red_duty=0;   green_duty=204; blue_duty=255;}
   if(sicaklik>=52 && sicaklik<54){red_duty=0;   green_duty=255; blue_duty=255;} // turkuaz
   if(sicaklik>=54 && sicaklik<56){red_duty=0;   green_duty=255; blue_duty=204;}
   if(sicaklik>=56 && sicaklik<58){red_duty=0;   green_duty=255; blue_duty=153;}
   if(sicaklik>=58 && sicaklik<60){red_duty=0;   green_duty=255; blue_duty=102;}
   if(sicaklik>=60 && sicaklik<62){red_duty=0;   green_duty=255; blue_duty=51;}
   if(sicaklik>=62 && sicaklik<64){red_duty=0;   green_duty=255; blue_duty=0;} // yesil
   if(sicaklik>=64 && sicaklik<66){red_duty=51;  green_duty=255; blue_duty=0;}
   if(sicaklik>=66 && sicaklik<68){red_duty=102; green_duty=255; blue_duty=0;}
   if(sicaklik>=68 && sicaklik<70){red_duty=153; green_duty=255; blue_duty=0;}
   if(sicaklik>=70 && sicaklik<72){red_duty=204; green_duty=255; blue_duty=0;}
   if(sicaklik>=72 && sicaklik<74){red_duty=255; green_duty=255; blue_duty=0;} // sari
   if(sicaklik>=74 && sicaklik<76){red_duty=255; green_duty=204; blue_duty=0;}
   if(sicaklik>=76 && sicaklik<78){red_duty=255; green_duty=153; blue_duty=0;}
   if(sicaklik>=78 && sicaklik<80){red_duty=255; green_duty=102; blue_duty=0;}
   if(sicaklik>=80 && sicaklik<82){red_duty=255; green_duty=51;  blue_duty=0;}
   if(sicaklik>=82 && sicaklik<84){red_duty=255; green_duty=0;   blue_duty=0;} // kirmizi
   if(sicaklik>=84){red_duty=255; green_duty=0;  blue_duty=0;}
   sayici = 0;
}

void main()
{
   setup_psp(PSP_DISABLED);     
  
   setup_CCP1(CCP_PWM);
   setup_CCP2(CCP_PWM);
   setup_timer_2(T2_DIV_BY_4,255,1);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
  
   set_tris_a(0x01);
   set_tris_c(0x00);
   set_tris_e(0b000);
     
   setup_adc(adc_clock_internal);
   setup_adc_ports(AN0);
  
   lcd_init();  

   set_adc_channel(0); 
   delay_us(20);        

   printf(lcd_putc,"\fSICAKLIK");
    
  
   for(;;) 
   {
      hiz=bilgi;
      adc();         
      lcd();
      pwm();
      rgb();
   }
}





Baskı Devre

Baskı devre 2 tane bakır plakanın birleştirilmesiyle yapılmıştır. Aşağıda 2 plakanın alt ve üst baskı devreleri verilmiştir.
 Alt plakanın alt kısmı (Devre elemanları ile)

 Alt plakanın alt kısmı


Alt plakanın üst kısmı (Ayna görüntüsü)

  Üst plakanın alt kısmı

 Projenin İSİS’te Simülasyonu


 Projenin üstten resmi

1 yorum: