16F877a ENTEGRESİ İLE 220V LAMBA DIMMER

Başlatan engineer3535, 18 Nisan 2024, 23:49:10

engineer3535

Selamın aleyküm pic16f877a entegresi kullanarak 220V AC dimmer devresi yapmak istiyorum bir referans devre buldum yaptım kodu da hazırladım pice yükledim fakat proteusta hata aldım ve devreyi çalıştıramadım çalışma şu şekilde sıfır noktası yakalamayı B0 pini ile yaptım D2 pini ile MOC3021 kullanarak triac tetiklemeyi ayarladım son olarak C0 parlaklık azaltma (%10) C1 pini parlaklık arttırma(%10) C2 pini kapama C3 pini açma C4 minimum parlaklık(%10) pini  C5 pini max parlaklık (%90) olacak fakat hata alıyorum sitelerde olan devreleri uyguladığımda da sorun yaşıyorum nasıl çözebilirim yardımcı olabilirseniz çok sevinirim.iyi günler dilerim.

ete

Ortaya çıkan hatalara bakılırsa bazı bacaklarda lojik çakışmalar tespit edildiği belirtilmiş.
Ayrıca bilgisayarın hızı devreyi simule etmeye yetmiyor gibi gözüküyor. Yada simulasyonun uygulaması gereken zaman dilimlerinin çok düşük olduğu belirtilmiş.

Bu gibi durumlarda öncelikle devreni test etmen gerekiyor. Ne yazıkki yalnızca ping uzantılı resim vermişsin buradan bizim devreyi test etme imkanımız yok. Hatanın karşısında soru işareti var ve kime ait olduğu belli değil. Devrenin aslından hareket etmek gerekirdi.

Ete

engineer3535

Yanıtınız için çok teşekkür ederim referans devrenin aynısını proteusta çizip kodun aynısını yükledim pice yine hata aldım devreyi sizinle paylaşsam kontrol etme şansınız var mı gerçekten günlerdir bir devreyi çalıştıramadım yardımcı olabilirseniz çok sevinirim
https://drive.google.com/drive/folders/1mGLfy4Az-FNMDQr0E1R27TEI7kHvGGdv?usp=sharing
devre ve kodu drive yükledim müsait olduğunuz bir zaman bakma şansınız olursa çok sevinirim iyi günler dilerim.
https://drive.google.com/drive/folders/1mGLfy4Az-FNMDQr0E1R27TEI7kHvGGdv?usp=sharing

ete

Aslında devren çalışıyor ama bazı kusurları var.
Öncelikle devre üzerindeki buton pinlerinin her birine 10K pullup direnci bağlaman gerek.
Dikkat edersen butonların ortak uçları GND ye bağlı demekki butona basınca port pinine GND uygulanacak. Bu durumda o buton pininin HIGH da beklemesi gerekir. Bunuda sağlayacak olan Pullup direncidir.

Diğer bir kusur da kullanmış olduğun Sıfır geçiş sistemin. Programa bakınca iki sıfır geçiş aralığı olarak 9500us lik süreyi kullanıp değerlendiriyorsun ama senin sıfır geçiş algılama sistemin bunu sağlamaktan uzak. Sıfır geçiş girişine bir skop bağlarsan şunu görüyorsun. Peryodu 20 ms olan ve duty oranı %50 olan bir kare dalga. Bu şu anlama geliyor. Pozitif alternanslarda senin sistem çalışıyor ama negatif alternanslar için kesme üretemiyorsun.
İşin doğrusu şöyle olmalı. Sinüs eğrisi sıfır çizgisini her geçişte senin sistemin bir kesme oluşturma sinyali üretmelidir. Kısaca belirtmek gerekir ise sıfır geçiş yakalama devreni hiç sevmedim.

Biraz daha işin temel bilgisi vermek isterim. Triac bir kez ateşlendiği zaman bir sonraki sıfır geçiş noktasına kadar iletimde kalır. Sıfır noktasından sonra triac ın yeniden ateşlenmesi gerekir. Ateşleme için Gate ucuna HIGH verilip 100us beklenmelidir. Ardından Gate ucu LOW yapılmalıdır. Sen o ucu LOW yapsanda Triac kesime gitmeyecek ama sıfır geçiş noktasında otomatikman sıfırlanacaktır. Bu noktada gate ucunun LOW yapılma sebebi sıfır noktasından sonra Gate ucuna hala HIGH verilmemesi gerektiğindendir.

Dim leme prensibi ise şöyledir. Sıfır geçişinden sonra teorik olarak 10.000 us lik bir ayar süren bulunuyor. Bu süre komut gecikmelerinden dolayı 9500 us olarak ancak kullanılabiliyor.
Şimdi gözümüzde olayı canlandıralım. Sıfır geçişi yakaladıktan sonra hemen Triac ateşlenir ise bir sonraki sıfır geçişe kadar triac aktif kalacak ve sisteme bağlı lamba %100 parlaklıkta yanacaktır.

Lambanın %50 parlaklıkta yanması isteniyor ise sıfır geçişinden sonra 9500/2=4750 us kadar bekledikten sonra Triac ateşlenmelidir. Böylece triac 9500us lik sürenin yarısında aktif kalacaktır. Dikkat edersen önce ateşlemeden bekliyor sonra ateşliyoruz.
Şimdi %10 luk artış ve eksilişlerin uygulamasına bakalım. 9500us bize %100 parlaklık veriyor idi. 9500 * 10/100=950 sayısı bize %10 luk artış ve eksiliş miktarlarını sağlayacaktır.
Örnek vermek gerekir ise Lambanın %10 parlaklıkta yanması için;
sıfır geçiş yakalandıktan sonra (9500-950=)8550 us bekledikten sonra triac ateşlenmelidir.
Böylece triac yalnızca 950us lik peryotta aktif kalacaktır.
Sonuç olarak %10 luk parlaklık artırımı için bir 16 bitlik PARLAK değişkenin olmalı. PARLAK değeri 9500 den çıkartılıp kalan kadar bekledikten sonra triac ateşlenmelidir.
Programında çok iyi çözümleyememiş olsamda bu hesapların yanlış uygulandığını düşünüyorum.
Triac ateşleme kısmı doğru ancak ateşlendikten sonra 200us beklemek yanlış 200 rakamını 100 yapman gerek. Sen 475 lik artış ve eksilmeler kullanmışsınki bu %5 lik paya denk geliyor olsa gerek.

Son olarak düzgün çalışan bir dimmer için sıfır geçiş kesmesi kullanman gerekir. Aksi halde çalışmada aksaklıklar görülecektir.
Sıfır girişini PORTB.0 dan vermişsin zaten Bu pine kolaylıkla INT kesmesi uygulayabilirsin.

İyi çalışan bir sıfır geçiş devresi şeması ekliyorum.

Ete 

ete

Programdaki buton kontrol kısımlarını yorumlamaya çalışıyorum.

ALPHA isimli süre değişkenin var bu tamam. Başlangıç değeride 4750 olarak verilmiş. Lambanın %50 parlaklıkta açılması için buda doğru diyelim.

Şimdi sistemimiz nasıl çalışıyor idi?
Önce gecikme (ALPHA) değeri kadar bekleyecek ve ardından triac ateşlenecek sistem bu.

Şimdi parlaklığı %10 artıralım. Bunun için ön gecikme değerimizin %10 kadar azalması gerekir.
%10_ARTIRMA=ALPHA-950
Parlaklığın %10 azaltılması;
%10_AZALTMA=ALPHA+950
Lambanın Tam Parlak Yakılması
ALPHA=0
Lambanın Tam sönük olması
ALPHA=9500
Lambanın %50 parlaklıkta yanması
ALPHA=4750

Şeklinde olacaktır.
Buton kontrollerinde şu ifadeleri görüyorum.
      alpha -= 475; // %10 azalt
      if (alpha < 0)
        alpha = 0;
INT olan sayılar sıfırdan küçük olamaz. Sayıyı eksiltirsin bir noktada sıfır olur yeniden eksiltirsen (0-475=)65060 rakamını elde edersin.(Geriye doğru sayı 65535 den çıkartılır)
Bu durumda sıfır noktasının aşıldığını ancak şöyle anlarsın. Sayı şayet 60000 den büyük hale gelmiş ise sıfır noktasının altına düşmüşsün demektir.
Bu durumda yukardaki eşitliğide buna uygun düzeltmen gerekir.

Ete



engineer3535

Abicim tekrardan çok teşekkür ederim ilgi ve alakan için Allah razı olsun devreyi kurdum kodu da yazdıklarına göre uyarlamaya çalıştım ama yine hata alıyorum yeni devreyi ve kodu drive attım drive linki
https://drive.google.com/drive/folders/1mGLfy4Az-FNMDQr0E1R27TEI7kHvGGdv?usp=drive_link
bir türlü kurtalamadık hatadan lambada hiç hareket yok dediğin gibi pull up direnç ile butonları bağladım müsait bir zamanında bakabilirsen çok sevinirim görselleri de burada paylaşayım işin içinden nasıl çıkıcam bilemedim




engineer3535

Hatanın nedenini buldum artık simülasyon hata vermiyor fakat devre yine de çalışmıyor verdiği hatayı şu şekilde çözdüm proteus>system>set animation options>SPICE Opitions>defaut kısmını settings for better convergence kısmına çekip load ok işleminden sonra time too small hatasını almıyorum fakat devre bu şekilde de tepki vermiyor çalışmıyor burdan nasıl ilerleyebilirim şimdiden çok teşekkür ederim

ete

Verdiğin linki bir kontrol et istersen boş simulasyon dosyası çıkıyor.
Elindeki bütün dosyaları RAR ile sıkıştırıp buraya mesaja ekleyemiyormusun.
One drive sıkıntılı.

Programı ne yaptın dediğim düzeltmeleri yaptınmı ?.

Ete

engineer3535

Söylediğiniz ayarlamaları yaptım kodu da söylediğiniz şekilde düzeltmeye çalıştım hata almadım ama D2 triyağı tetiklemiyor devrede mi bir sorun var kodda mı onu çözemedim. RAR olarak ekledim

ete

Kod gerektiği şekilde düzeltilmemiş.
İlişikteki programı derle parantez hatası olabilir onları düzelt.
Bir HEX dosyası elde edersen buraya koy bakalım.

Ete

engineer3535

kodu derledikten sonra hiç hata almadım ama yine de tetiklemede sorun var kodun üstüne çalışmam gerekiyor sanırım hex dosyasını ekliyorum

ete

Programı da hex dosyası ile birlikte koyman iyi olurdu. Bir şeyler değişmişmi görebilirdim.
Verdiğin hex ile sistemi çalıştırdığımda dimmerin %50 parlaklık ile açıldığını skop üzerinden görebiliyorum. %10 ertı ve eksi butonları çalışıyor ancak her basışta tek değer ataması yapması gerek.
Gecikme değeri alıp başını gidiveriyor. Buton kontrollerini iyileştirmek lazım.
Alttaki butonlar çalışmıyor gibi.
Butonlara sınırlama getirmek gerek.
Malum program hızlı çalışır ve bir butona basılınca bazen onun bırakılıp bırakılmadığı sorgulanır ve bırakılmamış ise bırakılıncaya kadar beklenir ve peşine 100ms lik bir tuş titreşimini önleme gecikmesi koyularak işlem tamamlanır. Bu dediklerimin Basic karşılığı şöyledir.

