dijital güç kaynağı.

Başlatan Erkan Gench, 15 Haziran 2004, 02:13:50

Erkan Gench

merhaba 10mv hassasiyete sahip dijital bir ayarlı gerilim kaynağı yapmak istiyorum. fakat bu cihaz bilimsel bir amaç için kullanılacağından güvenilirliği çok iyi olmalı. ne yazık ki böyle lineer konularda pek deneyimli değilim. devre 0-15 volt olacak.

sormak istediğim şimdilik şu: çıkış geriliminin yüklenmelerden minimum düzeyde etkilenmesini istiyorum bunun için bir hocam opamplı bir komparatör yardımıyla yapılan bir devre göstermişti. meşhur bi teknik olduğundan şemasını göndermiyorum lazım olursa gönderirim. şimdi bu opampın hangi özellikleri iyi olmalı ki mümkün olduğu kadar yüklenmelerden etkilenmesin. veya bu iş için daha iyi bi teknik varmıdır.

şimdilik bu kadar ayrıntılara sonra gireriz sanırım. :)
Zorluklar, zamanında yapmamız gerekip de yapmadığımız kolay şeylerin birikmesiyle oluşur. Henry Ford ----------- Ya Rabbi Filistin'deki ve dünyanın her tarafındaki Müslüman kardeşlerime yardım et.

ete

Bilmiyorum işine yararmı. Ben bir tane yaptım (hatta 2 tane yaptım) sistemin özellikleri şöyle;
- Voltaj 1V ve 0,1V hassasiyetle ayarlanabiliyor (butonla)
- Amper 50 ma ve 1 ma hassasiyetle ayarlanabiliyor.
- Otomatik voltaj kontrolü yapıyor. Yani çıkış voltajını çekilen amperin müsaade ettiği oranda kesin sabit tutuyor. Amper aşılırsa voltajdan kısarak çalışmaya devam ediyor ve bir noktadan sonrada voltajı sıfırlıyor. Yani devreyi koruyor.
- Çalıma aralığı 0-25 V ve 0-1 ile 0-10 Amper (anahtar ile seçimli)
- 1 adet 16x2 LCD displayi var ekranın yarısı volt yarısı amper için kullanılıyor. En güzeli üst sırada ayrladığınız volt ve amper altta ise sistemden çekilen volt ve amper görülüyor. Bana göre mükemmel çalışıyor. Mailinize zip dosyası halinde gönderiyorum. Kutulama ve güç kaynağı ön paneli konusunda bir dizayn yaptım gerçekten şık oldu. Bunun için Word veya Easy-PC programı ile bir panel dizayn ettim (her ikisi ile yaptım ancak Easy-PC olanı kullanıyorum). Bu dizaynı negatif olarak asetata yazdırdım ve yazdırılan tarafı sprey boya ile boyadım. Bunu çift taraflı yapışkan ile kutunun ön yüzüne yapıştırdım. Delikleri delip kullandım. Sonuç gerçekten profesyonel cihazlar gibi oldu.
ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

DumrulBey

Merhaba,

Sanırım LT1491CN işini görecektir. Elektor Dergisi'nde bu op-amp kullanılarak yapılmış bir uygulama vardı. Hatırladığım kadarıyla offset değeri 200..350 mikroVolt arasıydı. (-bkz. Linear Technology) Fakat Türkiye'de bu op-ampı bulman zor. Bildiğim kadarıyla muadili falan da yok. Ancak yurtdışında örnek sipariş verebilirsin.

Başarılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

DumrulBey

Alıntı yapılan: "ete"Bilmiyorum işine yararmı. Ben bir tane yaptım (hatta 2 tane yaptım)
Erol benden önce davrandın...:)

Yaptığın devre daha önce forumda paylaştığın ve benim bahsettiğim Elektor Dergisi'ndeki devrenin biraz değişiydi değil mi? Op-amp olarak LM serisi bir şeymi kullandın, yoksa LT 1491'i buldun mu?

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

cozturk

LM317 işini görmüyor sanırım. çünkü bu 1.26V-37V gibi aralıkta çalışır.  istersen direnci ayarlayıp min ve max. değeri önceden tesbit edebiliyorsun. ayırca çok turlu pot şini görmez ise bir sayıcı  veya pic ile dirençleri anahtarlayıp ince ayar yapabilirsin. Termal koruma vb. zaten var. 1.5A çıkış. Neyse ben bunları söylememiş oliym. belki hassasiyeti senin istediğin sınırları karşılamıyor olabilir.

