dimmer yapmak istiyorum

Başlatan bunymert, 17 Şubat 2014, 14:04:37

bunymert

dimmer devresi yapmak istiyorum fakat bu yazdığım kod çalışmadı bord üzerinde nerde yanlış yapıyorum acaba yardımcı olur musunuz?

#include <16f628 dim.h>
#use fast_io(a)
#use fast_io(b)
int i=0;
#INT_EXT
void  EXT_isr(void)
{
delay_us(1);
output_high(pin_a2);
delay_us(200);
output_low(pin_a2);
}

void main()
{

   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);

   ext_int_edge(H_TO_L);
set_tris_a(0x00);
set_tris_b(0xff);
   while(TRUE)
   {
     
    if(input(pin_b4))
    i=600;
    else if(input(pin_b5))
    i=900;
    else if(input(pin_b6))
    i=1500;
    else if(input(pin_b7))
    i=2000;
    else
    i=0;
    output_high(pin_a3);
    delay_ms(500);
output_low(pin_a3);
   }
}

MrDarK

Devre şemanı ekle ; Ayrıca kod üzerinde mantık hatası var gibi geldi bana ama yinede şemayı gördükten sonra değerlendirmek daha doğru.

Epey amatör bir kod :) İnterrupt içinde delay...

Picproje içinde bu tarz dimmer konuları mevcut ; zerocross detection devreleri ve moc entegrelerini incelemeni öneririm. Önce olayını mantığını kavramak önemli bence. Sence ? Yoksa bu kodla devren çalışsa sen onu anlamadıktan sonra bir faydası var mı ?

Cevaplar senin buyur (:
Picproje Eğitim Gönüllüleri ~ MrDarK

bunymert



resimi gönderdim devrede bi hata yok sanırım. ben hatanın kodda olduğunu düşünerek hiç resim yüklemek aklıma gelmedi. sıfır noktasını bulduktan sonra delay kullanmadan nasıl gecikme sağlıyacaz anlamadım. kod yazmada acemiyim nerde hata var bi yardımcı olursanız sevinirim. swiçleri gecikme için kullandım voltaj ayarı için, ledi de devrenin çalışıp çalışmadığını anlamak için

bunymert

delay_us(1);
output_high(pin_a2);
delay_us(200);
output_low(pin_a2);

delay_us(1); deki 1  i olacak

skara1214

Alıntı yapılan: bunymert - 18 Şubat 2014, 16:55:30

resimi gönderdim devrede bi hata yok sanırım. ben hatanın kodda olduğunu düşünerek hiç resim yüklemek aklıma gelmedi. sıfır noktasını bulduktan sonra delay kullanmadan nasıl gecikme sağlıyacaz anlamadım. kod yazmada acemiyim nerde hata var bi yardımcı olursanız sevinirim. swiçleri gecikme için kullandım voltaj ayarı için, ledi de devrenin çalışıp çalışmadığını anlamak için
timer kur ve bekleme yapmak istediğin süre kadar while da beklet mesela;(prescale falan ayarladın varsayıyorum);
set_timer1(0);
while(get_timer1()<500);
Herkes ölür ama herkes gerçekten yaşamaz

mur@t

Proteus'da düzgün çalışacağını sanmıyorum.
triac süreceğiniz uca skop bağlayın, skop'un diğer kanallarına da, sıfır geçiş sinyalini ve AC sinyali bağlayın.
Kodunuzu bu şekilde test edin/düzeltin.

Sıfır geçişini interrupt ile yakalayıp, gerekli gecikme ve tekitlemeyi yapmalısınız.
Sıfır geçişinden sonra, bir dahaki sıfır geçişine kadar 10ms zaman var, bu süre içinde, istediğiniz parlaklığa göre tetikleme yapacaksınız.

Linkteki zero cross ve triac devresi test edilmiştir.

http://skyblg.wordpress.com/2013/02/27/220v-ac-dimmer-2/

skara1214

Alıntı yapılan: mur@t - 18 Şubat 2014, 22:01:50
Linkteki zero cross ve triac devresi test edilmiştir.
zero cross detection circuitteki 10 uf nin voltajı nedir?
Herkes ölür ama herkes gerçekten yaşamaz

mur@t

Kondansatör uçlarında 6-7volt gibi bir gerilim ölçmüştüm.
Yüksek voltajda bir kondansatöre gerek yok.



LukeSkywalker

http://www.microchip.com/forums/download.axd?file=0;603904&where=msg
Buradaki zero crossing dedectoru kullanıyorum. Tek fark 330K yerine 33K 3W kullanmam. Direnç değeri azaldıkça algılama süresi azalır.

bunymert

#include <yeni dim.h>
#use fast_io(a)
#use fast_io(b)

int i=0;//denemek için gecikmeyi ellen yazıyorum
#INT_EXT
void  EXT_isr(void)
{Set_Timer0(i);
enable_interrupts(INT_TIMER0);
   
 
}

#INT_TIMER0
void  TIMER0_isr(void)
{
disable_interrupts(INT_TIMER0);
Set_Timer0(i);
output_high(pin_a2);//triac tetiklemesi
delay_us(100);
output_low(pin_a2);


}

void main()
{  ext_int_edge(L_TO_H);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_TIMER0);
   Set_Timer0(i);
   
   set_tris_a(0x00);
set_tris_b(0xff);
   while(TRUE)
   {
   
    }
   }

}

arkadaşlar kodu bu şekilde değiştirdim fakat gecikme değerini (i) neyaparsam yapayım sıfır noktasında triak tetiklemesi veriyor yani gecikme hiç olmuyor problemi anlayamadım. 628 in içindeki kristali kullanıyorum ondan olabilir mi acaba. devre yurarıdakinin aynısı.