Archive

Archive for Ekim 2011

1-wire DS18B20

DS18B20 maksimum 12, minimum 9bit çözünürlüğünde celsius cinsinden sıcaklık ölçebilir. Nonvolatile yapısı sayesinde kullanıcı istediği bir sıcaklık değerinin üzerinde veya altında sensörden alarm alabilir. Ds18B20 maxim firmasının geliştirdiği 1-wire haberleşme protokolü ile çalışır. 1-wire sistemde sadece 1 data hattı ( ve ground ) kullanılarak, mikrokontrolcü ile haberleşilebilir. DS18B20, -55°C den +125°C ye kadar, geniş bir çalışma aralığına sahiptir fakat ölçebileceği aralık ±0.5°C hata ile -10°C ila +85°C arasındadır. DS18B20 doğrudan data hattından beslendiği için ekstra bir besleme kaynağına ihtiyaç duymaz.

Aşağıdaki C kodları, PIC16F628A için yazılmıştır. Kullanılan derleyici Hi-Tech C (PIC10-12-16) dir. Kodlarda yer alan _XTAL_FREQ kristal frekansını, ONE_WIRE_DATA_PIN sensörün PIC e bağlandığı pini, ONE_WIRE_DATA_PIN_DIRECTION_REGISTER ilgili pinin portunu, ONE_WIRE_DATA_PIN_MASK ise ilgili pinin maskesini ifade eder. Bu değerler değiştirilerek istenilen pinden DS18B20 ile haberleşilebilir.

Program sensörden aldığı sıcaklık bilgisini PORTB ye basar. bGetTemperature(void) fonksiyonunun geri dönüş değerine göre bu değer sıcaklığın virgülden önceki veya sonraki kısmı olabilir.

#include <htc.h>
#include “pic16f62xa.h”

#define _XTAL_FREQ        4000000

//ONE-WIRE
#define ONE_WIRE_DATA_PIN      RA1
#define ONE_WIRE_DATA_PIN_DIRECTION_REGISTER TRISA
#define ONE_WIRE_DATA_PIN_MASK     0x02

bit bitReadOneBit(void)
{
unsigned char i;
 ONE_WIRE_DATA_PIN=0;
 ONE_WIRE_DATA_PIN_DIRECTION_REGISTER&=~ONE_WIRE_DATA_PIN_MASK;
 ONE_WIRE_DATA_PIN=0;
 __delay_us(1);
 ONE_WIRE_DATA_PIN_DIRECTION_REGISTER|=ONE_WIRE_DATA_PIN_MASK;
 __delay_us(1);
 return(ONE_WIRE_DATA_PIN);
}

void vWriteOneBit(unsigned char bValue)
{
 ONE_WIRE_DATA_PIN=0;
 ONE_WIRE_DATA_PIN_DIRECTION_REGISTER&=~ONE_WIRE_DATA_PIN_MASK;
 ONE_WIRE_DATA_PIN=0;
 __delay_us(1);
 if(bValue)
 {
  ONE_WIRE_DATA_PIN_DIRECTION_REGISTER|=ONE_WIRE_DATA_PIN_MASK;
  __delay_us(60); 
  return;
 }
  else
  {
   __delay_us(60); 
   ONE_WIRE_DATA_PIN_DIRECTION_REGISTER|=ONE_WIRE_DATA_PIN_MASK;  
  }
}

unsigned char bReadByte(void)
{
unsigned char i;
unsigned char bReturned=0;
 for (i=0;i<8;i++)
 {
  if(bitReadOneBit()) bReturned|=0x01<<i;
  __delay_us(120);
 }
 return(bReturned);
}

void vWriteByte(char bData)
{
unsigned char i;
 for (i=0; i<8; i++)  
 {    
  vWriteOneBit(bData&0x01);  
  bData = bData>>1;
 }
 __delay_us(104);
}

bit bitReset(void)
{
unsigned char bReturned=0;
 ONE_WIRE_DATA_PIN=0;
 ONE_WIRE_DATA_PIN_DIRECTION_REGISTER&=~ONE_WIRE_DATA_PIN_MASK;
 ONE_WIRE_DATA_PIN=0;
 __delay_us(480);
 ONE_WIRE_DATA_PIN_DIRECTION_REGISTER|=ONE_WIRE_DATA_PIN_MASK;
 __delay_us(72);
 if(ONE_WIRE_DATA_PIN) bReturned=1;
 __delay_us(424);
 if(bReturned) return 1;
  else return 0;
}

void vConfigure(void)
{
 bitReset();
 vWriteByte(0x4E); 
 vWriteByte(0x00);  
 vWriteByte(0x00); 
 vWriteByte(0x00);
}

void vInitializeTemperatureSensor(void)
{
 vConfigure();
}

unsigned char bGetTemperature(void)
{
unsigned char bTemperatureLSB, bTemperatureMSB, i;
 bitReset();
 vWriteByte(0xCC);
 vWriteByte(0x44);
 __delay_ms(100);
 bitReset();
 vWriteByte(0xCC);  
 vWriteByte(0xBE);
 bTemperatureLSB=bReadByte();
 bTemperatureMSB=bReadByte();
 for (i=0;i<7;i++) bReadByte();
 
 
 {
 float fRealTemperature;
 unsigned short wTemperature=bTemperatureMSB;
  wTemperature<<=8;
  wTemperature|=bTemperatureLSB;
 
  fRealTemperature=(float)wTemperature;
  fRealTemperature/=16;
  
  //floating part
  //fRealTemperature*=10;
  //return (((unsigned char)fRealTemperature)%10);

  //decimal part
  //return (((unsigned char)fRealTemperature));
 }
 
}

void main(void)
{
 TRISB=0;
 PORTB=0x00;

 vInitializeTemperatureSensor();

 while(1)
 {
  PORTB=bGetTemperature();
 }
}

DS18B20, sıcaklık çevriminin sonucu float bir değerdir. Bu yüzden sensörden alınan 2byte lık değer float cinsi değişkene çevrilmiştir. İsternirse bGetTemperature(void) fonksiyonun geri dönüş tipi float yapılarak gerçek sıcaklık değeri elde edilebilir. Bu örnekte bGetTemperature(void) ile geri döndürülen değer;

return (((unsigned char)fRealTemperature));

satırları açılırsa virgülen önceki kısmı

fRealTemperature*=10;
return (((unsigned char)fRealTemperature)%10); 

satırları açılırsa, sıcaklık değerinin virgülden sonraki kısmı PORTB ye yazdırılır.

Float işlemleri yapmak PIC16F628A için zor bir iştir. Hem kod alanından kaybettirir hemde sistemin gecikmesine neden olur. Float işlemleri yapılmadan da sensörün okuduğu sıcaklık bilgisi, LSB ve MSB değerleri işlenerek ( kaydırma ekleme gibi işlemler ile) de elde edilebilir.

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

Proteus simulasyonu (dosya uzantısını .rar olarak değiştirin)

 

Op Amp’ın hikayesi

16 Ekim 2011 3 yorum

1934 de, Harry Black, New York dan New Jersey deki iş yeri Bell Labs a, raylı sistem ve ferribotu kullarak gidiyordu. Feribot yolculuğu Harry yi rahatlatır ve teknik şeyler düşünmesine yol açardı. O günlerde Harry nin çözmesi gereken zor bir problem vardı. Telefon kabloları uzun mesafalerle heberleşmek için uzatıldığında, kuvvetlendiricilere ihtiyaç duyuluyordu ve güvenilir olmayan kuvvettlendiriciler telefon hizmetini kısıtlıyorlardı. Öncelikle, toleranslardan dolayı kazanç kötüydü fakat bir kaç ayarla bu sorun çözülebiliyordu. İkincisi ise bir kuvvetlendirici fabrikasyon anında düzgün ayarlansa bile, saha ortamında kazanç oldukça fazla kayabiliyor sonuç olarak ya ses çok az geliyor yada gelen ses aşırı kazançtan bozuluyordu.

