pid kontrol sıcaklık deney seti

Başlatan ismailhtc, 02 Aralık 2013, 10:17:12

ismailhtc

arkadaşlar resimdeki gibi isis de programımı çizdim. fakat triyağı bir türlü süremedim.sıfır geçiş noktasını alıyorum. Sonra bunu picde ayarlayıp açısını belirliyorum. picin 18. bacağından istediğim çıkışı alıyorum. fakat moc3021 ve triyak kısmında istediğimi alamıyorum. şebeke gerilimi istediğim noktadan kırpmıyor. direk olarak sinüs veriyor. nedeni ne olabilir yardımcı olursanız sevinirim.
isis dosyası linktedir
https://www.dropbox.com/s/epf763gghfd2vwt/s%C4%B1cakl%C4%B1k%20son%20%C3%A7izim.DSN?n=242394058
kodlar da bu linktedir.
https://www.dropbox.com/s/vdd1xiwbvxg1gzr/s%C4%B1cakl%C4%B1k.cof


muhittin_kaplan

merhaba, ac deki 0 ı nasıl anlıyorsun ?

z

Alıntı yapılan: muhittin_kaplan - 02 Aralık 2013, 10:45:00
merhaba, ac deki 0 ı nasıl anlıyorsun ?

Q1üzerinden.

D2-D4 Çıkışından GNY'ye bir direnç bağla. Aksi takdirde buradaki voltaj C18 den dolayı DC ofsete sahip olur.

D2-D4 çıkışını gözleyerek U78 1 pinine gelen pasların konumuna scopla baktın mı? Sıfır dedektörün sorunsuz çalışıyormu?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

peki q1 deki ac ile triyak üzerindeki ac nin fazları aynı mı ?

z

Bir miktar faz kayıklığı oluşur. Fakat bunu yazılımsal olarak kompanze etmek çok kolay.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ismailhtc

#5
evet sıfır noktasını sorunsuz alıyorum.  fazlar da aynı o noktada da sıkıntı yok ama  moc3021 ile triyacık tetiklemesi çalışmıyor.  pempe olan triyağın tetikleme ucu. mavi olan da moc3021 1 nolu ucu (pulse girişi)
http://imageshack.us/photo/my-images/443/p2od.png/



z

R543 R243 değerleri yüksek kalmış olabilir. Kullandığın triac'ın tetikleme akımı yüksek olabilir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

gtekdemir

Alıntı yapılan: ismailhtc - 02 Aralık 2013, 10:17:12
arkadaşlar resimdeki gibi isis de programımı çizdim. fakat triyağı bir türlü süremedim.sıfır geçiş noktasını alıyorum. Sonra bunu picde ayarlayıp açısını belirliyorum. picin 18. bacağından istediğim çıkışı alıyorum. fakat moc3021 ve triyak kısmında istediğimi alamıyorum. şebeke gerilimi istediğim noktadan kırpmıyor. direk olarak sinüs veriyor. nedeni ne olabilir yardımcı olursanız sevinirim.

Direk sinüs veriyorsa triyak hiç kesime gitmiyor demektir. Bülent hocanın dediği gibi R543 direnç değeri yüksek olabilir. Triyak çıkış kısmını sadeleştirerek ve mcu kısmını ayırıp öyle deneyebilirsiniz.

run

3021 üzerinde zero cross dedektör var onun için
yerine 3051 gibi zero cross dedektör olmayanlarından kullanırsan çözülür
özgürlük için teknoloji

ismailhtc

Alıntı yapılan: run - 03 Aralık 2013, 10:41:52
3021 üzerinde zero cross dedektör var onun için
yerine 3051 gibi zero cross dedektör olmayanlarından kullanırsan çözülür

hepinize teşekkür ediyorum ilgilendiğiniz için. birde 3051 'i deniyim. İnşallah bu halledebilirm

run

#10
Alıntı yapılan: run - 03 Aralık 2013, 10:41:52
3021 üzerinde zero cross dedektör var onun için
yerine 3051 gibi zero cross dedektör olmayanlarından kullanırsan çözülür

3021 i 23 ile karıştırdım yanlışlık oldu
boşuna 3051 aramayın 