sezgin05

SMPS tekniği ile yapılmış bir devre son derece hassas regülasyon ve koruma yapıyor.Piyasada 250$ a satılan bir devre: http://groups.yahoo.com/group/PicProjeUP1/files/sezgin05/smps/
@ETE
devreleri groupa upload edersen paylaşımı kolaylaştırır diye düşünüyorum.
Not:brd dosyaları Eagle açıyor

ete

DumrulBey,

LT1491 'i numune olarak istedim 2 adet gönderdiler. Birini yaktım. Diğeri duruyor.
Devre önceden bahsini ettiğim devre. Ancak gerçekten güzel çalışıyor.
Ben LT1491 yerine LM358 kullandım. Bunun için bir kart yaptım ve 2 adet 358'i LT1491 bacaklarına denk geleck şekilde yerleştirip bu kartı LT1491 soketine taktım. Dolayısıyla hem LT1491 hem de LM358 kullanabiliyorum.
Sistemde bazı tadilatlar yapmam gerekti. Bunlardan ilki LM358 off-set voltajı ayarı için LM317 yi ayarlı hale getirdim ve yaklaşık 2,1 V da off-set tuttu. Daha sonra LM358 lerin Besleme bacaklarına 1 adet 2200 Mf kondansatör bağladım. Bunu bağlamaz iseniz güç kaynağını kapattığınız anda bir kaç saniye içinde 25 volt çıkışa veriliyor idi. Sanırım sebebi ana devrede bulunan büyük kondansatör (ben 12.000 Mf bağladım) ve LT1491 de besleme ayaklarında kondansatör olmamasından dolayı kontrolün kaybedilmesi idi. Sonuçta bu arızada düzeldi. Şimdi sistem kusursuz çalışıyor.

ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

salim ALTIN

Merhaba.
Arkadaşlar bu bahsettiğiniz devre elektorun hangi sayısında idi.?  Bukadar hassas olması benimde ilgimi çekti. Yardımınız olursa bende yapmak isterim.
İnsanlar 3 guruba ayrılırlar. 1- Birşeyler yapıp üretmeye çalışan küçük bir gurup. 2- Birşeyler yapanları hayranlıkla ve takdirle izleyen büyük bir gurup. 3- Hiç birşeyden haberi olmadan yaşayan devasa yığınlar....

ete

Tüm bilgileri Yahoo groups'a upload edeyim dedim ama maalesef limit nedeni ile demiyorum. Hatta tek tek zipleyerek yapmama bile müsaade etmedi. Dolayısıyla başka bir yer söylerseniz upload ederim. Değilse isteyene gönderirim.

Her şeyden önce bu devre Elektorun devresi değil. Kumanda kısmı çok benziyor. Hemen hemen aynı ancak ufak tefek farklılıklar var. Elektorun devresi bana çok karmaşık geldi. Bu ise daha basit özellikle PIC 876 kullanımından gelen sadelik var. Aslında sistem Kanada da bir vatandaşa ait. Kendisi ile aksaklıklar konusunda epeyca yazıştık. sonunda adam devreyi sayfasından kaldırdı. Halbuki ben kendisine aksaklıkları açıklamış idim. Bir ara başka bir versiyonunu çıkardı galiba 2-4-8 amperlik sistemler. Ancak ilki istersen 10 ampere kadar çalışıyor. Benim yaptığım 7 amper veriyor ve güzel çalışıyor. Trafom müsait olmadığı için 10 amperi denemedim.

Şu yahooda 20 KB dan büyük dosyaları nasıl upload edeceğiz. Bir bilen var ise lütfen açıklasın. Değilse ben bir türlü bu engeli aşamdım.

ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

aster

@ete,
bir sorun oldu sanırım ama sen
aster@picproje.org a gönder ben hallederim

ete

Tamam aster dosyalar E-Mail'inize gönderilmiştir.

ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

aster

dosyayı buraya koydum
http://groups.yahoo.com/group/PicProjeUP3/files/power.zip
@sevgili ete sorun orada 20kb yer kalmış olması idi o yüzden dosya yükleyemedin. Birde boş klasörlerini sil istersen
dosya yüklerken sağ üst taraftaki download için kalan yer miktarını kontrol ediniz

ete

Arkadaşlar,

