Bu proje ; bilinmeyen AC ve DC gerilimlerini ölçebilir Arduino kartı merkezli bir projedir. Biz breadboard devresinde bilinmeyen gerilimi bağladığımızda , 16 x 2 LCD ekran gerilim değerini gösterir. Projede; bu Voltmetreyi geliştirmek için Gerilim Bölücü devre kavramı kullanan, ADC özellikli bir Arduino pro mini kart kullanılır.

1
-Projenin Mimarisi :

Tüm proje üç temel bloğa ayrılabilir;

1) AC / DC Gerilim Algılayıcı (Sensör) Ünitesi

2) İşlemci Ünitesi

3) Ekran Ünitesi

 

2
            Sensör Ünitesinin iki girişi, DC gerilim ve AC gerilim alır. Sensör Ünitesi DC ve AC giriş gerilimlerini azaltarak, 0 V – 5 V aralığında ve çıkışla aynı bir DC gerilim olmasını sağlar.
İşlemci ünitesi 0 V – 5 V aralığında gerilim değeri alır. Bu ünite; Sensör Ünitesi çıkışını giriş gerilimi olarak alır ve bu gerilimi okumak için ADC kullanır. Gerilimi hesaplamak için bir algoritma uygulanır. Daha sonra ünite Görüntü Birimine (ekrana); AC ve DC gerilim değerlerini içeren 4bit bir veri gönderir.
Görüntü Birimi (Ekran Ünitesi) 4bit veriyi İşlemci Biriminden alır ve AC ve DC gerilimler için 16×2 ekran üretir.
1) AC / DC Gerilim Algılayıcı Ünitesi
Temel gerilim bölücü bir devre; DC ve AC giriş gerilimlerini 0 V – 5 V DC gerilim aralığına düşürmek için AC / DC Algılama Birimi kullanır. İşlemci Ünitesi bu düşüş gerilimini okuyabilir ve gerçek AC / DC gerilimi olarak hesaplayabilir.
R1 Değerinin Tasarımı :

500V ‘a kadar ölçülebilen bir ilk maksimum gerilim seçelim. ‘V’ ‘ye 500 V değeri verip uyguladığımızda; ‘V2’ 5V ‘den fazla olamaz ve dolayısıyla ‘V1’ 500 – 5 = 495 V olacaktır. 495 gibi çok yüksek gerilimlerde, dikkat edilmesi gereken ilk şey direncin güç derecesidir. Güç derecesi 0,25 W olan dirençler kullanıyoruz; ve ‘R1’ direnci bundan daha az güç harcar, aksi takdirde dirençler ısınabilir ve yanabilir.
Güç denklemi P = V12 / R1.
Burada :

P – Direncin Güç Oranı

V – Direnç üzerindeki Gerilim

R – Direncin Değeri

 

R1 direnci için güç oranı 0.25 W ve üzerinden geçen gerilim 495 V ,

0.25 = 495 * 495 / R1

Ya da, R1 = 980100 ohm, 1 M ohm standart direnç alır.
R2 değeri Tasarımı :

Şimdi R2 değeri, bir önceki eşitlik kullanılarak hesaplanabilir,

V = V2 * (1 + R1 / R2) aşağıdaki gibidir;

R2 = R1 / ((V / V2) – 1)

R2 = 1000000 / ((500 / 5) – 1)

R2 = 10101 ohm, 10K ohm standart direnç değeri alır.

 

DC Giriş Gerilimi :
4
          ‘V2’ gerçek uygulanan gerilim olan ‘V’ nin bir bölümüdür. Uygulanan ‘V’ gerilimi; uygulanan gerçek gerilimin ‘V2’ bölümünden aşağıdaki denklem yardımıyla hesaplanabilir.

DC gerilim, Vdc = V2 * (1 + (R1 / R2))
AC Giriş Gerilimi :
Biz bir AC gerilim uygularken; olumsuz döngülerin devreye girmesini engellemek için, doğrultucu diyodu seri olarak Gerilim Bölücü devre ile birlikte kullanırız. Transformatörleri azaltmaya gerek yoktur çünkü biz zaten R2 üzerindeki ‘V2’ gerilimini sadece 0 V – 5 V aralığında alıyoruz .

5
Aralık seçicisi gereksinimi :

Biz ölçüm yaparken Voltmetredeki çoklu aralıklar nedeniyle okurken hata meydana gelir, bu durum Direnç Toleransından kaynaklanır .

a) R1 / R2 oranındaki azalma, hatayı azaltır.

b) R1 / R2 oranının azalmasının belli bir sınırı vardır:

V ‘nin değerlerini en az hata ile ölçmek için R1’in R2 ile farklı ortak bir kümesine ihtiyaç duyarız. V geriliminin sahip olduğu değer , R1 / R2 ‘nin en düşük oranını veren bir R1 ile ölçülmesine bağlıdır, mutlaka ölçülmesi gerekir ; gerçek V2 değerinin 5 V aralığın üzerine çıkmamasına dikkat edilmelidir.

(R1 / R2) > (V / 5) – 1

Örneğin; V = 500 V ölçmek için, R1 / R2> 99 ‘dur , dolayısıyla R1 / R2 = 100 değerini elde edebilmek için R1 = 1 M ve R2 = 10K kullanabiliriz.

