Elektronik / Mikrodenetleyici Projeleri/

PIC16F877 IRFZ44 Lcd göstergeli solar şarj regülatörü

Sponsorlu Bağlantılar

Hazırlayan: Sabahattin KARABAKIR – Güneş enerjisini ile ilgili çalışmalarınızda çok faydalı olacak bir proje detaylı bilgiler bulunuyor. Ayrıca PIC C dili (HI-TECH PIC C) ile hazırlanmış kaynak yazılımda bulunuyor. Emeği geçen hazırlayan kişilere teşekkürler.

Bu proje güneş enerjisinden daha iyi faydalanabilmek için geliştirilmiştir. Güneş enerjisi kesikli bir enerji çeşididir ve bu nedenle depolanması gerekmektedir. “Solar Şarj Regülatörü” bu noktada ihtiyaç duyulan bir cihazdır ve PV panellerden gelen DC akımın bir bataryada depolanması esnasında iş görür.

Regülatör, standart 12V’luk kurşun-asit bataryalar için tasarlanmıştır ve iki ayrı işlevi vardır, bunlar sırasıyla şöyledir. İlki, bataryayı over-cahrge(aşırı yüklenme) ve over-discharge (aşırı boşalma)’dan korumaktır. İkincisi, yükü aşırı akımdan korumaktır. Bunlara ek olarak bazı monitoring özelliklerine sahip olan regülatör, bir LCD vasıtası ile anlık olarak batarya voltajı, yük akımı, yük gücü ve SOC (State Of Charge-Şarj Durumu )’u göstermektedir. Bu regülatörün en büyük üstünlüğü, piyasadaki benzerlerine göre çok daha ucuz olmasıdır (en az 1/5 fiyatına mal edildi).

Projenin tasarım, geliştirme, test ve ölçüm aşamaları, Ege Üniversitesi, Elektrik-Elektronik Mühendisliği Bölümü, Fotovoltaik Sistemler Laboratuarında gerçekleştirildi. Her laboratuarda var olan temel cihazların yanı sıra, sadece bu laboratuarda bulunan PV (Photo Voltaik) Paneller’den azami derecede faydalanılmıştır, bu yeterlilik ve imkanlar projeye çok büyük bir katkı sağladı.

Bu projede bana zaman ayıran, pratik ve teorik aşamalarda destek olan ve her zaman hoşgörülü davranan sayın okutmanım Dr.Mutlu BOZTEPE’ye teşekkürü borç bilirim.

Bu raporda, PV sistemlerde kurşun asit bataryaların şarj edilmesinde kullanılan regülatörlerin en düşük maliyetli ve en yüksek verimlisi olan On-Off Şarj Regülatörü anlatılacaktır. Regülatör, 12V’ luk bir batarya için tasarlanmıştır ve sabit akım/sabit gerilim yöntemi ile şarj kontrolü yapmaktadır. Bunu PIC16F877 kontrolörlü bir ölçme, kontrol devresi ve IRFZ44 MOS-FET’li bir anahtarlama devresi yapmaktadır. PIC için C dilinde yazılmış bir program kullanılmıştır.

Üzerinde yük(akım, gerilim, güç) ve batarya (SOC-State Of Charge,Şarj Durumu) ile ilgili bilgi veren bir LCD barındırır. Sadece şarj kontrolü değil aynı zamanda yük kontrolü yapar .

solar regulator blok diagram

Altı adet paralel güneş pili panelinden (OST-80 PV modül) alınan 18V’luk maksimum DC gerilim ile 12V’luk bir batarya şarj edilmektedir. On-off regülatör olarak bir güç MOSFET’i ve yük kontrolü için bir güç MOSFET’i kullanılmıştır. PIC (www.microchip.com)8 mikro denetleyicinin analog girişlerinden okunan gerilim ve akım(akım gerilim çevirici vasıtası ile) değerlerine bağlı olarak MOSFET’ler sürülmüştür. Böylece gerekli olduğu durumlarda batarya, yük ve PV panel-lerden ayrılarak yük ve batarya korunmuş ve şarj kontrolü yapılmıştır. Sistem, üzerinde bilgi verici olarak bir adet 2×16 karakter LCD bulunup, metal bir kutu içine yerleştirilmiştir.