Güç kaynağı programı C ile yazılmış ve açık hali aşağıdadır. Aslında programla oynamayı çok isterdim. Ancak hiç C bilmiyorum. Bilen bir arkadaş acaba Pic Basic Pro ya çevirimi konusunda yavaş yavaş da olsa bir şeyler yapabilirmi ?.

ETE

//-------------------------- ALIM 2 -----------------------------------------
//    ALIMENTATION VARIABLE CONSTANT VOLTAGE, CONSTANT COURANT,      0 < 25V
//    2 gammes de courant, 0<1A et 0<10A                         VERSION: 1.3
//         PAR VE2EMM                                              janvier 03
//---------------------------------------------------------------------------
#include <16F876.h>
//#device *=16                        // l'indirect peut aller partout en memoire
#device ADC=16                      // les 10 bits de gauche sont valable
#use delay(clock=20000000)
#fuses HS,NOWDT,PUT,BROWNOUT,NOPROTECT,NOLVP,NOCPD,NOWRT
//#rom 0x2100={0x00,0x00,0x00,0x00,0x00}   // zero les premieres 4 cases du EEDATA

//------------------------- VARIABLES -------------------

int1 flag_low_range;  //  si 1 indique gamme 10A, si 0 indique gamme 1A
INT8 i;                //  0 < + 255
int8 commande;         //  0 < + 255
int8 car;              //  0 < + 255
int8 nibble;           //  0 < + 255
int8 boutons;          //  0 < + 255
int8 bit_status;       //  0 < + 255
//-----------

signed int16 volt_moy[16];
signed int16 amp_moy[16];
signed int16 volt_set=0; // -32768 < +32767
signed int16 volt_lue;     //    "        "
signed int16 amp_set=100;  //    "        "
signed int16 amp_lue;      //    "        "

//------------------------- FONCTIONS ---------------

void pic_ini(void);
void lcd_ini(void);
void write_cmd_lcd(int8);  // LCD
void write_car_lcd(INT8);  // LCD
void send_nibble(int8);    // LCD
void busy_status();        // LCD

void lire_voltage();       // lire et afficher E
void lire_courant();       // lire et afficher I
void lire_PB(); // lire les boutons, changer les consignes de voltage et de courant
void comparer_Iset_Ilue(); // determiner qui est en controle, E ou I

//********************************* MAIN ***********************************

void main(void)
{
   pic_ini();
   lcd_ini();
   for(i=0;i<=15;i++) volt_moy[i]=0;
   for(i=0;i<=15;i++) amp_moy[i]=0;


//------- afficher ecran d"acceuil -------
   write_cmd_lcd(128);      // adresse du debut de la 1 re ligne
   printf(write_car_lcd,"  ALIMENTATION  ");
   write_cmd_lcd(192);      // adresse du debut de la 2 ie ligne
   printf(write_car_lcd,"   PAR VE2EMM   ");
   for(i=0;i<6;i++) delay_ms(250); // laisser affichage 1 1/2 seconde

//---- charger les valeurs du eedata
   for(i=0;i<2;i++) *(&volt_set+i)=read_eeprom(10+i); // reprendre les consignes
   if((volt_set>1023)||(volt_set<0))volt_set=0;
   for(i=0;i<2;i++) *(&amp_set+i)=read_eeprom(12+i);  // du dernier usage
   if((amp_set>1023)||(amp_set<0))amp_set=0;
   flag_low_range=read_eeprom(14); // reprendre l'etat du flag de range

//---- programme principal
   while(true)
   {
      lire_PB(); // lire les boutons et placer les consignes de voltage et de courant
      lire_voltage();       // lire et afficher
      lire_courant();       // lire et afficher
      comparer_Iset_Ilue(); // lire et afficher qui est en controle, E ou I
   }
}

//********************************* FIN MAIN ******************************

//************************************ FONCTIONS *****************************

void pic_ini(void)
{
//-- PORTS
   output_A(0x00);
   #use fast_io(A)
   set_tris_A(0b11011111);
   output_B(0x00);
   port_B_pullups(true);
   #use fast_io(B)
   set_tris_B(0b11111111);
   output_C(0x00);
   #use fast_io(C)
   set_tris_C(0b00000000);
//--- ADC
   setup_adc_ports(RA0_RA1_RA3_ANALOG);
   setup_adc(ADC_CLOCK_INTERNAL);
//--- PWM
   setup_ccp1(CCP_PWM_PLUS_3);
   setup_ccp2(CCP_PWM_PLUS_3);
   setup_timer_2(t2_div_by_16,255,1);
   SET_PWM1_duty(0); // amp_set
   SET_PWM2_duty(0); // volt_set
}

//-------------------------------------------------

void lcd_ini(void)
{
	delay_ms(100);        // attendre que le 5V soit stabilise
   output_bit(PIN_A5,0); // E clock
   output_bit(PIN_C0,0); // R/W  R=1,W=0
   output_bit(PIN_C3,0); // R/S 0 pour commande, 1 pour data
	for(i=1;i<=4;i++) {send_nibble(0x30); delay_ms(5);} // reset du LCD
   send_nibble(0x20);    // interface 4 bits
   delay_us(43);
	write_cmd_lcd(0x28);  // interface 4 bits, 5X7
   write_cmd_lcd(0x08);  // display off
	write_cmd_lcd(0x0C);  // display on
	write_cmd_lcd(0x06);  // increment no display shift
}

//*********************** Fonctions du LCD *****************************

void write_cmd_lcd(commande)
{
   busy_status();          // LCD pret?
   output_bit(PIN_C3,0);   // R/S 0 pour commande
	send_nibble(commande);  // placer commande dans LCD
   swap(commande);
   send_nibble(commande);  // placer commande dans LCD
}

//-------------- afficher un caractere sur le LCD --------------------------

void write_car_lcd(car)
{
   busy_status();         // LCD pret?
   output_bit(PIN_C3,1);  // R/S 1 pour data
	send_nibble(car);      // placer commande dans LCD
   swap(car);
   send_nibble(car);      // placer commande dans LCD
}

//-------------------- Envoyer un nibble ----------------

void send_nibble(nibble)
{
   output_bit(PIN_C0,0);  // R/W  R=1, W=0
	output_bit(PIN_A5,0);  //  E line low
   delay_cycles(3);
	output_bit(PIN_A5,1);  // pulser E high
   nibble=nibble&0xF0;    // vider les 4 bits du bas de la byte
   nibble=nibble|(input_C()&0x0F); // charger C0-C3
   output_C(nibble);
   delay_cycles(3);
   output_bit(PIN_A5,0);  // E low
}

//-----------------------

void busy_status() // tester si le LCD est pret a accepter un data
{
   do
   {
      set_tris_C(0b11110000);
      output_bit(PIN_A5,0); // E off
      output_bit(PIN_C0,1); // R/W  R=1,W=0
      output_bit(PIN_C3,0); // R/S 0 pour commande, 1 pour data
      delay_cycles(3);
      output_bit(PIN_A5,1); // pulser E high
      delay_cycles(3);
      bit_status=input_C()&0X80; // lire status
      delay_us(2);
      output_bit(PIN_A5,0); // E off
      delay_cycles(3);

      output_bit(PIN_A5,1); // pulser E high
      delay_us(1);          // faire semblant de lire les 4 bits de status du bas
      output_bit(PIN_A5,0); // E off
      delay_cycles(3);

   }
   while(bit_status==0x80);
   set_tris_C(0b00000000);
}

//***************************** Fin des fonctions LCD ********************************

void lire_voltage()           // lire et afficher
{
      SET_ADC_CHANNEL(0);
      delay_ms(1);
      for(i=15;i>=1;i--) volt_moy[i]=volt_moy[i-1];
      volt_moy[0]=READ_ADC()/64; // tasser a droite la lecture dans les 2 bytes, 6 bits
      volt_lue=0;
      for(i=0;i<=15;i++) volt_lue=volt_lue+volt_moy[i];
      volt_lue=volt_lue/16;
      volt_lue=volt_lue+2;// compenser pour le restant de la division a l'affichage
      //if(volt_lue<=7)volt_lue=0;
      write_cmd_lcd(203);     // adresse du debut de la 2ie ligne
      printf(write_car_lcd,"%02ld,%1ldV",volt_lue/40,volt_lue/4);
}

//----------------------------

void lire_courant() // lire et afficher, tester si I depasse la limite et est en controle
{
      SET_ADC_CHANNEL(1);
      delay_ms(1);
      for(i=15;i>=1;i--) amp_moy[i]=amp_moy[i-1];
      amp_moy[0]=READ_ADC()/64; // tasser a droite la lecture dans les 2 bytes, 6 bits
      amp_lue=0;
      for(i=0;i<=15;i++) amp_lue=amp_lue+amp_moy[i];
      amp_lue=amp_lue/16;
      amp_lue=amp_lue+1;
      write_cmd_lcd(192);    // adresse du 3/4 de la 2ie ligne
      if(flag_low_range!=0)printf(write_car_lcd,"%02ld,%02ldA",amp_lue/100,amp_lue);
      else printf(write_car_lcd,"%01ld,%03ldA",amp_lue/1000,amp_lue);
}

