Önceki yazımda sizlere Dc voltmetre yapımını anlatmıştım.Bu yazımda Entes Elektronik stajımda üzerinde çalıştığım bir projeden bahsedeceğim;Pic ile Ac voltmere yapımı.
Dc voltmetre yaparken pic’in analog girişine,gerilim bölücü devresiyle genliğini azalttığımız gerilim değeri verdik.Ac gerilimi ölçerken 220 volt veya 310 volt farketmez gerilim değerini gerilim bölücüyle küçülteceğiz.Bu değeri ötelememiz lazım çünkü sinüs işarette gerilim değeri negatife düşmektedir.Dc kaynakla bu ac işareti öteledikten sonra gerilim genliği 0-5 volt arasında kalacaktır.Böylelikle bu gerilim değerini artık pic’imizin analog ucuna verebiliriz.Aşağıdaki resimlerde bu gerilim bölücü ve öteleyici devremizi görebilirsiniz.Giriş ve çıkış grafiklerinide inceleyebilirsiniz.Bu devre LT-Spice ‘ da çizilmiştir ve aynı grafikleri bu programdan elde ettim.Uygulamada direnç değerlerindeki %5’lik oynamaya dikkat edelim.Buradaki değerlerdeki oynamaları yazılımla halledeceğiz.
AC gerilimin tepe değerini ölçerken kullanılan yöntem True-Rms‘dir.True Rms yöntemini uygulamamız için sinüsümüzden belli aralıklarla değerler almamız lazımdır.Bu sinüs işaretten örneklemeyi Pic’de kesme işlemiyle yapacağız.
Yukarıda yaptığımız örneklemede misal x1=20v ,x2=40,…,x41=0v yaklaşık 40 kesme ile örnekleme yaptık.Burdaki n=41’dir.Bu değerlerin karesinin toplamının n’e bölümünün kare kökü bize gerilim Rms değerini verecektir.
Pic’in analog ucundan ölçtüğümüz değere direk True-Rms uygulamayın önce bu değerden dc ötelemenin değerini çıkaracağız.Bizim bu dc değerimiz 2.5 volttu.Sonra bu değeri gerilim bölücünün bölme değeriyle çarpacağız ve o anki gerilim değerini elde edeceğiz.
Malzeme Listesi
- 2×16 Lcd display
- Pic 16f877a
- 470k direnç
- 2x10k direnç
- 2x1k direnç
- 22 pf kondansatör
- 4Mhz kristal osilatör
- Gerilim ötelemesi için 7805 çıkışından alınmış 5 volt gereklidir.
Gerilim Bölücümüz giriş 400 volt ac değerini 0-5 volt arasına sığdırabilecek şekildedir.Fazlası Pic’imizi portunu yakar.
Pic ile AC voltmetre Mikroc Kodu
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
sbit LCD_RS at RB0_bit; sbit LCD_EN at RB1_bit; sbit LCD_D4 at RB2_bit; sbit LCD_D5 at RB3_bit; sbit LCD_D6 at RB4_bit; sbit LCD_D7 at RB5_bit; sbit LCD_RS_Direction at TRISB0_bit; sbit LCD_EN_Direction at TRISB1_bit; sbit LCD_D4_Direction at TRISB2_bit; sbit LCD_D5_Direction at TRISB3_bit; sbit LCD_D6_Direction at TRISB4_bit; sbit LCD_D7_Direction at TRISB5_bit; //**************************************************************************** long int veri=0; float voltaj=0,gerilim=0,acgerilim; char yaz[15]; char i=0; //**************************************************************************** void interrupt()//kesme alt programı { if (INTCON.T0IF)//Timer0 Kesme bayrağı kontrol ediliyor. { i++; veri=ADC_Read(2); //Kanal 2 seçildiğinde ADC_Read(2) olur.kanal 1'de ADC_Read(1) olurdu voltaj=(0.004887586*veri); voltaj=voltaj-2.527; //Gerilim Öteleme gerilim=124.8*voltaj; // Gerilim bölücüyle gerilimi küçültük.Yazılımla büyütüyoruz. gerilim=gerilim*gerilim; acgerilim=acgerilim+gerilim; TMR0=131;//Timer0 registerına 4 ms'de bir kesme oluşturacak değer yükleniyor. INTCON.T0IF=0;// Kesme bayrağı sıfırlanıyor. } } //***************************************************************************** void kurulum() { TRISB=0x00; TRISA=0xFF; adcon0=0b10010000; // kanal2(AN2)seçildi. adcon1=0b10000010; // 5 analog,3 dijital uç olacak şekilde ayarlandı trisb=0;//PORTB çıkış portb=0;//PORTB'nin tüm pinleri 0 seviyesinde. OPTION_REG.T0CS=0;// Clock palsi kaynağı olarak dahili osilatör seçildi. OPTION_REG.T0SE=0; OPTION_REG.PSA=0;//Prescaler değeri Timer0 için kullanılacak. OPTION_REG.PS2=1;//Prescaler değeri 1:32 olarak seçildi. OPTION_REG.PS1=0; OPTION_REG.PS0=0; INTCON.GIE=1;// tüm kesmelere izin verdik. INTCON.T0IF=0;//Kesme bayrağını her ihtimale karşı sıfırladık TMR0=240 ;//Timer0 registerına 4 ms'de bir kesme oluşturacak değer yükleniyor. INTCON.T0IE=1;//Timer0 kesmesini aktif ettik. } //***************************************************************************** void main() { kurulum(); while(1) { if(i==107) { Lcd_Init(); Lcd_Cmd(_LCD_CURSOR_OFF); LCD_Cmd(_LCD_CLEAR); delay_ms(20); acgerilim=sqrt(acgerilim/i); floattoStr(acgerilim,yaz); Lcd_Out(1,1,yaz); delay_ms(500); i=0;//i değişkeni sıfırlanıyor. } } } |
Pickit 3 bilgisayarınıza takılıyken Gerilim Bölücünün girişine eğer şebeke gerilimini faz- nötrün yerini dikkat etmeden bağlarsanız eğer şebekenizde kaçak akım rölesi bulunmazsa veya bağlı olan priz izalosyon trafosuna bağlı değilse bilgisayarınız zarar görür.