6

Devre Diyagramı :

15

 

 

 

Kaynak Kodu :

 

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#define resistance_R50 100000

#define resistance_R500 1000000

#define resistance_V2 10000

#define caliberation_V2 1.1

#define range50_mul (resistance_R50 / resistance_V2) * caliberation_V2

#define range500_mul (resistance_R500 / resistance_V2) * caliberation_V2

#define resistance_Ri 10

#define resistance_Cr 100000

#define resistance_Rb 100000

#define resistance_Re 10

#define resistance_R2 1000

int adc_value = 0;

int voltage_peak_value = 0;

int discharge_voltage_V0 = 0;

int discharge_voltage_V1 = 0;

float voltage_average_value = 0;

float dc_voltage_V0 = 0;

float ac_voltage_V0 = 0;

float dc_voltage_V1 = 0;

float dc_voltage_V2 = 0;

float ac_voltage_V1 = 0;

float dc_current_I0 = 0;

float dc_current_I1 = 0;

float ac_current_I0 = 0;

float dc_power = 0;

float ac_power = 0;

float npn_pnp_hfe = 0;

float capacitance = 0;

unsigned long resistance;

unsigned long sample_count = 0;

unsigned long discharge_time_T0 = 0;

unsigned long discharge_time_T1 = 0;

char fn0 = 6;

char fn1 = 7;

char fn2 = 8;

char rn0 = 9;

char rn1 = 10;

char rn2 = 13;

char function_select [4];

char range_select [4];

void setup()

{

lcd.begin(16, 2);

lcd.print(" EG LABS ");

delay(3000);

pinMode(fn0, INPUT);

pinMode(fn1, INPUT);

pinMode(fn2, INPUT);

pinMode(rn0, INPUT);

pinMode(rn1, INPUT);

pinMode(rn2, INPUT);

}

void loop()

{

function_select [0] = digitalRead(fn0) + '0';

function_select [1] = digitalRead(fn1) + '0';

function_select [2] = digitalRead(fn2) + '0';

function_select [3] = '';

range_select [0] = digitalRead(rn0) + '0';

range_select [1] = digitalRead(rn1) + '0';

range_select [2] = digitalRead(rn2) + '0';

range_select [3] = '';

//=============================== VOLTAGE ========================================//

voltage_peak_value = 0;

for(sample_count = 0; sample_count < 5000; sample_count ++)

{

adc_value = analogRead(A0);

if(voltage_peak_value < adc_value)

voltage_peak_value = adc_value;

else;

delayMicroseconds(10);

}

dc_voltage_V0 = voltage_peak_value * 0.00488;

ac_voltage_V0 = dc_voltage_V0 / 1.414;

if ( 0 == strncmp (range_select, "01", 2) )

{

lcd.clear();

lcd.setCursor(0, 0);

lcd.print("[R] ");

if (range_select [2] == '0')

lcd.print(" DCV");

else

lcd.print(" ACV");

lcd.setCursor(0, 1);

lcd.print("0-5 ");

if (range_select [2] == '0')

lcd.print(dc_voltage_V0);

else

lcd.print(ac_voltage_V0);

delay(500);

}

else;

if ( 0 == strncmp (range_select, "10", 2) )

{

lcd.clear();

lcd.setCursor(0, 0);

lcd.print("[R] ");

if (range_select [2] == '0')

lcd.print(" DCV");

else

lcd.print(" ACV");

lcd.setCursor(0, 1);

lcd.print("5-50 ");

if (range_select [2] == '0')

lcd.print(dc_voltage_V0 * range50_mul);

else

lcd.print(ac_voltage_V0 * range50_mul);

delay(500);

}

else;

if ( 0 == strncmp (range_select, "11", 2) )

{

lcd.clear();

lcd.setCursor(0, 0);

lcd.print("[R] ");

if (range_select [2] == '0')

lcd.print(" DCV");

else

lcd.print(" ACV");

lcd.setCursor(0, 1);

lcd.print("50-500 ");

if (range_select [2] == '0')

lcd.print(dc_voltage_V0 * range500_mul);

else

lcd.print(ac_voltage_V0 * range500_mul);

delay(500);

}

else;

//=================================================================================//

}

Çalışma Videosu:

2 YORUMLAR

  1. hocam ben 3 fazlı asenkron motorun voltajını arduino ile lcd ekrana yazdırıcam ama nasıl yapacağım hakkında çok bilgim yok yardımcı olurmusunuz. teşekkürler şimdiden

  2. Bu yazılımın ac kısmı çalışmaz. Sanırım o nedenle sadece dc videosu yayımlanmış. Zira ac frekansı 50. Diyot bağlanmış olması doğrultulduğu anlamına gelmez giriş dc dır ama sn de 50 kere 0 ile 5v arası değer değişir. Oysa kodlarda sadece okuma anı hesaba katılmış. Maksimum değer veya rms değer gibi yöntemler izlenmemiş. Muhtemelen devreyi yapan bunu bildiği için sadece dc görüntü yayımlamış ama bunu buradaki kodlarla yapıp aç stabil ölçüm yapamayanlar bilsinlerki kendilerinde hata yok devrenin ve kodların tasarımı öyle.

ugur demirbaş için bir cevap yazın İptal

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz