B

pid kontrol sıcaklık deney seti

Başlatan bagci22, 02 Aralık 2013, 10:12:08

bagci22

arkadaşlar resimdeki gibi isis de programımı çizdim. fakat triyağı bir türlü süremedim. ş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

kodlar da bu linktedir.
https://www.dropbox.com/s/vdd1xiwbvxg1gzr/s%C4%B1cakl%C4%B1k.cof

Elzemefe

#1
Tetikleme açısı  için referans işareti alman gerekiyor .
Ayrıca  yük nerde  göremedim
50 hz lik sinüs sinyalinden referans  tetikleme sinyali alıp zeroo cross
noktalarına  göre açı hesabı yapıp  ona göre sürmen gerekiyor...

https://www.google.com.tr/search?q=zero+cross&source=lnms&tbm=isch&sa=X&ei=mDeeUsXPFYO04ASto4GICQ&ved=0CAkQ_AUoAQ&biw=1152&bih=664

http://pcbheaven.com/wikipages/Dimmer_Theory/

http://etepic.com/index.php/topic,190.0.html

bagci22

#2
yok devredeki tristörün kollektöründen sıfır noktasını tespit ediyorum fakat triyak kısmında problemim var. sıfır noktası tespit ettikten sonra  gecikmeyide ekledikten sonra moc3021 e gönderiyorum gönderiyorum ama moc3021 triyağı süremiyor.yük olarak ta bi direnç bağladım sadece

Elzemefe

#3
Osilaskop bağlayıp besleme kaynağı  ile tetikleme ve sürme sinyallerini bir karşılaştır  istersen ...
MOC3021 zero cross var 3051  kullan çünkü tetikleme zamanına sen  karar vereceksin..

ete

Bu tür sorunlar genelde yazılım kaynaklıdır. En azından tristörü sürdüğün kısmını buraya yazasan soruna daha kolay cevap bulabilirdin. Devrende bir sorun gözükmüyor. Sııfr noktasını Q1 Collectürnden aldığın sinyal ile PortB.0 kesmesi yaratarak buluyorsun. Kesme oluştuğu anda yapılacak iş şöyle olmalıdır
- Kırpma süresikadar bekle (bu süre her ne kadar 10ms dolayında isede komut gecikmeleri nedeni ile genelde 9800 us dolayında kabul edilir.
- Triac  tetiklenir  (Triac=1)
- yaklaşık 100 us bekelnip Triac tekrar kapatılır (Triac=0)
- Bayrak sıfırlanır
- Kesmeden çıkılır.
Muhtemelen sen triacı tetikledikten sonra tekrar tetik sinyalini kapatmıyorsundur. Durum böyle ise Triac sürekli iletimde kalır. Biliyorsun triac bir kere tetiklendimi sen tetik ucunu kapatsanda iletimde kalır. Ancak ilk sıfır noktasında giriş ile çıkış arasındaki potansiyel farkı sıfır olduğu için kendiliğinden kesime gider.

Ete

bagci22

#5
Hocam kodlar bunlar. 3051' alıp birde öyle deniyeceğim sorunun 3021 den kaynaklandığını düşünmeye başladım. çünkü tetikleme 100 ms kadar sürüyor sonra sıfırlanıyor. ama  moc3021 işlem yapmıyor. Elzemefe arkadaşın dediği gibi bide 3051 ile deniyim.

#include <16F877A.h>
#device adc=10

#FUSES NOWDT //No Watch Dog Timer
#FUSES LP //Low power osc < 200 khz
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#use delay(clock=4000000)
long int T=0;
long int AN1, x;

#int_EXT
void EXT_isr(void)

{


output_low(PIN_C3);

x=1 ;


}

void main()
{
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_DIV_32);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);


while(1){

enable_interrupts(INT_EXT);
ext_int_edge(0,L_TO_H);
enable_interrupts(GLOBAL);
output_low(PIN_C3);

set_adc_channel(0);
delay_us(100);
AN1=read_adc();         //analog değer okunuyor (10 bit, 0-5 V 0-1023 olarak okunuyor.


T=9*AN1;                //Bekleme süresi(tetikleme açısı) ayarlanıyor- 0-9000 mikrosaniye arası
if(x==1)
{
x=2;
delay_us(400);
delay_us(T);                   //Triyak tetikleme için bekleme süresi
output_high(PIN_C3);            //Triac tetikleme sinyali
delay_us(100); 
output_low(PIN_C3);

}
x=2;
}
}


burdada osiloskop görüntüsü var. en üsteki sıfır noktası. mavi olan tetikleme sinyalim. pempe olan ise moc3021' in 4. bacı triyağın gate ucuna gidiyor.


ete

#6
Yüzlerce dimmer yaptım hepsinde de MOC3021 kullandım. MOC3021 "NON ZERO CROSSING" özelliğine sahiptir. Yani sıfır geçişini sen belirlersin. Hiç sorun yaşamadım. Sorunun kaynağı yanlış olan program mantığın. C den fazla anlamam ama anladığım kadarı ile kesme olunca triac tetik pinini LOW'a çekiyor ve X değişkenini set ediyorsun.
Main kısmında ise ADC okuması yapıp pot değerine göre gecikme hesaplıyorsun.
X=1 ise gecikme değerini verip triacı tetikleyip kapatıyorsun. Ancak tetik öncesi neden 400us llik gecikme veriyorsun bunu anlamadım.
Ayrıca kesme içinde yapman gerekenleri kesme haricinde yapıyorsun ki buda triac tetiklemede senkron kaybettiriyor sana.