mesaj birleştirme:: 04 Aralık 2013, 17:42:23

Alıntı yapılan: z - 02 Aralık 2013, 11:32:05
Q1üzerinden.

D2-D4 Çıkışından GNY'ye bir direnç bağla. Aksi takdirde buradaki voltaj C18 den dolayı DC ofsete sahip olur.

D2-D4 çıkışını gözleyerek U78 1 pinine gelen pasların konumuna scopla baktın mı? Sıfır dedektörün sorunsuz çalışıyormu?

Bunu yaptıktan sonra +

sıfır geçişi sorunsuz almışsın
sıfır geçişten sonra tetiği orta noktalara getirip denermisin (5ms gibi).
diğer sıfır geçişe çok yakın tetiklediğin için de gerçek uygulamada sürekli iletim gibi bir sorun oluyor olabilir. Başıma gelmişti
özgürlük için teknoloji

F.T

opto şase ayağı ile ac neden birbirine bağlı onu anlayamadım?
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ismailhtc

Alıntı yapılan: run - 04 Aralık 2013, 17:33:36
sıfır geçişi sorunsuz almışsın
sıfır geçişten sonra tetiği orta noktalara getirip denermisin (5ms gibi).
diğer sıfır geçişe çok yakın tetiklediğin için de gerçek uygulamada sürekli iletim gibi bir sorun oluyor olabilir. Başıma gelmişti

denedim ama timestep to small hatası veriyor sürekli.
Alıntı yapılan: F.T - 04 Aralık 2013, 18:32:14
opto şase ayağı ile ac neden birbirine bağlı onu anlayamadım?

optonun 2. bacağımı oluyor acaba şase ayağı. tam anlayamadım ya aslında

ismailhtc

arkadaşlar kodu bu hale getirdim fakat şöyle bi sorun oluyor. pin_c3 bacağından karışık bi sinyal alıyorum. istediğim şekilde vermiyor. yani 10 ms de bir pulse vermesi gerekirken çok fazla pulse veriyor kararlı çalışmıyor. anlıyamadım. kodlardaki hatayı çözemedim

/******************************************************
*******************************************************/
#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use fast_io(a) //Port yönlendirme komutları A portu için geçerli
#use fast_io(c)
#define menu pin_a0
#define arttir pin_a1
#define azalt pin_a2
#define ayarlar pin_a3
#define use_portb_lcd TRUE   
#include <lcd.c>   

float sayi=0; // Tamsayı tipinde değişken tanımlanıyor
unsigned int adeger ;
unsigned int anlik,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10;
float litrem=0 ;
float i ;
float a,Puldarbe ;
long int set1,set2,darbe,litre ;


//****************** Timer0 Kesmesi *****************************

#int_timer1
void timer1_kesme ()
{
set_timer1(63036) ;
i=i+1;
            if (i==10)
   {
   a1=adeger ;
   adeger=0;
}  
            if (i==20)
   {
   a2=adeger ;
   adeger=0;
}  
            if (i==30)
   {
   a3=adeger ;
   adeger=0;
}  
            if (i==40)
   {
   a4=adeger ;
   adeger=0;
}  
            if (i==50)
   {
   a5=adeger ;
   adeger=0;
   i=0 ;
}

}

#int_timer0  // Timer0 kesmesi
void  timer0_kesme ()   // Kesme fonksiyonu ismi
{
      set_timer0(255);   // TMR0 değeri belirleniyor
       sayi=sayi+1;
       adeger=adeger+1 ;     
}
/********* ANA PROGRAM FONKSİYONU********/

void main ( )
{
anlik=0 ;
set1=read_eeprom (0) ;
set2=read_eeprom (1) ;
litre=read_eeprom (2) ;
darbe=read_eeprom (3) ;
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_a(0b00011111); 
   set_tris_c(0x00);
   output_c (0x00) ;

   
 
while(1)   // Sonsuz döngü
   {

   
///--------------------kontak çıkışı----------------///
  if(set1<=litrem)
    {
  output_low (pin_c2) ;
   }
  if(set1>litrem)
    {
  output_high (pin_c2) ;
   }
  if(set2<=anlik)
      {
  output_low (pin_c3) ;
   }
  if(set2>anlik)
        {
  output_high (pin_c3) ;
   }
///--------------------------------------------------///  
///--------------------reset atma-------------------/// 
   if (input (arttir))
         {
   delay_ms(200);
   a=6;
 }
   while (a==6)      
 {
   if (input (azalt))
      {
   delay_ms(300);
  sayi=0;
  anlik=0 ;
 }

 a=0 ;
}
///--------------------------------------------------///   

///--------------------ayarlar/menü-------------------///         
   if (input (ayarlar))
      {
   delay_ms(200);
   a=3 ;
 }
   if (input (menu))
   {
   delay_ms(400);
   a=1 ;
     }
while (a==1)
   {
   if (input (arttir))
    {
   delay_ms(150);
   set1=set1+1 ;

   }
   if (input (azalt))
       {      
   delay_ms(150);
   set1=set1-1 ;
   }
   
   write_eeprom(0,set1) ;
   if (input (menu))
      {
   delay_ms(200);
   a=2 ;
}   
   if (input (ayarlar))
      {
   delay_ms(200);
   a=3 ;
 }
        printf(lcd_putc,"\f----MENU-----"); 
        printf(lcd_putc,"\nSET1=%Lu",set1); 
        delay_ms(50);  
  }
while (a==2)
   {
   if (input (arttir))
    {
   delay_ms(150);
   set2=set2+1 ;
   }  
   if (input (azalt))
       {
   delay_ms(150);
   set2=set2-1 ;
   }
   write_eeprom(1,set2) ;
   if (input (menu))
   
{
   delay_ms(200);
   a=0 ; 
}   
   if (input (ayarlar))
      {
   delay_ms(200);
   a=3 ;
    }

        printf(lcd_putc,"\f----MENU-----"); 
        printf(lcd_putc,"\nSET2=%Lu",set2); 
        delay_ms(50);  
  }
while (a==3)
      {
   if (input (arttir)) 
    {
   delay_ms(150);
   litre=litre+1 ;
   }
   if (input (azalt))
       {
   delay_ms(150);
   litre=litre-1 ;
   }
   write_eeprom(2,litre) ;
   if (input (menu))
   {
   delay_ms(200);
   a=4 ;
}   
        printf(lcd_putc,"\f-AYAR-pulse/litre"); 
        printf(lcd_putc,"\nlitre=%Lu",litre); 
        delay_ms(50); 
     }
while (a==4)
      {
   if (input (arttir)) 
    {
   delay_ms(75);
   darbe=darbe+1 ;
   }
   if (input (azalt))
       {
   delay_ms(75);
   darbe=darbe-1 ;
   }
   write_eeprom(3,darbe) ;
   if (input (menu))
   {
   delay_ms(200);
   a=5 ;
}   
        printf(lcd_putc,"\f-AYAR-pulse/litre"); 
        printf(lcd_putc,"\npulse=%Lu",darbe); 
        delay_ms(50); 
     }
///--------------------------------------------------/// 
///--------------------ekrana yazdırma-------------------///


        anlik=a1;
        anlik=anlik+a2;
        anlik=anlik+a3;
        anlik=anlik+a4;
        anlik=anlik+a5;

        Puldarbe=darbe/litre  ;
        litrem= sayi/Puldarbe ; // kaç litre geçtiğini hesaplar
        lcd_init();
        printf(lcd_putc,"\flitre=%.3f",litrem); 
        printf(lcd_putc,"\nanlik=%u",anlik); 
        delay_ms(150);
///--------------------------------------------------///
///--------------------kesme ayarları-------------------///
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
   set_timer1(63036) ;
   enable_interrupts(INT_timer1);
   enable_interrupts(GLOBAL);     // Aktif edilen kesmelere izin ver

   setup_timer_0(RTCC_EXT_H_TO_L | RTCC_DIV_1); // Timer0 ayarları yapılıyor
   set_timer0(255);   // TMR0 değeri belirleniyor
   enable_interrupts(INT_timer0); // int_timer0 kesmesini aktif yapar
   enable_interrupts(GLOBAL);     // Aktif edilen kesmelere izin ver  
   ///--------------------------------------------------///
 }
 }