Yardım istiyorum... dimmer programında 2 adet buton var DIM_UP, DIM_DOWN bu butonlara bastıkça
değer değişiyor benim istediğim basılı kaldığında yani port sıfıra çekildiğinde maksimum değere
rampalı olarak yavaş çıkması ve tersi butona basıldığında rampalı düşmesi... kodları düzletecek
yardım edeceklere şimdiden teşekkürler...
ramapa süresi 2.000ms yeter...
butonlar kullnışsız
buton yerine bir pot bağlasak daha güzel olur... istenilen değere rampalı çıkar...
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 16.01.2012 *
'* Version : 1.0 *
'* Notes : proton basic *
'* : *
'****************************************************************
Device 12F675
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, BODEN_OFF, CP_OFF, MCLRE_OFF
Xtal 4
;I/O symbols
Symbol Triac_out = GPIO.0 ;triac pin
Symbol Zero_cross = GPIO.2 ;zero-cross algilama pini
Symbol Dim_UP_Button = GPIO.4
Symbol Dim_DOWN_Button = GPIO.5
;interrupt symbols
Symbol GIE = INTCON.7 ; Global Interrupt Enable 1 = enable, 0 = disable
Symbol T0IE = INTCON.5 ;TMR0 Overflow Interrupt Enable bit
Symbol INTE = INTCON.4 ;GP2/INT External Interrupt Enable 1 = enable, 0 = disable
Symbol T0IF = INTCON.2 ;TMR0 Overflow Interrupt Flag bit
Symbol INTF = INTCON.1 ;External Interrupt Flage 1 =
;external interrupt occurred (must be cleared in software)
'degiskenler
Dim Load_Value As Word
Dim I As Byte
Dim tus_basili As Byte
'***********************************************************************************
On_Interrupt Interrupt_Detect
GoTo BEGIN
'************************************************************************************
Interrupt_Detect:
If INTF = 1 Then
TMR0 = Load_Value
T0IE = 1 ' Enable TMR0 overflow interrupt
INTF = 0 ' Clear INT Flag (be ready for the next)
EndIf
If T0IF = 1 Then
High GPIO.0
DelayUS 100 'triyak tetiklemesi 100 uSn
Low GPIO.0
T0IF = 0
EndIf
Context Restore
'************************************************************************************
BEGIN:
All_Digital = TRUE
CMCON = 7 ;comparator kapali
'OPTION_REG.7 = 0 ;pull-ups aktif
OPTION_REG = %01010101 ;presc 1:64 ,External Interrupt Edge to rising edge
TRISIO = %111100;1-giris, 0-cikis
WPU =%110000
;interrupt (kesme) tanimlamalari
T0IF = 0 ;TMR0 overflaw bayragini sil
INTF = 0 ;External Interrupt bayragini silg
Load_Value = 110 '150
MAIN:
GIE = 0 ' tüm kesmeleri kapat
While GIE = 1:GIE = 0:Wend ' kesmelerin kapandigindan emin ol
INTE = 1 ' Enable External Interrupt
GIE = 1 ' Enable global interrupts
If tus_basili=0 Then
If Dim_UP_Button = 0 Then GoSub DIM_UP
If Dim_DOWN_Button = 0 Then GoSub DIM_DOWN
EndIf
If Dim_UP_Button = 1 And Dim_DOWN_Button = 1 Then
tus_basili=0
EndIf
GoTo MAIN
';bu degerler 50Hz gore ayarlidir
''*********************************************************************************************
DIM_UP:
Load_Value = Load_Value + 2'2 'arttırma oranı
If Load_Value >= 180 Then Load_Value = 180
tus_basili=1
Return
DIM_DOWN:
Load_Value = Load_Value - 2'2 'eksilteme oranı
If Load_Value <= 110 Then Load_Value = 110
tus_basili=1
Return
'***********************************************************************************************
Device 12F675
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, BODEN_OFF, CP_OFF, MCLRE_OFF
Xtal 4
;I/O symbols
Symbol Triac_out = GPIO.0 ;triac pin
Symbol Zero_cross = GPIO.2 ;zero-cross algilama pini
Symbol Dim_UP_Button = GPIO.4
Symbol Dim_DOWN_Button = GPIO.5
;interrupt symbols
Symbol GIE = INTCON.7 ; Global Interrupt Enable 1 = enable, 0 = disable
Symbol T0IE = INTCON.5 ;TMR0 Overflow Interrupt Enable bit
Symbol INTE = INTCON.4 ;GP2/INT External Interrupt Enable 1 = enable, 0 = disable
Symbol T0IF = INTCON.2 ;TMR0 Overflow Interrupt Flag bit
Symbol INTF = INTCON.1 ;External Interrupt Flage 1 =
;external interrupt occurred (must be cleared in software)
'degiskenler
Dim Load_Value As Word
Dim I As Byte
Dim tus_basili As Byte
'***********************************************************************************
On_Interrupt Interrupt_Detect
GoTo BEGIN
'************************************************************************************
Interrupt_Detect:
If INTF = 1 Then
TMR0 = Load_Value
T0IE = 1 ' Enable TMR0 overflow interrupt
INTF = 0 ' Clear INT Flag (be ready for the next)
EndIf
If T0IF = 1 Then
High GPIO.0
DelayUS 100 'triyak tetiklemesi 100 uSn
Low GPIO.0
T0IF = 0
EndIf
Context Restore
'************************************************************************************
BEGIN:
All_Digital = TRUE
CMCON = 7 ;comparator kapali
'OPTION_REG.7 = 0 ;pull-ups aktif
OPTION_REG = %01010101 ;presc 1:64 ,External Interrupt Edge to rising edge
TRISIO = %111100;1-giris, 0-cikis
WPU =%110000
;interrupt (kesme) tanimlamalari
T0IF = 0 ;TMR0 overflaw bayragini sil
INTF = 0 ;External Interrupt bayragini silg
Load_Value = 110 '150
GIE = 0 ' tüm kesmeleri kapat
While GIE = 1:GIE = 0:Wend ' kesmelerin kapandigindan emin ol
INTE = 1 ' Enable External Interrupt
GIE = 1 ' Enable global interrupts
MAIN:
IF Dim_UP_Button=0 THEN
WHILE DIM_UP_BUTTON=0 AND LOAD_VALUE<180
LOAD_VALUE= LOAD_VALUE+1
delayms 29
WEND
ENDIF
IF Dim_DOWN_Button=0 THEN
WHILE DIM_DOWN_BUTTON=0 AND LOAD_VALUE>110
LOAD_VALUE= LOAD_VALUE-1
delayms 29
WEND
ENDIF
GoTo MAI
mantık şu, TMR0 sayacı 110 dan başlayıp 180 e geliyor. Bu 70 kademe sayıyor demektir. O halde bu 70 kademenin 2000 ms içinde sayılması gerekecektir. Yani her kademe için yaklaşık 28,5ms gerekiyor. Bunu 29 aldım. Rampa işlerinde mantıklı fark edilebilecek süre yaklaşık 3 sn (3000 ms dir) sen 2 sn olsun demişsin bu nedenle isteğine göre hesap yaptım.
Tuşa basıldığı müddetçe Load_value değerinin sayabilmesi için While - wend döngüsü kullandım.
İki sıfır geçiş arası yaklaşık 10 ms dir. sen bu süreyi (komut gecikmelerinden dolayı) 180 x 64=11520 ms almışsınki bu biraz fazla oluyor. Önceki programı denedinmi bilmiyorum ama min değerinde de bir sorun var gibi. 110 x 64=7040 ms ediyor ki buda yaklaşık %50 dim seviyesinin biraz üzeridir yani %55 lik bir dim seviyesine tekabül eder. Her halde tam sıfırlanmıyor sistemin. Her neyse verdiğim programı dene istersen.
Pot ile de bu işi yapmak mümkün ancak pot sürekli değer veren bir elemandır. Yani onu ADC girişine bağladığın zaman nasıl bir mantık ile dim yaptıracağız. Şöyle olabilir.
POT sıfır konumunda duruyorsa dim seviyen 110 a karşılık gelebilir. Pot maksimuma alınınca rampa yaparak 180 seviyesine gelebilir. Benzer şekilde Pot max değerden küçük bir konumda ise rampa yaparak min konuma gelebilir. Ne olacağına karar vermek güç.
ETE
ilginiz için teşekkür ederim programı isis'te denedim board üstüne kurduğum devrede çalışmadı
çıkış artmıyor rampa yükselmiyor butonların 1 konumu komutu yok 1 se ne olacak .... proteus isis simlasyonu buraya ekliyorum ilgilenebilirseniz zamanınız varsa
saygılar...
up butonuna basılı kaldığı sürece rampalı olarak maksimum değere tırmanması lazım
Ben proton kullanmıyorum. Aynı programı PBP ya çevirdim ve simulasyonda denedim benimki çalışıyor. Şimdi senin simulasyonunda da deniyorum çalışıyor gözüküyor. Sorun senin derlemende olsa gerek. Çünki programın çalışması gerekir.
Ete
https://1drv.ms/u/s!AvTLMS2z03FNgYJ5wvyVd7Ub7Ig_zw
Gönderdiğiniz pic basic kodu çalışıyor fakat butona bastıkça tetikleme sinyali kesime gidiyor
oda kırpışma yapıyor... emeğine sağlık....
Kırpışma muhtemelen 29ms lik gecikmeden kaynaklanıyor. Onu dilimlere bölerek gecikme sağlamak gerek.
linktekini dene bakalım. Buda olmaz ise başka yapacak bir şey yok maalesef.
Ete
https://1drv.ms/u/s!AvTLMS2z03FNgYJ6D_9WdOAfqnzmxw,
Ete hoca emeğine saygı duyuyorum 10 numara oldu teşekkür ederim...
https://youtu.be/nYpn_NgALJ4
İyi bari sevindim.
Ete
ETE Hocam devrede zero cross devresini değiştirmek zorunda kaldım önceki devre 10ms de bir sinyal geliyordu problem yoktu şimdi direk 50hz den dirençle porta veriyorum kare dalga olarak
dolasıyla 20ms 50 hz bir sinyal tekralıyor..20ms niye olunca eksi altrnasta tetikleme yapmıyor
yarım dalga çalışıyor buna göre 10ms niye olması lazım kare dalganın yükselen ve düşen kenarında tetikleme yapması gerekiyor zannımca düzelteme imkanı varmı...
Dirençten sonra köprü diyod koyarsan olur.Yarım dalgada sadece artı alternansta tetikleme yaparsın.50 puls.Köprü tipü doğruldursan 100 puls yapar hem artı hem ekside tetiklersin.
devre direk 220 beslendiği için düşük akım çekmem lazım malzeme artırmadan yapmam gerekiyor..
soft olarak düzelebilir...
Ete hocam devre izolesiz 220vac çalıştığı için köprü diyotla olmuyor zero cross soft olarak yardım bekliyorum... Şuan direk ac den port girişine dirençle veriyorum 50hz 20ms yazılımda ne yapabiliriz 10ms okumak için eksi alternası nasıl okuruz yaparız.
Bir çok dimmer yaptım. Sıfır geçiş yakalamak için hepsinde köprü diyot ve peşinde optocoupler kullandım. Opto çıkışını pic'e verdim. Başka türlü sorun olur. Zaten senin devrende simulasyonda da görülüyor idi. Tepe noktada kesme sinyali geliyordu yanlış hatırlamıyorsam.
Ete
https://1drv.ms/u/s!AvTLMS2z03FNgYMN8aHaXOY75DACtg
Köprü kullanmadan iki yönde çalışan opto da kullanılabilir. "AC optocoupler" olarak aramak yeterli.
ETE Hocam gönderdiğiniz dosya 8.8 versiyon ben açamadım bendeki 8.6 sizden önce opto kulanarak yaptım oldu..
fakat başka bir problem ortaya çıktı up tuşu devamlı basılı kilitli halde enerjiyi ani olarak aç kapa yamam gerikiyor anahtarla bu işlem sırasında pic in her seferde 0 dan başlaması gerekiyor devrede dc voltaj boşalma süresi var o nedenle pic mclr'den reset atmam gerekiyor... enerji kesildiği anda bunun için zero crostan yaralanmak istedim fakat opto çıkışı dc den beslendiği için ordada gecikme oluyor başka ne yapabilirim..
@harmanx yazdığın programlama dilini bilmiyorum ama aşağıdaki sayfaya bir bak istersen.
http://fidenetgaraj.blogspot.com/2018/07/analog-ve-dijital-dimmerleri-inceleyelim.html?m=0
Butonu main içinde okurum. Main içinde çalışırken İnterrupt içinde olmadığın için zero crossing devresini oluşturduğu interrupt çalışacaktır.
Burada tuşa hala basılı ise dimm değerini step step artırın. Bu arada zero crossing interrupta gireceği için dimm miktarının arttığını görürsünüz.
Mcuyu resetlemenize gerek kalmaz.
Sayfayı bir inceleyin.
konu başlığında ne istemiş isen onu gerçekleştirmiş olduk. Bu son isteğini yani ne istediğini anlamış değilim. İşlemciyi reset etmen gerekiyor ise mclr bacağını aktif edip oraya butonla gnd uygulaman yeterli.
Son verdiğim şemayı resim olarak gün içinde ekleyeceğim takip edip alırsın. Onun dışında önerebileceğim bir şey yok.
Ete
Son devre şeması aşağıdaki linktedir.
https://1drv.ms/u/s!AvTLMS2z03FNgYMS0RBHEyb9vOzMPg
Ete
Sayın Ete hocam Anlatamamış olabilirim kısacası dimmer çıkışını
Herhangi bir voltaja ayarladığımızda besleme voltajının aniden kesilip tekrar gelmesininde
Picin tekrar sıfırdan başlamasını sağlamak şuanki devrede bunu yaptığımıza picin besleme geriliminde devrede kondastör olduğundan besle gerilimi hemen sıfıra düşmediğinden sapıtma yapıyor bunu engellemek istiyorum yani pic voltajın kesildiğini anlaması lazım tekrar sıfırdan başlaması için bilginize ihtiyacım var...saygılar...
Şayet pic beslemesi kesilirse ve devrede kondansatör var ise besleme kesilmiyor demektir. O halde kesintiyi pice anlatacak bir yol gerekiyor ki oda aynı şebekeden kondansatörsüz bir 5v ayarlayıp pice girmek. Şebeke kesilir kesilmez bu uç anında sıfıra düşer ama pic kondansatörlü beslemeden dolayı ayakta kalır ve girişin sıfır olduğunu görünce sistemi en başa yönlendirir yada dimmeri nereye alacak ise oraya alır. Devrende port.1 boş gözüküyor oraya şebeke girişini verebilirsin. Yalnızca dorultulmuş zener ile sabitlenmiş ama kondansatörü olmayan bir 5v gerekiyor. Gerisi programdan halledilir. Sen önce bu beslemeyi hallet programı ben düzenlerim.
Bir dimmerde bu gibi bir sorun hiç görmedim. Acaba endüktif bir yükü dimliyor olmayasın. Bu durumda faz kayması meydana gelir ve dimmer sınırların dışına çıkar ve abuk subuk çalışır. Yoksa anlık elektrik kesintileri dimmeri etkilemez. Sorununu anlamakta zorluk çekiyorum doğrusu.
Ete
Dimmerle Taşlama motoru çalıştırıyorum dolasıyla anahtarla hızlı aç kapa yaptığım zaman sfırdan başlaması gerekiyor rampalı kalkması için değiniz gibi boş porta 5v vericem...
Yanlız fikrimce zaten zero coros bilgisi geliyor ondan faydalansak olmazmı sıfır geçiş bilgisi gelmediğinde program başa dönsün..
Sorunun motor çalıştırmak ile ilgili bu dimmer motor çalıştırmak için uygun değildir. Çünki motor rotor ve statoru endüktif materyaldir ve üzerine enrji depolar ve buda faz kaymasına sebep olur. Bazı motorları çalıştırabilir özellikle küçük motorları ama taş motoru kesinlikle sorun çıkartacaktır. Sorunlarıda söyleyeyim tam sıfıra düşmez yada düşer gibi yapıp aniden devir yükselir bunlar hep faz kaymasının sonuçlarıdır. Yüzlerce kere denedim bunu.
Motor için trail edge denilen bir sistemle çalışan dimmer gerekir. Bu da triac ile değil mosfet ile çalışır. İnternette çok fazla açık edilmemiştir bu konu. Çünki ticari değeri olan bir iştir ve çok açık edilmiyor maalesef. Çok zor değil aslında. Farkı ne dersen yaptığın modelde dim yapmak için sıfır noktasından sonra bekleyip öyle triacı ateşliyorsun sıfır noktasında triac kesime gidiyor. Diğerinde ise her sıfır noktasından sonra yük voltaj alıyor yani triac ateşlenmiş gibi düşün ama ortada yada sona yakın bir yerde triac kesime götürülüyor. Tabiiki triac ile bu iş yapılamayacağı için mosfet kullanılıyor. Triac bir kez ateşlendimi gate ucunu kessen bile iletimde kalıyor sıfır noktasına kadar. Mosfet ise istenilen anda açılıp kapatılabiliyor.
Sıfır noktası ile şebeke varmı yokmu anlamak için bir sürü eklenti yapmak gerek öyle düşündüğün kadar kolay bir iş değil. Sen dediğimi yap diyeceğim ama boşuna uğraşıyorsun olmayacak bu iş.
Ete
Ete hocam denemeleri şuan için lamba ile yapıyorum motor denemesine geçmedim henüz dediğinizi yapıp porta 5v vericem müsait olduğunuz zaman prorgramı düzenlerseniz denmesini yaparım...
Motorun türüde önemli aslında bu tip kontrollerde.Nasıl bir motor kullanılıyorsa.Neticede normal çamaşır makinası veya süpürge motorlarıda sıfırı yakala bekle ateşle yöntemi ile dimleniyor.Neticede onlarda endüktif yük.
Başka bir sorun var gibi.
Ortada bir problem yok şuan lamba ile deneme yapıyorum işlemcinin ac voltajın kesildiğini anlaması ve programın başa dönmesi gerekiyor..
O zaman zerocross olmayınca resetle.Bir sayaç koştur ana kodda.Kesme olunca içinde sayacı resetle.Eğer kesme oluşmazsa sayaç değeri belirlediğin değeri aşmış ise sistemi resetle.
https://www.pcbway.com/project/shareproject/TDA1085C___NEU.html
Motor için bu devre ideal gözüküyor tabi seri motorsa.
Merhabalar.
Motor (ac fan motoru) sürerken triac kısmı tam olarak nasıl olmalı ? Elinde motor sürmek için sorunsuz çalışan şeması olan varmı acaba ?
Programın yeniden düzenlenmiş hali ile şemada yapılan ilaveler ilişikte dosyalarda göterilmiştir.
Hex dosyasıda içindedir.
Ete
https://1drv.ms/u/s!AvTLMS2z03FNgYMUu70OwsNq-sbFQg
ete hocam programı denedim similasyonda çalışıyor gözükküyor gerçekte devre üstünde sıkıntı var
GPIO.1 giriş portuna 5v verdiğim zaman 5 volt çöküyor 5 voltu çıkarıp osilaskopla porta baktığımda iğne sinyal görüyorum porta sanki çıkış portu gibi similasyondada porta 5v buton ile veriyorum çalışıyor fakat ordada port boşta iken baktığımda karasız bir kare dalga görüyorum...
pic bozuk olabilirdiye başka pic ilede denedim olmadı..
mantık olarak sistem çalışıyor..
similasyondada açılışta maksimumdan başlıyor gibi geldi bana
https://yadi.sk/d/jGsC3pM6Ed_4sg
Önceki programdan bir komut satırı kalmış kesme içinde (toggle GPIO.1) bu yapıyordur mutlaka. Düzlttim aşağıdaki linkten yükle. Denemeler yapıyordum. Yüksekten başlamayı ayarlamıştım. Onuda düzelttim.
Bak bakalım çalışıyormu?
https://1drv.ms/u/s!AvTLMS2z03FNgYMV_SOBTiEH9NiVUg
Ete
deniyeceğim...
Ete hocam programı denedim ac giriş portunu sıfıra çektiğim anda çıkış kesiliyor.. tamam
fakat ac girişi low da iken triyak tetikleme çıkışında rastgele tetiklemeler oluyor..
ve canlı devrede kesme yaparken aniden kesmiyor nerde yakalarsa bazen hızlı bazen gecikmeli kararsız kesiyor..
birde minumum seviyede alt limitte zero cros 20ms de bir tetikliyor
Alt_limit=80 alt limit 100 ün altına düştüğünde tetikleme problem oluyor 10ms yerine 20ms oluyor voltajı sıfıra kadar indirmem 100 altına
düşmesi gerekiyor..
Ust_limit=230
https://yadi.sk/d/_wa860Lz20NP7g
Bu sıfır geçiş yakalama şemasını hiç beğenmedim. Bana kalırsa sorun şemada. Benim verdiğimi dene opto izolatörlü olan. Sorun olmaması gerek. Benim başka yapabileceğim bir şey yok maalesef.
Ete
Bahsettiğin sorunla ilgili olarak simulasyonu epeyce inceledim.
Gördüğüm kadarı ile şebeke kesilince sistemi başa döndürmek yetmiyor. Zira program sürekli başa gidiyor orada kesmeler yeniden aktive ediliyor ve kesme oluşuncada istenmeyen triac tetiklemesi meydana geliyor. Burada çözüm şebeke kesilince o iki kesmeyide kapatmak ve programı başa göndermeden önce şebekein gelmesini beklemek olacak. Bu şekilde yaparsam sorun kalmıyor gözüküyor. Derleme yapabiliyor isen aşağıdaki programı bir dene. Bu arada programın başına açılış gecikmesi ekledim bu olmadan da sorun çıkıyor.
'Device 12F675
#CONFIG
__config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF
#ENDCONFIG
Define OSC 4
;I/O symbols
Symbol Triac_out = GPIO.0 ;triac pin
SYMBOL Test_giris= GPIO.1 ; Şebeke var yok girişi
Symbol Zero_cross = GPIO.2 ;zero-cross algilama pini
Symbol Dim_UP_Button = GPIO.4
Symbol Dim_DOWN_Button = GPIO.5
;interrupt symbols
Symbol GIE = INTCON.7 ; Global Interrupt Enable 1 = enable, 0 = disable
Symbol T0IE = INTCON.5 ;TMR0 Overflow Interrupt Enable bit
Symbol INTE = INTCON.4 ;GP2/INT External Interrupt Enable 1 = enable, 0 = disable
Symbol T0IF = INTCON.2 ;TMR0 Overflow Interrupt Flag bit
Symbol INTF = INTCON.1 ;External Interrupt Flage 1 =
;external interrupt occurred (must be cleared in software)
'degiskenler
Load_Value VAR Word 56
I VAR word 58
SURE VAR WORD 60
tus_basili VAR Byte
Alt_limit var byte
Ust_Limit var byte
'***********************************************************************************
PAUSE 500
On Interrupt GOTO Interrupt_Detect
GoTo BEGIN
'************************************************************************************
'************************************************************************************
BEGIN:
ANSEL=0
SURE=0
CMCON = 7 ;comparator kapali
'OPTION_REG.7 = 0 ;pull-ups aktif
OPTION_REG = %01010101 ;presc 1:64 ,External Interrupt Edge to rising edge
TRISIO = %000111110;1-giris, 0-cikis
WPU =%00110000
;interrupt (kesme) tanimlamalari
T0IF = 0 ;TMR0 overflaw bayragini sil
INTF = 0 ;External Interrupt bayragini silg
Alt_limit=110
Ust_limit=235
Load_Value = ALt_limit
' GIE = 0 ' tüm kesmeleri kapat
' While GIE = 1:GIE = 0:Wend ' kesmelerin kapandigindan emin ol
INTE = 1 ' Enable External Interrupt
GIE = 1 ' Enable global interrupts
MAIN:
if Test_Giris=0 then
INTE=0:T0IE=0
PAUSE 100
WHILE TEST_GIRIS=0:WEND
INTE=1:T0IE=1
clear
@ clrf PCLATH
@ goto 0
endif
IF Dim_UP_Button=0 THEN
WHILE DIM_UP_BUTTON=0 AND LOAD_VALUE<Ust_Limit
LOAD_VALUE= LOAD_VALUE+1
' if load_value=181 then load_value=180
gosub DELAY 'pause 29
WEND
ENDIF
IF Dim_DOWN_Button=0 THEN
WHILE DIM_DOWN_BUTTON=0 AND LOAD_VALUE>ALt_Limit
LOAD_VALUE= LOAD_VALUE-1
' if load_value=109 then load_value=110
GOSUB DELAY 'pause 29
WEND
ENDIF
GoTo MAIN
delay:
for I=0 to 500:next
return
';bu degerler 50Hz gore ayarlidir
''*********************************************************************************************
DISABLE
Interrupt_Detect:
If INTF = 1 Then
TMR0 = Load_Value
T0IE = 1 ' Enable TMR0 overflow interrupt
INTF = 0 ' Clear INT Flag (be ready for the next)
EndIf
If T0IF = 1 Then
High GPIO.0
pauseus 100 'triyak tetiklemesi 100 uSn
Low GPIO.0
T0IF = 0
EndIf
Resume
ENABLE
Derleme yapamıyorsan ben derleyip koyayım.
Ete
ete hocam bende picbasic yok proton var protona çevrip derliyicem siz derlermisiniz hata olmasın
bende derleyip bakıcam..
proton bunlara hata veriyor SURE VAR WORD 60 sondaki 60 değerini kapatmam gerekiyor...
protonda derledim kesme yapıyor fakat maksimum ayarlanan değere çıktıktan sonra yapıyor (port sıfırda iken gelen tetiklemeler düzelmiş ...)
anında kesemiyor... böyle olduğunu kabul edelim sorun şuki ac den opto ile bu girişi
kontrol ediyorum optonun çıkışı ile anahtarlama yapıcam yerdeki sinyal Ac den okuduğu için zero cross sinyali gibi tetiklemeli oluyor velhasıl olması mümkün olmuyor bu işi soft olarak yapmamız gerek düşüncem optodan gelen 10ms niyelik tetikleme bilgileri ile bi sayaç saydırmak sayaç durduğu zaman işlem kesilsimesi... veya daha mantıklı bir yol...
BU sistemin çalışması için AC şebeke girişinin tamamen kesilmesi gerekir.
Pic beslemesi çalışıyor ama AC beslemesi yani sıfır geçiş kısmı çalışmıyor ise sorun çıkıyor. Ama bu son hali simulasyonda kusursuz çalışıyor vede gerçek devrede de çalışması gerekir.
İşte derleme linki ; https://1drv.ms/u/s!AvTLMS2z03FNgYMaxgV-J-5TFl92yQ
Bu işi soft olarak yapmamız gerek lafınınıda çözemedim bir türlü bu şekilde değilde soft olarak ne yapmak gerek onu anlat istersen.
Bu arada sıfır geçiş kesmelerini Timer-1 ile de zaman vererek denedim. Oda başka sorunlar getiryor. Şunu yaptım. Bizde her bir sıfır kesmesi 10 ms de bir oluyor. Ben maksimum süreyi 20 ms kabul ettim ve 21 ms içinde bir kesme gelmez ise sistemi resetle dedim. Çünki bu AC sinyalin kesilmesi anlamına geliyor. Sistem çalıştı ancak onda da kesmeler hemen sona ermiyor maalesef. Asıl sorun rest sonrası sistemin yeniden kurulup çalışır hale getirilmesi. Bu aşamda sistem kesmeleri aktif ediyor (program baştan başladığında) ve anında bir kesme oluşuyor. Buda yaşadığın sorunları oluşturuyor maalesef. Derleyip verdiğim en sorunsuz ve iyi çalışanı. Onun dışındakiler işe yaramazlar.
Unutma sistem resetlenince yeni baştan herşey aktif hale getiriliyor ve bu esnada yeniden bir iki kesme oluşuyor. Bunu önlemenin yolu şu sistem reset edecek hale geldiğinde hemen resetleme kesmeleri kapat sistem olduğu yerde beklesin ve şebeke yeniden gelidiğinde en baştan başlat. Bu son yolladığım bunu yapıyor onun dıındakilerin bunu yapması zor.
Ete
Kendi sıfır geçiş devrem ile çalıştırdığımda alt limitin 103 ve üst limitinde 243 olduğunu görüyorum. Sen ise alt limit için 80'in altına düşmem gerek diyorsun halbuki simulasyondan bakarsan kesmenin ötesine geçiyor bu değerlerde ve sistem ozaman sapıtıyor. Çalışma alanın iki kesme arasıdır. Bu alanın dığına çıkarsan problemlerin başlar. Kısa yoldan o sıfır geçiş devreni değiştir derim.
Ete
Ete hocam devreyi denedim similasyonda ve gerçekte çalışıyor fakat similasyonda bakarsanız sürekli
tekrarlıyor... Yani elektriği verdiğimde çıkış yükseliyor ve kendiliğinden kesiliyor..
herhalde ben yapmak istediğimi analatamadım ...
Gerçek devrede similasyon daki ac takip butonu yok.... (GPIO.1 GPIO.2 beraber zero corosa bağlı optocoupler ile...)
ben butonu similasyona denemek için koydum gerçekte yok
Devrenin çalışma şekli AC gerilimi hem pic ve triaca verdiğimde yani komle beslemeyi..
Çıkış rampalı olarak yükselecek ayarladığım değere kadar buton ile maksimuma orada kalacak taaaki beslemeyi kesene kadar... tekrar beslemeyi komle kesip verdiğimde aynısını yapacak...
hocam birde ayarlama butonları çalışmıyor maksimum değeri butonla ayarlamam gerekiyor açılıp kapandığında
ayarladığım değeri hafızasında tutabilirmi...
Ne istediğini ben anlayamıyorum maalesef. Devrenin beslemesini kesersen sistem duruyor. Tekrar gelene kadar bekliyor fazla kesik kalırsa kondansatörde boşalacağı için zaten sistem yeniden başlar. Butonlarda çalışıyor. Kusura bakma fazlası elimden gelmiyor.
Ete
Ete hocam gönderdiğin dosyayı linkten indirip kontrol edermisin yanlış dosya olmasın...
emekler boşa gidcek yüzdük kuruğuna geldik...
Devre enerji deyken up butona basılı tutunca yükselip tekrar sıfıra iniyor buton ile ayar yapılamıyor enson yazdığın kodu silince butonlar çalışıyor..
Program doğru. Senin devrende bir şey var. İlişikte yeniden veriyorum. Yanında benim simulasyon devremle birlikte yolluyorum. Bu devre ile bir dene ve özellikle butonları dene.
Triac sinyalinin iki sıfır noktası arasında (skop da) nasıl ilerlediğine şahit ol.
AC girişi kes ve sinyalin nasıl kesildiğinide gör.
Benim başka yapacak bir şeyim yok maalesef.
Ete
https://1drv.ms/u/s!AvTLMS2z03FNgYMcGczxW1gWkaP5IQ
ete hocam denedim kendi simalasyonumda bir değişiklik yok sizin program 8.7 version bende çalışmıyor.. indirim ondad deniceğim..
up butanuna bastığın sürece yükseliyor sona gelince sıfırlıyor butona basmayı bırakınca da sıfırlıyor..
size bendeki simalasyonu ve gönderdiğiniz dosyayı gönderiyorum kontrol edersniz memnun olurum..
https://yadi.sk/d/6LlEqMNqciC4hw
Buton takılı kalıyor dikkat ettinmi.
evet haberim var...butonu off yaptınmı sistem sıfıra dönüyor zaten....
Ete hocam sizin similasyonu çalıştırınca problemi anladım...
GP1 portuna siz 1-0 veriyorsunuz oysa ben ac den zeroo cros bilgisi veriyorum....zero cros kesilince kesme işlemini yapsın diye ...
GP1 Portuna ac gerilimden 0 -1 bilgisi veremiyorum doğrultmam gerekiyor tam doğrultunca kondastör kullanmam gerekli ozamanda gecikme oluyor başka bir çaresi varmı ac den 1-0 bilgisi nasıl alırım..
ac var yok bilgisi.. oraya role takabilirim fakat role takmak saçmalık olur.. ne yapabilirim...
1 diyot ile DC ye çevirip 1uF kondansatör hatta 10uF kondansatörle filtre ederek kullanabilirsin. Bu kadarı bir sorun yaratmaz. KOndansatör sorun olur ise 100nf bağla yeterli olur.
Ete
Selam Ete hocam up tuşu basılı iken ac gerlim kesime gittiği anda rampa tamamlanmadan kesime gitmiyor rampa tamamlanınca kesime gidiyor tetikleme ...
vede gp3 girişine bir start butonu eklesek basılı iken program başlasın değilse çalışmasın... mümkünmü
https://yadi.sk/d/NZCOgs-Hi3ZEkA
Merakımdan soruyorum konuyu açan arkadaşın adı murat tezcan mıdır ?
tarafımdan kaldırılmıştır
Bu programı ben yazmadım. Yalnızca çalıştırılmasına yardımcı oldum.
Programda alt ve üst limitler var. Bunlar belirli bir amaca hizmet eden limitler.
Gerçekte böyle bir şey olmaması gerek. Ama gecikme için TMR1 sayacı kullanıdığı için pot bu limitler arasında bir değer vermesi gerekir.
Devreye pot ilave etmek zor bir iş değil. Buton pinlerinden birini Analog girişe çevirmek gerek. Mesela GPIO.4 (yani AN3). Bunun için TRISIO zaten giriş olarak ayarlanmış. ANSEL.4=1 yapınca o giriş analog hale gelir. Yapılacakları sırası ile yazarsam belkide kendin yaparsın.
-Symbol Dim_UP_Button = GPIO.4 satırı silinecek
- Değişken tanımlama kısmına bir değişken eklenecek HAM VAR WORD şeklinde
- programın baş tarafına;
DEFINE ADC_BITS 10 ' ADCIN resolution (Bits)
DEFINE ADC_CLOCK 1 ' ADC clock source (Fosc/8)
DEFINE ADC_SAMPLEUS 20 ' ADC sampling time (uSec)
satırları eklenecek.
-Programın baş taraflarına bir yere aşağıdaki komut satırını ekle;
- ADCON0=%00000000:ANSEL=%00011000
- Programa alt program olarak aşağıdaki satırlar eklencek DISABLE satırından öncesine.
ADC_BAK:
ADCIN 3,HAM
Load_Value=(ham*/3129)/100+110
RETURN
- Programdaki buton kontrollerini kaldıracaksın.
Programın MAIN etiketi altına bir yere,
GOSUB ADC_BAK satırını ekleyeceksin hepsi bu kadar.
Ete
ac dimmer deyince aklıma geldi. kullandığımız kalem havyalar için dimmer tarzı bir devre tasarlanabilir mi acaba ? 220 v AC kablo ucunu kesip dimmere bağlayacaz uzun süreli çalışmalarda ısıyı kısacak bir sistem olsa nasıl olurdu ??
yazılan iletilerin mod onayı uzun suruyor konuyu başaka plartforma taşıyorum...
Ete hocam değişikleri yaptım ama olmadı...
eksik bişey var...
Device 12F675
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, BODEN_ON, CP_OFF, MCLRE_OFF,
Xtal 4
ADCON0=%00001100 '11 = Channel 03 (AN3)
ANSEL=%00011000 '= FOSC/8
Declare Adin_Res 10 ' 10-bit çözünürlük
Declare Adin_Tad FRC 8 ' osilatörü seçildi
Declare Adin_Stime 20 ' Örnekleme zamanı 20us
;I/O symbols
Symbol Triac_out = GPIO.0 ;triac pin
Symbol Test_giris= GPIO.1 ; Şebeke var yok girişi
Symbol Zero_cross = GPIO.2 ;zero-cross algilama pini =
'''''''''''''''' slindi Symbol Dim_UP_Button = GPIO.4
Symbol Dim_DOWN_Button = GPIO.5
;interrupt symbols
Symbol GIE = INTCON.7 ; Global Interrupt Enable 1 = enable, 0 = disable
Symbol T0IE = INTCON.5 ;TMR0 Overflow Interrupt Enable bit
Symbol INTE = INTCON.4 ;GP2/INT External Interrupt Enable 1 = enable, 0 = disable
Symbol T0IF = INTCON.2 ;TMR0 Overflow Interrupt Flag bit
Symbol INTF = INTCON.1 ;External Interrupt Flage 1 =
;external interrupt occurred (must be cleared in software)
'degiskenler
HAM VAR Word ' EKLENDİ
Load_Value VAR Word '56
I VAR Word '58
SURE VAR Word '60
tus_basili VAR Byte
Alt_limit var Byte
Ust_Limit var Byte
'***********************************************************************************
DelayMS 500
On Interrupt GoTo Interrupt_Detect
GoTo BEGIN
'************************************************************************************
'************************************************************************************
BEGIN:
ANSEL.4=1 ''ekkkkk
ANSEL=0
SURE=0
CMCON = 7 ;comparator kapali
'OPTION_REG.7 = 0 ;pull-ups aktif
OPTION_REG = %01010101 ;presc 1:64 ,External Interrupt Edge to rising edge
TRISIO = %111110;1-giris, 0-cikis
WPU =%110000
'*********************************************************************************
' ANSEL=0
'CMCON = 7 ;comparator kapali
'OPTION_REG.7 = 0 ;pull-ups aktif
'OPTION_REG.7 = 1 ;pull-ups pasif
'OPTION_REG = %01010101 ;presc 1:64 ,External Interrupt Edge to rising edge
'TRISIO = %111110;1-giris, 0-cikis
'WPU =%110000 ' Enable pull-ups On GP4, GP5
'********************************************************************************
;interrupt (kesme) tanimlamalari
T0IF = 0 ;TMR0 overflaw bayragini sil
INTF = 0 ;External Interrupt bayragini silg
Alt_limit=101
Ust_limit=255
Load_Value = ALt_limit
' GIE = 0 ' tüm kesmeleri kapat
' While GIE = 1:GIE = 0:Wend ' kesmelerin kapandigindan emin ol
INTE = 1 ' Enable External Interrupt
GIE = 1 ' Enable global interrupts
MAIN:
If Test_giris=0 Then
INTE=0:T0IE=0
DelayMS 100
While Test_giris=0:Wend
INTE=1:T0IE=1
Clear
@ clrf PCLATH
@ GoTo 0
EndIf
' If Dim_UP_Button=0 Then
' While Dim_UP_Button=0 And LOAD_VALUE<Ust_Limit
' LOAD_VALUE= LOAD_VALUE+1
' GoSub delay 'pause 29
'Wend
'EndIf
'If Dim_DOWN_Button=0 Then
'While Dim_DOWN_Button=0 And LOAD_VALUE>ALt_Limit
' LOAD_VALUE= LOAD_VALUE-1
' GoSub delay 'pause 29
' Wend
'EndIf
GoTo MAIN
ADC_BAK:
ADCIN 3,HAM
Load_Value=(HAM*/3129)/100+110
Return
'delay:
' For I=0 To 2000:Next
' Return
';bu degerler 50Hz gore ayarlidir
''*********************************************************************************************
Disable
Interrupt_Detect:
If INTF = 1 Then
TMR0 = Load_Value
T0IE = 1 ' Enable TMR0 overflow interrupt
INTF = 0 ' Clear INT Flag (be ready for the next)
EndIf
If T0IF = 1 Then
High GPIO.0
DelayUS 100 'triyak tetiklemesi 100 uSn
Low GPIO.0
T0IF = 0
EndIf
Resume
Enable
Yapılmışı var ve halen kullanmaktayım.
https://etepic.com/index.php/topic,67.0.html
Ete
Ete hocam
kodları düznledim bir yerde hata var çalışmıyor
'****************************************************************
'* Name : AC_Dimmer_Control.bas *
'* Author : Your Name Here *
'* Date : September 2023 *
'* Version : 1.0 *
'* Notes : AC Dimmer Control with PIC12F675 *
'****************************************************************
Device = 12F675
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, BODEN_ON, CP_OFF, MCLRE_OFF
Xtal = 4
' ADC Configuration
ADCON0 = %00001100 ' Select Channel 3 (AN3)
ANSEL = %00011000 ' Set AN3 as analog input, Fosc/8
Declare Adin_Res = 10 ' 10-bit resolution
Declare Adin_Tad = FRC ' Use the internal oscillator
Declare Adin_Stime = 20 ' Sampling time of 20us
' I/O Pin Symbols
Symbol Triac_out = GPIO.0 ' Triac control output
Symbol Test_giris = GPIO.1 ' Mains presence input
Symbol Zero_cross = GPIO.2 ' Zero-crossing detection input
' Interrupt Symbols
Symbol GIE = INTCON.7 ' Global Interrupt Enable
Symbol T0IE = INTCON.5 ' TMR0 Overflow Interrupt Enable
Symbol INTE = INTCON.4 ' External Interrupt Enable
Symbol T0IF = INTCON.2 ' TMR0 Overflow Interrupt Flag
Symbol INTF = INTCON.1 ' External Interrupt Flag
' Variables
Dim HAM As Word ' ADC result
Dim Load_Value As Word ' Dimming level
Dim I As Word ' General-purpose variable
Dim SURE As Word ' General-purpose variable
Dim Alt_limit As Byte ' Lower dimming limit
Dim Ust_Limit As Byte ' Upper dimming limit
'********************************************************************
' Initialization Section
'********************************************************************
DelayMS 500
On Interrupt GoTo Interrupt_Detect
GoTo BEGIN
'********************************************************************
' Main Program Loop
'********************************************************************
BEGIN:
' Analog and I/O Setup
ANSEL.4 = 1 ' Enable AN4 for analog input
ANSEL = 0 ' Configure other pins as digital
CMCON = 7 ' Disable the comparator
OPTION_REG = %01010101 ' Prescaler 1:64, External Interrupt Edge: Rising
' TRISIO = %111110 ' Set GP1 as input, others as output
' WPU = %110000 ' Enable pull-ups on GP4 and GP5 (if needed)
' Interrupt Configuration
T0IF = 0 ' Clear TMR0 overflow flag
INTF = 0 ' Clear the external interrupt flag
Alt_limit = 101 ' Set the lower dimming limit
Ust_Limit = 255 ' Set the upper dimming limit
Load_Value = Alt_limit ' Initialize the dimming level
' Enable Interrupts
INTE = 1 ' Enable External Interrupt
GIE = 1 ' Enable global interrupts
' Main Program Loop
MAIN:
If Test_giris = 0 Then
INTE = 0
T0IE = 0
DelayMS 100
While Test_giris = 0
Wend
INTE = 1
T0IE = 1
Clear
@clrf PCLATH
@GoTo 0
End If
' Add your main program logic here
GoTo MAIN
'********************************************************************
' Subroutines
'********************************************************************
ADC_BAK:
ADCIN 3, HAM
Load_Value = ((HAM * 3129) / 100 + 110) / 10 ' Adjust scaling if needed
Return
'********************************************************************
' Interrupt Service Routine
'********************************************************************
Interrupt_Detect:
If INTF = 1 Then
TMR0 = Load_Value
T0IE = 1 ' Enable TMR0 overflow interrupt
INTF = 0 ' Clear INT Flag
End If
If T0IF = 1 Then
High Triac_out
DelayUS 100 ' Triac trigger delay (adjust as needed)
Low Triac_out
T0IF = 0
End If
Resume
End
Alıntı yapılan: ete - 21 Eylül 2023, 18:58:35Yapılmışı var ve halen kullanmaktayım.
https://etepic.com/index.php/topic,67.0.html
Ete
evet bende biliyorum birkaç defa yaptım çok hoşuma gitmedi bu devre çok kararlı çalışan bişey değil..
benim dediğim bu tarz birşey olacak : https://www.pttavm.com/ac-220v-2000w-motor-hiz-kontrol-dimmer-devresi-voltaj-regulatoru-p-258239071?utm_source=akakce.com&utm_medium=fiyat-kiyaslama&utm_campaign=akakce&v=1.18
(https://i.ibb.co/1Rz5tgz/D-M.jpg) (https://ibb.co/1Rz5tgz)
Ete hocamın projesini ben de yapmıştım... gayet de güzel çalışıyor. Verdiğiniz linkteki proje falan değil, her yerde bulunabilen basit bir şey...