Şema ve Çalışma Prensibi

Takip eden sayfada Proteus adlı simülasyon programında kurulup simüle edilen devre şeması görülmektedir. PV paneller yerine 20V’luk bir DC gerilim kaynağı bağlanmıştır. PV paneller, batarya ve yükün pozitif kutupları ortak bağlanmış olup, negatif kutupları seri birer MOSFET ile birleştirilmiştir. Negatif (yada toprak) tarafta ayırma yapılmasının en temel nedeni N-kanallı MOSFET kullanılmasıdır.

MOSFET’in iletime geçebilmesi için gate-source arası 12V civarında olmalı, fakat batarya-panel arası bağlı MOSFET’in source ucu en az 12V olacağı için ve panel gerilim maksimum 20V olacağı için iletime geçme koşulu sağlanamamaktadır. Bu nedenle source ucu toprak veya 0V seviyesinde olmalıdır. Böylece maliyet olarak da büyük bir kar sağlanmıştır, çünkü P-kanallı MOSFET’ler üretim zorluğu bakımından 50A gibi büyük akımlarda üretilememektedir, ayrıca yüksek akımlı olanları da çok pahalıdır.

MOSFET’ler PIC portları vasıtası ile birer opto coupler ile sürülmektedir, böylece kontrol ile güç katı birbirinden izole edilmiştir. Gate’lere paralel birer 12V’luk zener bağlanmıştır bundaki amaç yüksek gerilimde gate’lerin zarar görmesini engellemektir.

MOSFET’lere seri bağlı diyotlar ters akımları engellemek için kullanılmıştır. Yani güneş olmadığında bataryadan panellere akım akmaması için. Gerilim ölçme işi 0. analog girişten yapılmıştır. Bataryaya paralel bağlı bir gerilim bölücü ile batarya gerilimi ¼’e indirilmiş ve 5V maksimum kabul edilerek yaklaşık 5mV’luk bir çözünürlükte ölçüm yapılmıştır.

Akım ölçme ise 1. analog girişten yapılmıştır. Yüke seri bağlı bir 0,013ohm/ 15W’lık direnç üzerine düşen gerilim OPAMP ile kuvvetlendirilerek 50A’de maksimum 5V olacak şekilde PIC’e girilmiştir. Yaklaşık 5mV’luk bir çözünürlükte ölçüm yapılmıştır.

LCD, standart bir parça olduğu için şekildeki gibi bağlanmış ve çalıştırılmıştır. Dikkat edilmesi gereken en önemli nokta, kontrast ayarının yapılmış olmasıdır. Sümülasyonda kontrast potansiyometrsine ihtiyaç duymadan çalışmaktadır.

solar sarj regulator devresi

Deney ve Ölçüm Sonuçları

Önceki sayfalarda anlatılan devre şeması gerçekleştirilirken aşağıdaki sorunlar ile karşılaşıldı:

-LCD sürme büyük bir zaman kaybına neden oldu çünkü, var olan standart LCD şemalarında kontrast ucu açıkta bırakılmıştır. Bu uca +Vcc veya GND verilmesine rağmen görüntü alınamamıştır, 10K’lık bir potnsiyometre ile kontrast ayarı yapıldıktan sonra görüntü elde edilmiştir.

-Akım ölçme devresi, yük akımının 0.013ohm’luk direnç üzerinde neden olduğu gerilimi filtreleyip kuvvetlendirerek PIC’in ölçebileceği bir seviyeye getirmektedir. Bu esnada tasarımda öngörülen tek kaynaktan beslemeli OPAMP sorunlar çıkardığı için ek bir gerilim evirici devresi ile çift beslemeli bir amplifikasyon yapıldı. Ayrıca iyi bir hassasiyete sahip olmasına rağmen OPAMP offset nulling’e ihtiyaç duydu.