Yapılacak iş şu,
Main kısmında sen yine T gecikmesini hesapla ama başka iş yapma.
Kesme kısmında ,
kesmeye girer girmez T gecikmesi kadar bekletme yap
Triac'ı tetikle
100us bekle (burada deneme yap 50 kurtarıyorsa 50 kullan. Ne kadar az olurs ao kadar iyidir)
Triac'ı kapat
Kesmeden çık.

Bu şekilde dene göreceksin çalışacak.

Bu arada SKOP görüntüsü koyduğunu belirtmişsin ama koymamışsın!!!!!!!!!!!!!.

Ete

ete

@ElzemEfe,
Sürekli kişileri ikaz ediyorum. Bilip bilmediğiniz konularda hemen mesajlara cevap yazmayın diye.
Bak ne hatalar yapıyorsun.
Hata-1 :"Tetikleme açısı  için referans işareti alman gerekiyor . Ayrıca  yük nerde  göremedim"
Devrede çok açık bir sıfır geçiş algılama sistemi var iken bunu yapman gerekir diye mesaj attın bir şey demedim.
Lütfen daha dikkatli davran. Anlamadığın konularada cevap verme.

Hata-2 :" ...MOC3021 zero cross var 3051  kullan çünkü tetikleme zamanına sen  karar vereceksin.."
MOC3021 Zero Cross olmayan Triac sürücüsüdür. Sen ise tersini söylemişsin. Neden?
Lütfen dikkat yanlış bilgi sadece sana zarar vermiyor. Bilmeyenleride yanlış yönlendiriyor ve sonuçta bu mesajlar foruma zarar veriyor.

Bir daha hata yapmayacağını umuyorum. Mesajlarada hemen balıklama atlama iyice oku değerlendir ve özellikle yazdıklarına çok dikkat et.

Ete

bagci22

#8
Alıntı yapılan: ete - 04 Aralık 2013, 13:17:02
Yüzlerce dimmer yaptım hepsinde de MOC3021 kullandım. MOC3021 "NON ZERO CROSSING" özelliğine sahiptir. Yani sıfır geçişini sen belirlersin. Hiç sorun yaşamadım. Sorunun kaynağı yanlış olan program mantığın. C den fazla anlamam ama anladığım kadarı ile kesme olunca triac tetik pinini LOW'a çekiyor ve X değişkenini set ediyorsun.
Main kısmında ise ADC okuması yapıp pot değerine göre gecikme hesaplıyorsun.
X=1 ise gecikme değerini verip triacı tetikleyip kapatıyorsun. Ancak tetik öncesi neden 400us llik gecikme veriyorsun bunu anlamadım.
Ayrıca kesme içinde yapman gerekenleri kesme haricinde yapıyorsun ki buda triac tetiklemede senkron kaybettiriyor sana.

Yapılacak iş şu,
Main kısmında sen yine T gecikmesini hesapla ama başka iş yapma.
Kesme kısmında ,
kesmeye girer girmez T gecikmesi kadar bekletme yap
Triac'ı tetikle
100us bekle (burada deneme yap 50 kurtarıyorsa 50 kullan. Ne kadar az olurs ao kadar iyidir)
Triac'ı kapat
Kesmeden çık.

Bu şekilde dene göreceksin çalışacak.

Bu arada SKOP görüntüsü koyduğunu belirtmişsin ama koymamışsın!!!!!!!!!!!!!.

Ete

hocam resmi tekrar yükledim.
en üsteki sıfır noktası. mavi olan tetikleme sinyalim. pempe olan ise moc3021' in 4. bacı triyağın gate ucuna gidiyor.
[IMG]http://imageshack.us/a/img443/2819/p2od.png[/img]
http://imageshack.us/photo/my-images/443/p2od.png/

ete

#9
Bu resim içinde sinüs çizgisini göremiyoruz ne yazıkki. Görebilseydik sııfr algılama sinyalinin sinüsün neresine düştüğünüde görebilirdik. İkisi tam denk gelecek diye bir kanun yok elbette ama sıfır anında benim algılama sinyaliminde oluşması gerekir.
Şimdi senin sisteminde bunun olduğunu varsayalım. (programın bunun tersini söylüyor. Sanki o verdiğin 400us lik gecikme sıfır noktasını biraz olsun aşmanı sağlasın diye yerleştirdin diye düşünüyorum). Her neyse  resime bakılırsa hiç bir gecikme uygulamadan direk tirac tetikleniyor. Buda sistemin sürekli iletimde kalmasına sebep oluyor elbette. Sorunun burada.

Sen benim önceki dediklerimi yabana atma . Dediklerimi uygula çalıştığını göreceksin.
Şöyle düşün iki sıfır noktası arasındaki zaman dilimi 10 ms dir. Bu aslında epeyce kısa bir zaman dilimidir.
Bu dilimin en başını sıfır noktasını algılayarak yakalıyorsun. Sonrasında başka iş yapmadan triac gecikmesini verip sonra triacı tetiklemen ve 100us (ihmal edilebilir bir süre) bekleyip triacı tekrar kapatman gerekir.

Sen bunu yaptığını zannediyorsun ama başka bir zaman dilimi sırasında bunu yapıyorsun. Sen kesmeden çıkıyorsun (10ms lik zaman diliminden ayrılıyorsun) sonra bir takım komutlarla boğuşup triacı tetiklemeye çalışıyorsun burası yanlış. Bu iş yapılacak ise 10ms lik zaman dilimini yakalar yakalamaz hemen gecikmelerini verip triacı tetikleyip sonra geri kapatarak o meşhur 10 ms lik dilimden ayrılman gerekiyor. Aradaki zaman diliminde ise yani kesmeden ayrıldıktan sonra bir sonraki kesme oluşuncaya kadar ADC okumanı yapacaksın. Bu bir boşluk zamandır. O nuda başka işler yaparak değerlendirmen gerekir. Umarım anlaşılmıştır.
Ete

Powered by EzPortal