Kararlı bir kuvvetlendirici yapılabilmesi için bir çok girişimde bulunulmuştu fakat sıcaklık değişimi ve telefon hattındaki gerilim değişimlerinden dolayı kazanç bir türlü kontrol altına alınamamıştı. Pasif malzemelerin sapmaları aktif malzemelere göre daha azdı, bu yüzden eğer kuvvetlendiricinin kazancı pasif malzemelere bağımlı olursa problem çözülebilirdi. Harry bir feribot yolculuğunda, bu konuya dahihane bir çözüm buldu ve bunu daha feribottan inmeden bir doküman haline getirdi. Çözüm, öncelikle gerek duyulandan fazla kazancı olan bir kuvvetlendirici tasarlamaktı. Daha sonra kuvvetlendircinin çıkış işaretinin bir kısmı girişe geri beslenecekti. Bunun anlamı devrenin kazancının aktif elemanın kazancı yerine, geri besleme devresine bağımlı olmasıydı. Buna negatif geri besleme denildi ve bu günümüzün modern op amp larının alt yapısıydı. Harry kasıtlı olarak yaptığı bu geri besleme mantığını feribot seferi süresince dokümante etti. O zaman kadar bir çok devrede bilmeden de olsa geri besleme kullanılmıştı fakat tasarımcılar gerbeslemenin sonuçlarını ile hiç ilgilenmemişlerdi.

Harry nin bu fikrini Bell labs da açıklaması üzerine müdürler ve tasarımcılar homurdanmaya ve aralarında fısıldaşmaya başladılar. Homurtulardan gelen seslerden biri şöyledi: “30kHz band genişlikli bir kuvvetlendirici yapmak oldukça zor, bu deli de kalkmış benden 3Mhz band genişlikli kuvvetlendirici istiyor, he kazancı bide 30Khz lik olanla aynı olacakmış. Hadi canım sende.” Zaman Harry i haklı çıkardı fakat Harry nin gözünden kaçan ufak bir detay vardı, osilayon problemi. Açık çevrim kazancı yüksek olan bir kuvvetlendirici, kapalı çevrim çalıştırıldığında bazen osilasyona giriyordu. Bir çok kişi bu stabil olmayan durum üzerinde çalışmasına rağmen çözüm 1940 lar da geldi. Fakat bu problemi çözmek oldukça uzun, sıkıcı ve karmaşık hesaplamalar gerektiriyordu. Aradan yıllar geçmesine rağmen çözümü basite indirgeyebilen veya daha anlaşılır hale getiren kimse çıkmadı. 1945 de, H. W. Bode, geri beslemeli sistemlerin cevabını grafiksel metodlarla analiz eden bir sistem buldu. Bu zamana kadar geribesleme analizi, kabaca, çarpma ve bölme ile yapılırdı. Bu yüzden transfer fonksiyonunun hesaplanması zaman kaybı ve zahmetli bir iş olarak görülürdü çünki 70li yıllara kadar mühendislerin ne hesap makineleri nede bilgisayarları vardı. Bode nin logaritma tekniğiyle, geri besleme sisteminin cevabını bulmak, oldukça karmaşık hesaplamalar içermesine rağmen ortaya çıkan grafiksel ifade gayet basitti fakat zamanla bu yöntem, karanlık küçük bir odada tutulan birkaç elektrik mühendisi tarafından egemen olunan bir sanat haline geldi. Herhangi bir elektrik mühendiside bu yöntemi kullabilmeliydi. Bu yüzden geri besleme uygulamasını yapacak makinelerin geliştirilmesine başlandı. Bilgisayar çağına kadar da elektronik geribesleme tasarımı pekde ihtiyaç duyulan birşey değildi. 

İlk gerçek zamanlı bilgisayar analog bir bilgisayardı. Bu bilgisayar önceden programlanmış denklemler ve veri girişi kontrol  işlemlerini hesaplamak için kullanılırdı.Programlama, veri üzerinde matematiksel işlemler yapan bir dizi fiziksel bağlantılı devrelerle yapılırdı ve fiziksel bağlantının sınırlı olması analog bilgisayarın popülaritesinin azalmasına neden oldu. Analog bilgisayarın kalbi işlemsel kuvvetlendirici olarak anılan devrelerdi çünki çarpma, bölme, toplama, çıkarma, integral ve türev gibi bir çok matematiksel işlemi giriş sinyaline uygulayabiliyordu. Kısa adı ise bizimde bildiğimiz ve sevdiğimiz “op amp” dı. Op amp oldukça büyük açık çevrim kazancı olan bir kuvvetlendiriciydi. Dışarıdan eklenen pasif mazlemelerle kapalı çevrim oluşturulduğunda matematiksel işlemler yapabiliyordu. Bu kuvvetlendirici vakum tüplerinden yapıldığı için oldukça büyüktü ve yüksek gerilimle çalışıyordu fakat analog bilgisayarın temelini oluşturuyordu. Bu yüzden büyüklüğü ve çok fazla enerji harcaması yaptığı işin ücreti karşısında kabul edilebilir düzeydeydi. Bir çok op amp analog bilgisayarlar için tasarlansada, başka alanlarda kullanılmaları çok da fazla zaman almadı ve bir çok fizik laboratuarında bile artık el atında bulanan aktif elemanlar haline geldi.

Bu zamanlarda, analog bilgisayarlar üniversitelerin ve büyük şirketlerin laboratuarlarına kadar girdi çünki araştıma işlerinde kritik bir role sahipti. Buna paralel olarak bir diğer ihtiyaç ise laboratuar deneylerindeki transdüser sinyal iyileştirmeleri oldu ve op amplar sinyal iyileştirme uygulamalarında da kullanılmaya başlandı. Sinyal iyileştirme uyugulamalarının artması üzerine, op amp ihtiyacı analog bilgisayar ihtiyacından fazla olmaya başladı. Analog bilgisayarlar yerini dijital bilgisayarlara devretmesine rağmen op amp lar ayakta kalmayı bildiler çünki op amp lar analog uygulamalarda önemli bir yer teşkil ediyorlardı. Sonunda dijital bilgisayarlar analog bilgisayarların yerleri aldı fakat ölçme uygulamalarının artması opamp ihtiyacınında artmasına neden oldu.

Sinyal düzeltmek için kullanılan ilk op amp transistörlerin bulunmasından önce bir vakum tüpünün içerisine inşa edildi. Bu yüzden büyük ve hantaldılar. 50li yıllarda, düşük gerilimli güç kaynakları ile çalışan minyatür vakum tüpleri, op ampların bir tuğla boyutuna kadar küçültülmesine olanak verdi. Bu yüzden opamp modülleri tuğla olarak anıldı. Vakum tüp ve malzeme boyutları, opamp tekbir oktal vakum tüpüne sığana kadar küçültülmeye devam edildi. Transistörler ticari olarak 60 lı yıllarda geliştirilmişti ve opamplarda kullanılmaya başlanmasıyla opamp boyutlarını bir kaç küp inch e kadar düşürmüştü fakat tuğla sıfatından hala kurtulamamıştı. Şimdilerde bu yakıştırma üzerinde dikine duran bir eleman veya entegre kullanılmadan yapılmış devreler için hala devam  etmektedir. Bu ilkel opamplar özel uygulamalar için yapılmışlardı, bu yüzden genel amaçlı olarak gerekli değildi. Eski opamplar özel uygulamalara hitap ediyordu fakat her üreticinin kendine özgü özellikleri ve kılıfları vardı. Entegre devreler 1950 lerin sonu ve 1960 ların başında geliştirildi fakat 1960 ın daha ortasına gelmeden Fairchild μA709 u piyasaya sürdü. Bu ilk başarılı opamp entegre devresiydi ve Robert J. Widler tarafından dizayn edilmişti. μA709 bilinen tüm sorunları ile piyasaya sürüldü fakat yetenekli mühendisler tarafından bile kullanılamadı ve uA709 farklı analog uygulamaları ile hazır halde piyasaya yeniden sürüldü. μA709 un dezavantajı kararlılığıydı. Kompanzasyon dışarıdan bağlanan pasif elemanlarla, tecrübeli bir mühendis tarafından yapılıyordu. Ayrıca μA709 biraz hassastı çünki en ufak bir ters durumda kendini kendini bozabilme gibi tuhaf bir huyu vardı. Bu kendi kendini bozabilme olayı o kadar yaygındı ki askeri techizat üreten bir üretici μA709 hakkında “The 12 Pearl Harbor Conditions of the μA709” başlıklı bir yazı yayınladı. μA709 u μA741 takip etti. μA741 in kompanzasyon sorunu içeride çözülmüştü ve katalog değerlerine uygun olarak çalıştırıldığında dışarıdan kompanzasyona gerek duymuyordu. O günden bu güne bir çok üretimi sonlandırılmayan seriler piyasaya sürüldü. Performans ve kararlılıkları ise herhangi birinin kolaylıkla analog uygulamalarında kullanabileceği kadar geliştirildi.

