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
lütfen mailinize attığım mesaja bakar mısınız?
YanıtlaSil