IF TUS=0 THEN  'tuşa basılmış ise
  .... şunları yap
   WHILE TUS=0:WEND  'Tuşa basılı tutulduğu sürece burada bekle
   pause 100         'tus gecikmesini ver
ENDIF
                'işlemi sonlandır
 
Hangi derleyici ile bunu derliyorsun.?

Ete

ete

#12
CCS derleyici ile biraz çalıştım ve programın eksiklerini tamamlayabildim.
İlişikteki program çalışmaktadır. Buu simulasyondan görebiliyorum. Görebiliyorum derken skop görüntüsünden bunu anlayabiliyorum.
Şimdi butonlarda doğru çalışmaya başladı.
Dosyalar ilişiktedir.
Simulasyon yine hız konusunda hata veriyor. Vermesin diyorsan şunları yapman gerek;
- Devredeki moc3021 in led kısmına bağlı olan 220 ohm direnci ANALOG özelliğini DIGITAL yap.
  Bunun için sağ tıkla ve açılan pencerede edit properties seç ve altta yer alan ANALOG ifadesini yanındaki oka tıklayarak DIGITAL seç.
- Animation options seçeneğinden Frames Per Second seçeneğini 15 yap
Bu şekilde dene. Yine hata verirse devredeki triac lamba ve oradaki Vsine sembolünü silebilirsin. Burada önemli olan skop görüntüsünde tetik sinyalinin buton kontrolüne bağlı yerdeğiştirdiğini görmektir. Zaten sinüs işareti görülebiliyor.
Şemanın PDF görüntüsünü verdim aslına uyarlarsın benim versiyon sendeki ile uyuşmayacak çünki.

Ete

engineer3535

Devre şuan çalışmaya başladı kesme işlemini yapıyor ama tam ters bir işlem var lambayı yakamıyor osiloskopta inceledim kodun üzerinde çalışacağım kesme süre aralığında bir problem var sizin fikriniz nedir osiloskop görüntüsünü ekleyeyim yeşil sinyal aralığı çok  dar olduğundan lambayı yakamadığını düşünüyorum

ete

BU söylediklerini simulasyona bakarak söylediğin belli.
Gerçek devrende bu lamba yanacaktır. Bu mantığı bir çok kere gerçek devrede de denedim ben.
Bir Triac en az 10 us had bilemedin 30us süre ile tetklenir ise aktive olur. Biz 100us veriyoruz garanti olsun diye. Tetiklenmiş bir Triac'ı ise sen istesende kesime götüremezsin. kapanma konumuna gelmesi için aktif olan iki ucundaki voltajın eşit olması gerekir ki sıfır noktasında da bu oluyor ve triac kendiliğinden kesime gidiyor. Sonuç olarak o triac'ın kısa süreliğine tetiklenmesi lambanın yanması için yeterli olmaktadır.
Sinüs işaretinin sıfır noktasını kestiği nokta ile bir sonraki nokta arası teoride süre olarak 10 ms dir. Biz bunu 9500 kullandık. Çünki kessme anındaki çalıştırdığımız her bir komutun işlenme süresi vardır ve buna birde 100us lik triac tetikleme gecikmesi eklenince orada yaklaşık 500us lik bir zaman kaybımız oluyor. Bu zamanı toplam süreden çıkartarak 9500 olarak işlem yaptık. Bu süreyi 9000 de kullanabilirsin belkide daha uygun olacaktır. En azından tetikleme zamanı normal iki kesme aralığının dışına taşmamaış olur.

Sen simulasyondan lamba parlaklığını gerçek devrede ki gibi göreyim istiyorsun ama bu ancak ve ancak ufak bir parlaklık değişimi şeklinde görülebiliyor. Daha fazlasını bekleme. Orada önemli olan ayar yaptığın zaman triac tetiklemesinin iki kesme aralığında yer değiştirmesidir. Sağa doğru gittikçe lamba sönük sola doğru gittikçe lamba parlak olacaktır. İşin teorisi bu şekildedir.

Ete

Powered by EzPortal