//----------------------------

void lire_PB() // lire les boutons et setter voltage et le courant
{
   boutons=input_b();
   if(boutons!=0xFF)
   {
      switch(boutons)
     {
         case 0b01111111:      // grande reduction du courant *************
            volt_set=volt_set-40;
            if(volt_set<=0) volt_set=0;
            break;
        case 0b10111111:      // grande reduction du voltage
            amp_set=amp_set-50;
            if(amp_set<=0) amp_set=0;
            break;
         case 0b11011111:      // grande augmentation du courant **********
            volt_set=volt_set+40;
            if(volt_set>=1000) volt_set=1000;
            break;
         case 0b11101111:      // grande augmentation du voltage
            amp_set=amp_set+50;
            if(amp_set>=1000) amp_set=1000;
            break;
         case 0b11110111:      // petite augmentation du courant **********
            volt_set=volt_set+4;
            if(volt_set>=1000) volt_set=1000;
            break;
         case 0b11111011:      // petite augmentation du voltage
            amp_set=amp_set+1;
            if(amp_set>=1000) amp_set=1000;
            break;
         case 0b11111101:      // petite reduction du courant *************
            volt_set=volt_set-4;
            if(volt_set<=0) volt_set=0;
            break;
         case 0b11111110:      // petite reduction du voltage
            amp_set=amp_set-1;
            if(amp_set<=0) amp_set=0;
            break;
         default:              //  plus qu'un bouton pese
            break;
      }
      for(i=0;i<2;i++) write_eeprom(10+i,*(&volt_set+i));
      for(i=0;i<2;i++) write_eeprom(12+i,*(&amp_set+i));
      delay_ms(350);           // taux de repetition
   }

   if(flag_low_range<!input(pin_A2))// tester la swich 0-10A   0-1A  et changer la gamme
   {
      flag_low_range=!input(pin_A2);
      amp_set=amp_set/10;
      write_eeprom(14,flag_low_range);
      for(i=0;i<2;i++) write_eeprom(12+i,*(&amp_set+i));
   }
   if(flag_low_range>!input(pin_A2))
   {
      flag_low_range=!input(pin_A2);
      amp_set=amp_set*10;
      if(amp_set>1000)amp_set=1000;
      write_eeprom(14,flag_low_range);
      for(i=0;i<2;i++) write_eeprom(12+i,*(&amp_set+i));
   }

   write_cmd_lcd(128);      // adresse du debut de la 1ere ligne
   if(flag_low_range>0)printf(write_car_lcd,"%02ld,%02ldA SET %02ld,%1ldV",amp_set/100,amp_set,volt_set/40,volt_set/4);
   else printf(write_car_lcd,"%01ld,%03ldA SET %02ld,%1ldV",amp_set/1000,amp_set,volt_set/40,volt_set/4);
   SET_PWM1_duty(amp_set);  // amp_set
   SET_PWM2_duty(volt_set); // volt_set
}

//-------------------------------

comparer_Iset_Ilue()
{
   write_cmd_lcd(198);  // milieu de la 2ie ligne
   if (amp_lue<(amp_set-1)) printf(write_car_lcd," >>> ");
   else printf(write_car_lcd," <<< ");
}

//******************************** Fin des fonctions **************************************
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Erkan Gench

arkadaşlar hepinize teşekkürler gönderdiklerinizi inceliyeceğim. daha sonra ayrıntıları yazarım.
Zorluklar, zamanında yapmamız gerekip de yapmadığımız kolay şeylerin birikmesiyle oluşur. Henry Ford ----------- Ya Rabbi Filistin'deki ve dünyanın her tarafındaki Müslüman kardeşlerime yardım et.

aster

kitaplara bakarken sgs nin kendi kitabında (sırf onu anlatmış)
L4970 buldum 0-25 volt 10 amp switching regülatör tek başına
üstelik soft start ve 2 tane olunca senkron çalışıyor

valla sizi bilmem ama ben 0-230 volt 15 amp lik kaynak kullanıyorum
çokta memnunum ve sade hiç teferruatı da yok tek sorun ağırlığı  :lol: