Elektronik Hobi Devreleri

Minyatür Voltmetre Yapımı

Voltmetre : Çoğu zaman elektronik devrelerde ölçüm için DC Voltmetrelere ihtiyaç duyarız. Elimizdeki Ölçü aletlerini sabit olarak devreye bağlı tutmak o cihazı diğer noktalara götürmemizi engelliyor. Çoğunlukla ihtiyacımız 5-15V arasındaki DC voltajını ölçen voltmetrelerdir. Gösterilen devre hem daha az yer kaplıyor hemde oldukça az güç tüketiyor.

Yapacağımız minyatür voltmetre iki çalışma moduna sahiptir.

İlk Modda (12V Akü Modu) : Voltajı ölçmek ve akünün durumunu izlemek için doğrudan 12V aküye bağlanır.

İkinci modda : (20VDC voltmetre modunda): 0,0 ile 20,0 VDC arasında ölçüm yapabilen normal bir DC Voltmetre olarak çalışmaktadır.

Mod 1 ve Mod 2 arasında seçim yapmak için J1 ve J2 butonlarını kullanacağız. Mod seçildikten sonra Attiny85 MCU ADC Kanalındaki voltajı pin 7 de sürekli olarak ölçülür ve dijital değerine dönüştürür. ADC ‘ nin değeri kodda ki bir algoritma kullanarak karşılık gelen voltaj değerine dönüştürülür. Pil Modunda ADC’nin değerine bağlı olarak farklı pil durumu (DÜŞÜK, Şarjlı, Aşırı Şarjlı vb.) İle birlikte pilin mevcut voltaj seviyesi OLED’de görüntülenir. Voltmetre modunda, ilgili voltaj seviyesi OLED’de gösterilir.

Gerekli Bileşenler:

  • 1 Ad. Attiny85
  • 1 Ad. 0,96″ OLED Ekran
  • 1 Ad. LM7805
  • 3 Ad. 1N4007
  • 2 Ad. 3mm LED
  • 1 Ad. 100uF 50V Kondansatör
  • 1 Ad. 10uF 16V Kondansatör
  • 1 Ad. 0,1uF Disk (Mercimek) Kondansatör
  • 2 Ad. 5kOhm Trimpot
  • 2 Ad. 10 kΩ 0,25W Direnç
  • 2 Ad. 4,7kΩ 0,25W Direnç
  • 1 Ad. 8,6kΩ 0,25W Direnç
  • 1 Ad. 2,2kΩ 0,25W Direnç
  • 1 Ad. 1kΩ 0,25W Direnç
  • 1 Ad. 9V Pil
  • Kablolar Düğmeler vs.

IC1 (7805), IC2 ve OLED güç beslemesi için kullanılan 5V voltaj regülatörüdür. IC2 8 pinli MCU’dur (ATTINY85) devrenin kalbidir.MCU’ya giriş sağlamak için bir voltaj bölücü kullanılır. Kontrolör ADC piminde giriş olarak maksimum 5V alır. 

Gerilim bölücü, gerilimi 5V’un altına getirmek için kullanılır. Toplam projeyi kompakt hale getirmek için burada 0.96 “ekranlı (organik ışık yayan diyot) modül (4 pimli bağlantılı) kullanılmıştır. 

OLED ekranına veri aktarımı için sadece iki pin ( SDA ve SCL ) ve güç kaynağı için iki pin daha kullanılır. Ekran 128 × 64 piksel çözünürlüğe sahip.Küçük metin 16X8 bit yazı tipi boyutu kullanılarak görüntülenir; burada ölçülen voltaj 32 × 24 bit yazı tipi boyutu kullanılarak büyük boyutlu yazı tipi olarak görüntülenir.  


Programlama Rehberi :

Bu projede ATtiny85, 9V veya 12V pilin şarj durumunu (seçilen moda göre) pilin terminal voltajını ölçerek gösterecek şekilde programlanmıştır. MCU, AVR Studio 4 kullanılarak gömülü C ile kodlanmıştır .

Kodda kullanılan sabitler :

  • #define F_CPU 1000000UL: – MCU’nun saat frekansını tanımlamak için kullanılan sabit 
  • #define BLINKER 0b00000001: – Sabit, MCU’nun düzgün çalıştığını göstermek için LED’i yanıp sönmek için kullanılır. 
  • #define BATT12V 0B00000010: – Sabit 12V akü modunu ayarlamak için kullanılır.

Kodda kullanılan değişkenler :

  • A: – 10 bit ADC Kanalından analog okumayı saklamak için kullanılan değişken 
  • V: – ADC okumasını gerilime dönüştürmek ve pil durumunu göstermek için kullanılan değişken 
  • Prev_mode: – Önceki pil modunu belirtmek için kullanılan değişken (12V veya 20V pil modu) 
  • current_mode: – Geçerli pil modunu belirtmek için kullanılan değişken (12V veya 20V pil modu) 
  • dispstr [6] = {‘0 ′,’ 0 ′, ‘.’, ‘0 ′,’ / ‘, 0}: – OLED biçimini tanımlamak için kullanılan dizi

Kodda kullanılan başlık dosyaları ve kütüphaneler :

  • #include <avr / io.h>: – Giriş çıkışı için standart AVR başlığı 
  • #include <util / delay.h>: – Zaman gecikmeleri sağlayan standart AVR başlığı 
  • #include <avr / pgmspace.h> Program alanı yardımcı programları içeren standart AVR başlığı 
  • #include “OLED_LIB.C”: – 0.96 ”OLED ile çalışmak için fonksiyonlar içeren genel amaçlı kütüphane. Bu kütüphane herhangi bir AVR mikroişlemcisiyle kullanılabilir. OLED_LIB, pin 2’yi SDA ve pin 3’ü ATtiny85’in SCL’si olarak tanımladığını unutmayın. 
  • #include “FONT_BASIC_16x8.H”: – Bu başlık dosyası 16×8 piksel (küçük) boyutta Alfabe, sayılar ve simgeler içerir. 
  • #include OLED_NUMS_32x24.H: – Bu başlık dosyası, voltaj değerini görüntülemek için yalnızca 32 x 24 piksel (büyük) boyutunda sayılar içerir. 

Kodda kullanılan fonksiyonlar  :

  • ADC_init (): – ADC kanalını başlatmak için kullanılan işlev. 
  • readADC (): – ADC Kanalı 1’den analog voltaj okumak için kullanılan işlev 
  • OLED_init (): – OLED ekranını başlatmak için kullanılan işlev 
  • OLED_floodfill (): – 0xFF parametresini geçirerek parlak ışığı görüntülemek ya da 0x00 parametresini geçirerek OLED’i temizlemek için kullanılan işlev.

Algoritma :

1) Voltmetre devresi açıldığında, her şeyden önce, OLED başlatılır ve parlak bir ışık gösterilerek kontrol edilir. Ardından, OLED ekranı temizlenir ve bir karşılama mesajı – “Minyatür Voltmetreye Hoş Geldiniz” yazısı yanıp söner. MCU düzgün çalıştığını göstermek için bir LED’i yanıp sönmeye başlar. MCU, Attiny85’in 6 numaralı pinindeki dijital girişi kontrol ederek pil modunun (12V veya 20V mod) durumunu kontrol eder. Şimdi kontrolör voltaj okumaları almaya hazır.
DDRB = BLINKER;
) (OLED_init; // OLED göstermeye başla
_delay_ms (10);
OLED_floodfill (0XFF); // kendini test olarak parlak ışıkla OLED göster
_delay_ms (500);
ADC_init (); // ADC sistemini başlat
(0x00) OLED_floodfill; // OLED'in boş gösterimi
_delay_ms (500);
OLED_show_str_16x8 (”HOŞGELDİNİZ“, 6,0); // bir hoşgeldin mesajı
OLED_show_str_16x8 (”MINIATURE“, 11,3); // OLED’de görüntüleniyor
OLED_show_str_16x8 (”VOLT METRE“, 6,6); // OLED'de metin gösteriminin kendi kendini sınaması olarak
_delay_ms (1000);
(0x00) OLED_floodfill; // OLED'in boş gösterimi
_delay_ms (300);

2) Kullanıcı, standart (veya bilinen) bir voltaj kaynağının voltaj okumasını alabilir ve voltmetreyi kalibre etmek için ilgili potu(mevcut pil moduna göre) ayarlayabilir. Bu devrede voltmetre, standart bir 12V voltaj kaynağı kullanılarak kalibre edilir, burada ADC okuması 12V (12B giriş için) 900 ve 12V (12B giriş için) 20V pil modunda ayarlanır. 
Kalibrasyondan sonra, minyatür voltmetrenin tam olarak doğru voltaj değerleri vermesi beklenir.

3) MCU, readADC () işlevini kullanarak pim 7’deki (ADC Kanal 1) 12V veya 20V batarya voltajını algılar ve bu okuma değerini A değişkenine kaydeder. ATtiny85, 10 bitlik ADC kanalına sahiptir, bu nedenle ADC okuma (içinde saklanır) A) değişkeni 0 ila 1023 arasında değişebilir. Akü durumunu belirtmek için voltaj karşılaştırması için, 20V akü modu durumunda 750’nin ADC değeri 12 V’a eşittir ve 12 V akü modu durumunda 900’lü ADC değeri 12 V’a eşittir . 

4) A’da depolanan değer, A değerinin 750 (20V akü modunda) veya 900 (12 V akü modunda) gerçek 12V’a eşdeğer olduğunu varsaymak suretiyle voltaja dönüştürülür ve V değişkeninde saklanır. Akü durumunu belirleme koşullarının kodda uygun şekilde tanımlandığını unutmayın. Yukarıdaki varsayım minyatür voltmetrenin kalibrasyonundan türetilmiştir. 20V pil modunda, bilinen 12V voltajı kullanıldığında, ADC okuma pot kullanılarak 750’ye ayarlanır. Benzer şekilde, 12 V pil modunda, bilinen 12 V voltajı kullanıldığında, ADC okuma, ilgili kazan kullanılarak 900’e ayarlanır. ADC okumasının voltaja dönüştürülmesinin burada kalibrasyona bağlı olduğunu unutmayın.  

PORTB ^ = BLINKER; // MCU’nun çalıştığını göstermek için yanıp sönen ışığı A = readAdc (1); // 1 no'lu kanaldan ADC değerini oku curr_mode = (PINB & BATT12V); // 12V akü modu için J2 atlama teli veya 20VDC voltmetre kullanarak çalışma modunu kontrol edin eğer (prev_mode! = curr_mode) 
{ 
OLED_floodfill (0x00); 
_delay_ms (50); 
} 
if (curr_mode> 0) 
V = A / 6; 
else
V = A / 5;

5) V değeri, takılı bataryanın şarj durumunu belirtmek için başka ifadelerde karşılaştırılır.
if ( curr_mode>0 )        // in case of 12V battery mode, appropriate status is diplayed on OLED
{
OLED_show_str_16x8 ( "12V BAT.METER",0, 0);
if ( V>150 )
OLED_show_str_16x8 ( "NOT 12V BAT  " , 0 ,6);
else if ( V>135 )
OLED_show_str_16x8 ( "OVER CHARG   " , 0 ,6);
else if ( V>120 )
OLED_show_str_16x8 ( "BATT. GOOD   " , 0 ,6);
else if ( V>100 )
OLED_show_str_16x8 ( "BATT. LOW    " , 0 ,6);
else if ( V>90 )
OLED_show_str_16x8 ( "BATT. WEAK   " , 0 ,6);
else if ( V>60 )
OLED_show_str_16x8 ( "BATT. DEAD   " , 0 ,6);
else //if ( V<30 )
OLED_show_str_16x8 ( "BATT.ABSENT  " , 0 ,6);
}

6) V değeri ondalık gösterime göre biçimlendirilir ve okuma gerilimi OLED ekranında gösterilir.  
dispstr[0]=V/100+'0';
V=V%100;
dispstr[1]=V/10+'0';
dispstr[2]='.';
dispstr[3]=V%10+'0';
dispstr[4]='/';
dispstr[5]=0;

7) A’da depolanan ADC değeri, voltajın belirtilen aralığın dışında olup olmadığını kontrol etmek için 1000 ile karşılaştırılır.
if ( A>1000 )      // in case the ADC read value is out of range then display as OVERFLOW
{
OLED_show_str_16x8 ( " OVERFLOW  " , 0 ,0);
_delay_ms ( 150 );
OLED_show_str_16x8 ( "" , 0 ,0);
_delay_ms ( 100 );
}

Çalışma: 

İlk kurulum:  

Devreyi bir PCB üzerine monte ettikten sonra , SW1’i 9V aküye çevirerek güç kaynağını bağlayın. Sonra herhangi bir AVR programlayıcı kullanarak miniVoltMeter.hex dosyasını MCU’ya (ATTINY85) yükleyin / yazın.  İlk başta, OLED ON (Açık) modda tüm pikselleri (128 × 64) gösterir, ekranın bir süre parlak olmasını sağlar. 
Sonra, MINIATURE VOLT METRE’YE HOŞ GELDİNİZ olarak bir hoşgeldin mesajı görüntüler. Sonra, henüz kalibre edilmemiş olan rastgele gerilimi görüntüler. 

Şimdi, Jumper J1’i bağlayarak ve J2 bağlantısını keserek tahtayı 12V BATTERY MODU için ayarlayın. Ardından, sinyal terminallerine yaklaşık 12VDC veya 12V pillik bir bilinen voltaj kaynağı bağlayın (veya kesin giriş voltajını bilmek için terminallere paralel bir çoklu metre bağlayın). Şimdi, göstergeyi OLED’de doğru gerilime gösterecek şekilde trimleme kabı VR1’i ayarlayın. 

Şimdi, J1 atlama kablosunu ayırıp J2 bağlantı kablosunu bağlayarak VOLT METER MODE için kartı ayarlayın. Ardından, giriş sinyaliyle aynı voltaj kaynağında, OLED üzerindeki ekranı doğru voltajda gösterecek şekilde trimleme kabı VR2’yi ayarlayın. Şimdi kalibrasyon tamamlandı ve devre kullanıma hazır. Sinyal girişini ayırın ve kartı ihtiyaca göre modlardan birine ayarlayın.

İki çalışma modu vardır. 12 V ve 20 V.

12V akü modu için J1 atlama kablosunu bağlayın ve J2 atlama kablosunu ayırın. Voltaj MCU’nun ADC kanalı tarafından okunur ve büyük font kullanılarak OLED’de akü voltajını gösterir. OLED’in en üst çizgisi 12V BAT olarak görünüyor. METER ve alt satır bataryanın durumunu BATT.ABSENT / BATT.DEAD / BATT.WEAK / BATT.GOOD / OVER CHRG olarak gösterir. vb. 

20VDC voltmetre modu için, J1 atlama kablosunu ayırın ve J2 atlama kablosunu bağlayın. giriş sinyali voltajı MCU’nun ADC kanalı tarafından okunur ve ortada büyük font ile OLED’de görüntülenir. Burada OLED’in en üst satırında VOLT METRE ve alt satırında 20 DC VOLTS görülmektedir.   

Her iki modda da giriş voltajı ADC giriş voltajı değerini (yaklaşık 5VDC) aşıyorsa, üst satırda AŞIRI AKIM mesajı yanıp söner. Zayıf sinyal veya 8VDC’den düşük voltajları okumak için, SW1’in 9V akü bağlantısına çevrilmesi gerekir. Minyatür Volt Metre devresi masaüstü amaçları için hızlı DC volt metre, Akü şarj cihazları, Akü sıraları vb. İçin voltaj ve durum monitörü olarak kullanılabilir. 


Proje Kaynak Kodu

/*
Filename : miniVoltMeter.C
author   : Fayaz Hassan
Date     : 15-02-2018
MCU      : ATtiny85 (A)
Display  : OLED (I2C)
*/
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include "OLED_LIB.C"
#define BLINKER 0b00000001  
#define BATT12V 0B00000010  

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

void ADC_init ( )
{

    ADCSRA |= ( (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0) | (1 << ADEN) ); 

}

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

int readAdc ( int channelno )

{

    ADMUX = (channelno%4);
    ADCSRA |= (1 << ADSC);
    while (ADCSRA & (1 << ADSC));
    return ADC;

}
//========================================================================================
int main ( )

{
    int V=0;
    int A=0;
    int prev_mode = -1;
    int curr_mode = 0;
    char dispstr[6]={'0','0','.','0','/',0};
    _delay_ms ( 500 );
    DDRB = BLINKER;
    OLED_init();
    _delay_ms ( 10 );
    OLED_floodfill(0xFF);
    _delay_ms ( 500 );
    ADC_init ( );
    OLED_floodfill(0x00);
    _delay_ms ( 500 );
    OLED_show_str_16x8 ( " WELCOME TO ",6,0);
    OLED_show_str_16x8 ( " MINIATURE ",11,3); 
    OLED_show_str_16x8 ( " VOLT METER ",6,6); 
    _delay_ms ( 1000 );
    OLED_floodfill(0x00);
    _delay_ms ( 300 );
    readAdc ( 1 );
    readAdc ( 1 );
    while ( 1 )

{

    PORTB ^= BLINKER;
    A = readAdc ( 1 );
    curr_mode = (PINB & BATT12V);
    if ( prev_mode != curr_mode )

{

    OLED_floodfill(0x00);
    _delay_ms ( 50 );

}

    if ( curr_mode>0 )
    V = A/6;
    else
    V = A/5;
    if ( curr_mode>0 )
{

    OLED_show_str_16x8 ( "12V BAT.METER",0, 0);
    if ( V>150 )
    OLED_show_str_16x8 ( "NOT 12V BAT  " , 0 ,6);
    else if ( V>135 )
    OLED_show_str_16x8 ( "OVER CHARG   " , 0 ,6);
    else if ( V>120 )
    OLED_show_str_16x8 ( "BATT. GOOD   " , 0 ,6);
    else if ( V>100 )
    OLED_show_str_16x8 ( "BATT. LOW    " , 0 ,6);
    else if ( V>90 )
    OLED_show_str_16x8 ( "BATT. WEAK   " , 0 ,6);
    else if ( V>60 )
    LED_show_str_16x8 ( "BATT. DEAD   " , 0 ,6);
    else //if ( V<30 )
    OLED_show_str_16x8 ( "BATT.ABSENT  " , 0 ,6);
}

    else

{

    OLED_show_str_16x8 ( " VOLT METER " ,4, 0);
    OLED_show_str_16x8 ( "0-20 DC VOLTS" ,0 ,6);
}

    dispstr[0]=V/100+'0';
    V=V%100;
    dispstr[1]=V/10+'0';
    dispstr[2]='.';
    dispstr[3]=V%10+'0';
    dispstr[4]='/'; 
    dispstr[5]=0;
    if ( dispstr[0]=='0' )
    dispstr[0] = ':';
    OLED_show_str_32x24 ( dispstr , 5, 0,2);
    if ( A>1000 )

{

    OLED_show_str_16x8 ( " OVERFLOW  " , 0 ,0);
    _delay_ms ( 150 );
    OLED_show_str_16x8 ( "           " , 0 ,0);
    _delay_ms ( 100 );

}

prev_mode = curr_mode;

} 

return 0;

}
Voltmetre
Devre diyagramları

Video;

https://www.youtube.com/watch?v=U34_OSzjZhQ

Bu makale buradan çevrilmiştir.

Related posts

Kısa Devre Koruma Devresi Nasıl Yapılır?

Ömer Ersin

HT12D Kod Çözücü Entegre

Ömer Ersin

Arduino ile 2WD Elektrikli Araba

Ömer Ersin