-PIC ve diğer devreleri beslemek için kullanılan 7805 entegresi, bataryadan beslenmektedir. Fakat saf bir DC gerilim elde edilemediği için devre kararasızlaşmaktaydı. Bunu engellemek için 7805’in çıkışına filtre kapasitesi ilave edildi

-LCD backlight özelliği kullanılmadı, çünkü yüksek akım çekmekte ve 7805’in aşırı ısınmasına neden olmaktaydı.

Devre sorunsuz olarak çalıştırıldıktan sonra kutulandı ve aşağıdaki ölçümler gerçekleştirildi. Tüm ölçümler öğlen saatlerinde (maksimum gün ışığında) ve 39ohm’luk yük bağlı iken yapılmıştır. PV paneller, OST-80 olarak bilinen, 12V(nominal) ve 19V(open circuit) gerilim değerlerine sahip panellerdir, benzer özellikteki BP 380 panelleri altyapı kısmında verilmiştir.

sarj durumu batarya akim

PIC Yazılımı

Aşağıdaki program PIC C ile yazılmış bir programdır ve Hi-Tech PIC C Compiler ile derlenmiştir. Programda geçen alt programlar standart olarak kullanılan ve ulaşılabilir programlar olduğu için burada verilmeyecektir.

*********************************
// solar şarj regülatörü

#include 
#include 
#include 
#include "lcd.h"
#include "delay.h"
#include "serial.h"

// Prototypes
float ReadAdc(unsigned char channel);
void lcd_intro (void);

void giris_olc(void);

// Useful defines
#define LSB(x)	(unsigned char)(*(((unsigned char *)&x)+0))
#define MSB(x)	(unsigned char)(*(((unsigned char *)&x)+1))
#define LWORD(x)	(unsigned int)(*(((unsigned int *)&x)+0))
#define HWORD(x)	(unsigned int)(*(((unsigned int *)&x)+1))
#define clrwdt() asm("clrwdt")
#define	PORTBIT(adr, bit)	((unsigned)(&adr)*8+(bit))
#define	DelayUs(x)	{ unsigned char _dcnt; _dcnt = x; while(--_dcnt != 0){asm("NOP");asm("NOP");} }
#define DelayMS(x)  { unsigned char _dcnt; _dcnt = x; while(--_dcnt !=0) {DelayUs(250);DelayUs(250);DelayUs(250);DelayUs(250);}}

#define SampNum 40
static bit	CO  @ PORTBIT(PORTE, 0);
static bit	CI    @ PORTBIT(PORTE, 1);

float giris0, giris1, giris2, giris3;
float LRV, HVD, RCV, LVD;
unsigned char buff[15];

