MikroC kullanarak gecikme açısı verme

Katılım
12 Ağu 2015
Mesajlar
21
Puanları
1
Yaş
30
Merhaba arkadaşlar

Ben zerocross devresinden aldığım sinyalin, pic16f877a ya yazdığım kod ile sıfır geçişlerini bulup sonra da ADC yaparak Potansiyometre yardımı ile gecikme vermek istiyorum ve böylece 2 scr 3 diyot modülü (vhf36-16ı05) tetikleyerek DC motorun hızını kontrol etmek istiyorum. Projemi proteus ta sounsuz bir şekilde çalıştırıyorum. yani şöyle açıklayayım, Zero cross dan aldığım sinyali pic16f877a ya okutup pot yardımı ile gecikme verebiliyorum, ayrı bir devrede de BT151 tetikliyorum. 2scr 2 diyot kurduğum devreyi de tetikliyorum.
Fakat bu devrelerden mikroişlemci kullanıp gecikme verdiğim devreyi breadrboarda kurduğumda osiloskopta hiçbir sinyal göremiyorum, aynı zamanda bt151 tetiklediğim devrede de SCR belli bir süre iletimde gözüküp yarım dalga doğrulturken belli bir süre sonra da sinyal gözükmüyor yani bir süre sonra kendi kendine kesime gidiyormuş gibi oluyor. Bunun nedenini kullandığımız yük olarak düşünüyoruz. Bu devrede yük beyaz led ve 1k direnç kullanmıştık bu sonucu elde etmiştik. Aynı devreyi akkor lamba kullanarak tekrar deneyip sağlıklı sonuç alacağımızı umuyoruz fakat yazılım kısmında, yani pic16f877a da ki sorunumuzun neden kaynaklandığını anlayamadık.
Bu konu hakkında tavsiye verip yardımcı olabilecek birileri var mı acaba ? Yazılımda mı devrede mi ? nerde sıkıntımız var yardımcı olabilir misiniz ? Teşekkürler

çalışmalarımız ektedir
 

Ekli dosyalar

  • proje calısmaları.zip
    155.8 KB · Görüntüleme: 5
kodu açamayanlar için kod

long int veri=0;
float voltaj=0,gerilim=0;
unsigned char FlagReg;
sbit ZC at FlagReg.B0;

void interrupt(){
if (INTCON.INTF){ //kesme oluşması için INTCON.INTF bayrağı kaldırdı
ZC = 1;
INTCON.INTF = 0;

if (ZC){ //zero crossing oluştu
Vdelay_ms(gerilim); // gerilim değerine göre gecikme zamanı

PORTD.f0 = 1;
delay_us(100); //100us pulse göndersin POZİTİF ALTERNANSDAKİ SCR Yİ TETİKLEMEK İÇİN
PORTD.f0 = 0;
delay_us(9000); //iki scrnin tetiklenme sürelerinin farkı
PORTD.f1 = 1;
delay_us(100); //100us pulse göndersin NEGATİF ALTERNANSDAKİ SCR Yİ TETİKLEMEK İÇİN
PORTD.f1 = 0;
ZC = 0;
}
}
}

void main() {
TRISA= 0b00000100; // potansiyometre girişi
TRISD = 0b11111100; // RD0 ve RD1 is output
TRISB = 0x01; //RB0 giriş yapıldı
OPTION_REG.INTEDG = 1; //yükselen kenarda tetikleme
INTCON.INTF = 0; // INT bayrağını sil
INTCON.INTE = 1; //Rb0 KESMESİNE MÜSADE ET
INTCON.GIE = 1; //BÜTÜN KESMELERE MÜSADE ET
adcon0=0b10010000; // kanal2(AN2)seçildi.
adcon1=0b10000010; // 5 analog,3 dijital uç olacak şekilde ayarlandı

do
{
veri=ADC_Read(2); //Kanal 2 seçildiğinde ADC_Read(2) olur.
voltaj=(0.004887586*veri);
gerilim=11*voltaj; // Gerilim bölücüyle 11 kat gerilimi küçültük.Yazılımla 11 kat büyütüyoruz.


}
while(1);
}
 
kodu açamayanlar için kod
voltaj=(0.004887586*veri);
gerilim=11*voltaj; // Gerilim bölücüyle 11 kat gerilimi küçültük.Yazılımla 11 kat büyütüyoruz.
}while(1);
}

Bu kısımdaki 0.004887586 sayısını nasıl buldunuz?

50Hz AC için max gecikmeniz 9ms olabilir.

Vdelay_ms(gerilim) değerine giren parametre ms cinsinden ise

9/11 = 0,818
0,818 / 0.004887586 = 167,
ADC 10bit, Yani 1023 değeri üretebilir. Ama ADC den 167 den büyük bir değer dönerse diğer alternansa, hatta sonraki peryotlara kadar beklersiniz.

Birde kesme bayrağını kesmenin en başında sıfırlıyorsunuz.
Yani gecikme olması gereken den daha uzun sürerse, daha kesmeden çıkmadan yeni kesmeler gelebilir. Bu da stack taşması ve tetiklemenin saçmalaması demek.

Diğer bir konuda Pot açısı ile orantılı bir gerilim elde etmek istiyorsanız, RMS hesabına girmeniz gerektiği.
Tam tamına bir hesap yapmaktansa Voltaj-zaman hesabı için 20-30 adımlı bir lookup tablosu kullanabilirsiniz.
 

Merhaba İsmail Bey

Öncelikle vakit ayırıp ilgilendiğiniz için çok teşekkür ederim. Bahsettiğiniz değer 5v/1024 sayısından elde ediliyor bunu da internetten yaptığımız araştırmalar sonucu buduk. Sonraki periyotlara kadar beklersiniz demişsiniz ama yukarıda ki mesajda dediğim gibi Proteus ta sorunsuz çalıştırdığım için sanki bu ihtimal daha zayıf gibi geldi bana.

Kesme bayrağını sıfırlama konusu ise yine benzer örneklerde yazılan kodlarda durum bu şekildeydi, burda ki algoritmayı nasıl düzenleyebileceğimiz konusunda pek bir bilgim yok açıkcası.
Elinizde bahsettiğim projeye dair örnekler varsa - yazılım dili farketmeksizin - yardımcı olabilir misiniz ?

Teşekkürler
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…