Yeni nesil opamplar artık frekans spectrumunda, 5kHz den 1Ghz inde ötesinde oldukça geniş bir yelpazaye hakim. Besleme gerilimi aralığı 0.9V dan maksimum 1000V a kadar uzanıyor. Giriş akımı ve offset gerilimi oldukça düşük. Tüm analog işlemleri  gerçekleştirebilmesi nedeniyle opamp lar artık analog entegrelerin gözdesi olmuş durumda. Opamplar günümüzde; hat sürücüsü, karşılaştırıcı, gerilim kaynağı, akım kaynağı, osilatör, filtre, kuvvetlendirici gibi birçok uygulamada kullanılıyor. Artık tasarmcılar opamp  kullanacakları zaman, doğru opampı nasıl hızlıca seçerim ve pasif devre elemaları ihtiyacıma göre nasıl hesaplarım gibi basit soruların  cevaplanmasın ardından, neredeyse tasarımlarını bitmiş oluyorlar.

The Op Amp’s Place in the World (Orjinal metin)

Stabilized Feedback Amplifiers (Harry Black – Stabilized Feed-Back Amplifiers)

Metal Dedektörü

13 Ekim 2011 7 yorum

Bu devrede 2 adet colpitts osilatör bulunmaktadır. Her 2 osilatörde normalde aynı frekansta salınım yapmaktadır fakat metal sezen osilatörün bobinine metal cisim yaklaştırıldığında osilasyon frekansı değişir. 2 osilatörün ürettiği işaretler bir çarpım devresinin girişine uygulanır. Dolayısı ile çarpım devresini çıkışında f1+f2 ve f1-f2 olmak üzere 2 işaret bulunur. Çarpım devresi çıkışını alçak geçiren bir devre ile süzersek f1-f2 yi kullanabiliriz. f1-f2, dedektör bir metal algılamadığında 0Hz dir. Herhangi bir metal, dedektör bobinine yaklaştırıldığında, bir osilatörün frekansı kayacağından f1-f2 0Hz den farklı değerler almaya başlar. Yaklaşık 10-20Hz üzerine çıktığında ise bu fark frekansı artık duyulabilir bir bölgededir. Eğer ses yükselteci ile kuvvetlendirilirse metal yoğunluğuna göre tizleşen ses seviyeleri elde edilebilir.

Devrede L1 sabit, L2 ise sensör bobinidir. D1, D2 ve R10 çarpım devresini oluşturur. Ardından gelen transistörlü kat tampon devresidir. R13 ve C11 bu devrenin çıkışındaki alçak geçiren filtreyi oluşturur. Burada elde edilen ses frekansı bandındaki işaret kuvvetlendirici katına aktarılır. Kuvvetlendirici katındaki R17 direnci geribesleme direnci olup ses şiddetini ayarlar. R16 ise 8Ω luk bir hoparlördür.

PCB dökümanları Alt bakır, Delik bilgisi, Şema, Üst yerleşim

Colpitts Osilatör

10 Ekim 2011 8 yorum

Colpitts osilatörün AC eşdeğer devresi yukarıdaki gibidir. Paralel LC rezonans devresi transistörün kollektör-baz eklemlerine bağlıdır, bu durumda emetör, C1 ve C2 den oluşan gerilim bölücü ile beslenir. R devrenin çıkış direncini temsil eder buna yük direnci ve LC devresinin direnci de dahildir.

Eğer çalışılan frekans çok yüksek değilse transistörün kaçak kapasiteleri yok sayılabilir. Bu durumda osilasyon frekansını veren eşitlik aşağıdaki gibidir.

Devrenin osilasyona başlayabilmesi için barkhausen kriterinin sağlanması gerekir. Dolayısı ile

olmalıdır. Colpitts osilatörde ß, C1/C2 den oluşan geribesleme faktörünü, A ise gmR olan gerilim kazancını temsil eder. Düzenlersek

olmalıdır. Osilasyonun başlaması içinse kapalı çevrim kazancının en az 1 olması gerekir. Bu durumda yukarıdaki ifade

şeklini alır.

Buraya kadar elde ettiğimiz denklemleri kullanarak aşağıdaki colpitts devresinin değerlerini 1Mhz lik osilasyon frekansı için hesaplayalım.

Devrenin çalışma gerilimini keyfi olarak 12V seçtik. Kullanılan transistörü ise çalışacağımız frekansa göre seçmemiz gerekir. Transistörün datasheetinde fT olarak verilen değerin 3 te birinden düşük bir frekansta çalışmamız gerekir. BC337 için bu değer 100MHz dir. Düşündüğümüz osilasyon frekansı 1MHz olduğundan BC337 uygulama için uygun bir transistördür.

Direnç değerlerini bulmak için devrenin DC eşdeğeri üzerinden gidilir. DC eşdeğerde C ler açık devre L ler ise kısa devre olarak düşünülür. Bu durumda yukarıdaki devre için DC eşdeğerde transistör, kaynak gerilimi ve 4 adet direnç kalır. Kollektör akımını 3mA olarak seçer ( yüksek kollektör akımları düşük çıkış direnci, düşük kollektör akımları ise yüksek çıkış dirençi demektir) ve R4 direncini 1K olarak belirlersek. Yaklaşık kollektör akımını emetör akımına eşit olacağından R4 direnci üzerinden de aynı akım geçerek, R4 emetör direnci üzerinde 3V luk bir gerilim düşümüne neden olur. Baz emetör arası gerilimin 0.7V olduğunu düşünürsek BC337 nin baz gerilimi 3.7V olmalıdır. Bu durumu sağlayan R1 ve R2 dirençleri sırasıyla 22K ve 10K olabilir. R3 ise bulunacak son adımdır.

Devrenin osilasyon frekansının LC devresine bağlı olduğunu söylemiştik. Bu durumda C5 15nF, C4 1nF, L ise 27μH seçilirse osilasyon frekansı yaklaşık 1MHz olacaktır.

Osilasyonun başlaması için gereken şart

idi. C2/C1=C5/C4 olduğundan eşitliğin sağ tarafı 15 dir. Dolayısı ile  gmR, 15 den büyük veya eşit olmalıdır.

Burada gm=Ic/26mV dur. Kollektör akımını 3mA seçtiğimizden gm yaklaşık olarak 0.115 dir. O halde R, 15/0.115 den, 130Ω dan büyük olmalıdır. Emetör direnci R4 gibi, kollektör direnci (R3) de 1K seçilebilir. Çok büyük direnç değerleri ise transistörü doyuma götüreceğinden devrenin çıkışındaki işaretin kırpılmasına neden olabilir.

Devrenin son hali yukarıdaki gibidir. C3 emetör bypass kapasitesidir. C1 AC olarak bataryayı kısa devre eder. C2 ise geribesleme hattında olduğundan C4 ile C5 arasında herhangi bir değer olabilir. Bu uygulama da C2 için 10nF  lık bir kondansatör yeterlidir. İstenirse C2 değeri değiştirilerek çıkıştaki işaretin genliği ile oynanabilir. Fakat gereğinden büyük veya düşük değerler osilasyonu durdurabilir veya çıkış işaretinin bozulmasına neden olabilir.

 

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.

5 Band Graphic Equalizer

04 Ekim 2011 4 yorum

Devrede birbirinden bağımsız merkez frekansları ayarlabilen, “multiple feedback” topolojisi üzerine kurulu 5 adet aktif filtre vardır. Ayrıca kazanç değerleride ( boost ve cut ) birbirinden bağımsız olarak ayarlanabilir.

“Multiple feedback” topolojisinde, aktif filtrenin kalite faktörü ( Q ), kazancı ( Am ) ve merkez frekansı ( fm ) birbirinden bağımsız olarak ayarlanabilir. Bu topolojinin bir diğer avantajı ise merkez frekansının, band genişliği ve kazancı değiştirmeden tek bir direnç değeri üzerinden ayarlanabilmesidir.

devrenin hesaplamaları ise şöyledir:

5 bandın sırasıyla merkez frekansları 50Hz, 250Hz, 1kHz, 3.5kHz, 10kHz şeklindedir. Buna göre yukarıdaki denklemler yardımıyla devre elemanlarının değerlerini 5 band için ayrı ayrı hesaplarsak.

  • 50Hz aktif filtre için kazanç=1, Q=1.01, C=220nF dersek R1=14.61K, R2=29.23K, R3=14.05K olarak bulunur
  • 250Hz aktif filtre için kazanç=1, Q=1.31, C=100nF dersek R1=8.34K, R2=16.68K, R3=3.43K olarak bulunur
  • 1kHz aktif filtre için kazanç=1, Q=1.33, C=100nF dersek R1=2.12K, R2=4.23K, R3=834R olarak bulunur
  • 3.5Hz aktif filtre için kazanç=1, Q=1.33, C=10nF dersek R1=6.05K, R2=12.10K, R3=2.38K olarak bulunur
  • 10kHz aktif filtre için kazanç=1, Q=1.33, C=1nF dersek R1=21.17K, R2=42.34K, R3=8.34K olarak bulunur

5 aktif filtrenin sırasıyla PSpice sweep analizleri aşağıdaki gibidir.

5 band filtre çıkışlarını 5 adet ±10dB kazançı kuvvetlendirileri ile sürer ve bunları bir toplam devresinde birleştirip tüm kuvvetlendiricilerin boost, sadece 1kHz nin boost ve sadece 1kHz nin cut olması durumu için bir kaç analiz yaparsak:

  • Tüm bandların kazançları +10dB iken şematik ve analiz sonucu aşağıdaki gibidir

 

  •  Sadece 1kHz boost (+10dB) diğerleri cut (-10dB) iken şematik ve analiz sonucu aşağıdaki gibidir

  •  Sadece 1kHz cut (-10dB) diğerleri boost (+10dB) iken şematik ve analiz sonucu aşağıdaki gibidir

Analizden de görüldüğü üzere, tüm filtrelerin kazançlarının maksimum olması durumunda dahi devrenin bazı frekans aralıkları için cevabı sınırlıdır. Bu durumu aşabilmek için 5 band yerine ses frekasnı aralığını daha çok banda ( 10 – 12 band gibi) bölmek uygun olacaktır. Bu durumda daha hassas ayar yapabileceğimiz bir filtremiz olacaktır.