main (){
// Interrupt settings
GIE = 0;			// Disable all interrupts

// ADC settings
ADCON1=0b10000010;	// right justified, PORTA for A/D , PORTE digital
ADCON0=0x81;		// Fosc/32, CH0, ADON

// PORT settings
PORTA=255;
PORTB=0;
PORTC=0;
PORTD=0;
PORTE=3;
TRISA=0b11111111;
TRISB=0b00000000;
TRISC=0b00000000;
TRISD=0b00000000;
TRISE=0b00000000;
LRV=13;Load Reconnect Voltage(yük bağlama)
HVD=143/10;High Voltage Disconnect(PV ayırma)
RCV=135/10;PV Reconnect(PV bağlama)
LVD=115/10;Low Voltage Disconnect(yük ayırma)
;Yukarıdaki değerler batarya çeşidine göre deyişen ayar noktalarıdır.

lcd_init();
lcd_intro();
lcd_dispmode(4+0+0); // 4:Display on  2:cursor off  1:blink off
DelayUs(220);

while(1)
{
giris0=(ReadAdc(0)*20/1024);
ftoa(giris0,buff);
lcd_clear();
lcd_goto(0);  //1.satır
lcd_dispmode(4+0+0); // 4:Display  2:cursor  1:blink
lcd_puts("E=");
lcd_goto(0x02);
lcd_puts(buff);
lcd_goto(0x06);
lcd_puts("V");
if (giris0<=RCV) {CO=1;}
if (giris0>=HVD) {CO=0;}
if (giris0<=LVD) {CI=0;}
if (giris0>=LRV) {CI=1;}

giris1=(ReadAdc(1)*75/10240);
ftoa(giris1,buff);
lcd_goto(0x08);
lcd_puts("I=");
lcd_goto(0x0A);
lcd_puts(buff);
if (giris1>=30) {CI=0;}
lcd_goto(0x0E);
lcd_puts("A");
lcd_goto(0x40);
lcd_puts("P=");
lcd_goto(0x42);
giris2=giris1*giris0;
ftoa(giris2,buff);
lcd_puts(buff);
lcd_goto(0x47);
lcd_puts("W");
lcd_goto(0x49);
lcd_puts("SOC=%");
lcd_goto(0x4E);
giris3=100*(giris0-LVD)/(HVD-LVD);
ftoa(giris3,buff);
lcd_puts(buff);
DelayMs(250);
DelayMs(250);
DelayMs(250);
DelayMs(250);
lcd_clear();
}
}

float ReadAdc(unsigned char channel){
	unsigned int adcvalue;
	ADCON0 = (channel << 3) + 0x81;	// select channel
	DelayUs(20);					// wait for acquasition time
	ADGO = 1;
	while(ADGO);					// wait for conversion complete
	MSB(adcvalue)=ADRESH;
	LSB(adcvalue)=ADRESL;
	return(adcvalue);
//****************************************** 
}

void lcd_intro (void)
{
	lcd_clear();
	lcd_goto(0);
	lcd_dispmode(4+0+0); // 4:Display  2:cursor  1:blink
	lcd_putsd("      SOLAR");
	lcd_goto(0x40);
	lcd_putsd(" SARJ REGULATORU");
	DelayMs(250);
	DelayMs(250);
	DelayMs(250);
	DelayMs(250);
	lcd_clear();
}
*********************************

Yazılımın yaptığı işi aşağıdaki basamaklarda özetleyebiliriz:

• Ayar noktalarına bağlı olarak MOSFET’leri kontrol eder ve yük ile PV panelleri devreden ayırıp devreye alır.

• Batarya gerilimi ve yük akımını ölçer/okur.

• Yükün çektiği gücü hesaplar.

• Gerilim temelli SOC tahmini yöntemi ile SOC hesaplar.

• Ölçüm ve hesap sonuçlarını anlık olarak LCD’ye yazdırır.

yukarıda özetler verildi projenin tamamı: PIC16F877 IRFZ44 Lcd göstergeli solar şarj regülatörü

Dosya indirme LINK listesi (TXT formatında) link-7859.zip şifre-pass: 320volt.com

  • Kadir

    Paylaşım için teşekkürler bende bu aletin bir benzeri cep telefonu şarj eden var..

  • Semih Alkoç

    Bilgi paylaşıldıkça artar.
    Teşekkürler

  • Kubilayhan

    Merhabalar.

    Ben bu devreyi hayata geçirmeye çalıştım fakat derleyemedim. Derleyebilen arkadaşlar varsa yardım edebilirler mi lütfen.

    • Derleme yaparken bir hata mesajı görünüyormu ? : mesaj nedir ?

  • Kubilayhan

    ftoa komutunu tanımsız algılıyor. Sanırım .h header dosyalarım uyumsuz. Siz derleyebildiniz mi acaba

    • Ben şuan programlama ile uğraşmıyorum (+ bilgim az öğrenemedim :) ) gerekli programlar kurulu değil işi bilen okurlarımız umarım yardımcı olur iyi çalışmalar

  • Kubilayhan

    Teşekkür ederim ben baya bir uğraştım derleyemedim. Baya bir ihtiyacım var bu devreye. Diğer okurlarımız yardımcı olursa çok sevinirim. İyi calişmalar.

    • Biraz araştırdım sanırım aynı sorunu başkalarıda yaşamış belki konu içinde verilen kod işinize yarar header dosyası olabilir

      http://www.sonsivri.com/forum/index.php?topic=8108.0

      /*
      *********************************************************************************************************
      * CONVERT A FLOATING POINT NUMBER TO STRING WITH 1 DECIMAL PLACE
      *
      * Description : This function converts a floating point to a null terminated string
      * with 1 decimal place.
      *
      * Examples:
      *
      * float f = 9.567;
      * ftoa(&s[0], f); //s[]={‘9′,’.’,’5′, 0}
      * float f = -0.189;
      * ftoa(&s[0], f); //s[]={‘-‘, ‘0’, ‘.’, ‘1’, 0}
      * Arguments : ‘unsigned char* buf’ is the pointer to the string holding the conversion result
      * ‘float f’ is the input floating point
      * Returns : Returns the string with unsigned char* buf pointing to.
      * Notes : This routine modified from itoa10() in ..\sample\misc folder of ht-picc
      * If more decimal places required, modify the last section of this code
      * Range of f in (-3,276.7, 3,276.7)
      * This function does print result like 0.0.
      *********************************************************************************************************
      */
      void ftoa(float f, unsigned char *buf, char DecPoint)

      {
      unsigned int rem;
      unsigned char *s,length=0;
      int i;

      i = (int)((float)f*10);

      s = buf;
      if (i == 0) //print 0.0 with null termination here
      {
      *s++ = ‘0’;
      *s++ = ‘.’;
      *s++ = ‘0’;
      *s=0; //null terminate the string
      }
      else
      {
      if (i string = {‘4’, ‘2’, ‘1’}
      while (i)
      {
      ++length;
      rem = i % 10;
      *s++ = rem + ‘0’;
      i /= 10;
      }
      //reverse the string in this for-loop, string became {‘1’, ‘2’, ‘4’} after this for-loop
      for(rem=0; ((unsigned char)rem)<length/2; rem++)
      {
      *(buf+length) = *(buf+((unsigned char)rem));
      *(buf+((unsigned char)rem)) = *(buf+(length-((unsigned char)rem)-1));
      *(buf+(length-((unsigned char)rem)-1)) = *(buf+length);
      }

      /* Take care of the special case of 0.x if length ==1*/
      if(length==1)
      {
      *(buf+2) = *buf;
      *buf = '0';
      *(buf+1) = '.';

      *(s+2)=0; //null terminate
      }
      else
      {
      *(buf+length) = *(buf+length-1); ///== cai nay MOT dec point ==///
      *(buf+length-1)='.';
      *(s+1)=0; //null terminate
      }
      }
      }

      /*

  • nihatkorkaz

    14 senedir 54 watlık bir panelden elektirik üretiyoum ama şu an bir sarj
    regülatörüne ihtiyacım var bilgimde az yardımcı olursanız sevinirim panelim 125 wat 24-18 volt 7.6 amper

  • ayberk

    programda ftao nedir orayı bende çözemedim derleyebilen varsa açıklarsa çok mutlu oluruz

  • ali

    arkadaşlar bende derlemeyi denedim ancak başaramadım. yapabilen varsa bi yardımcı olsun çok ihtiyacım var hemde çok.

  • cumhur

    hocam bunun eleman listesini nasıl elde edebiliriz birde devre çalışmasında bir problem varmı?

  • marco

    hola muy interesante el proyecto pero ay algunos como yo que no podemos compilar el programa no se si puedes subilrlo en HEXADECIMAL mil grasias por su respuesta

  • hakan

    bu devreyi tübitak a katılacağımız projemizde kullanmak istiyoruz devrenin elemanlarına ve baskı devresine ulaşabilirmiyiz ?