TİMER 1 TRİAC DİMMER

Başlatan cihanogluts, 19 Ekim 2016, 20:10:58

cihanogluts

Merhaba arkadaşlar bi konuda yarıdıma ihtiyacım var. Yardımlarınız için şimdiden teşekkürler. şu yazdığım kodlarla nerdeyse çok hassas bir şekilde kontrol sağlayabiliyorum.

---------------------------
@ __config _BODEN_OFF & _BOREN_ON & _CP_ON & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT 
define OSC 4               ' Osilatör frekansı 20 Mhz.       
      ' PORTA ve  E dijital giriş çıkış olarak ayarla
CMCON = 7
TRISA = %00000000     ' PORTA nın tüm bitlerini giriş olarak ayarla
TRISB = %11100001        ' PORTB nin tüm bitlerini giriş olarak ayarla
      ' PORTC nin tüm bitlerini çıkış olarak ayarla
PORTB=%00000000
PORTA=%00000000
'*********** D E Ğ İ Ş K E N   T A N I M L A M A L A R I *************************
ac var bit
gecikme var WORD
W  var word
don var word
FAN VAR BYTE
symbol ARTIR=PORTB.6
SYMBOL AZALT=PORTB.7
SYMBOL TRIAC=PORTB.4
symbol bol=portb.5
'***********************  Değşken ilk değerleri  *********************************
DEFINE  LCD_DREG        PORTA
DEFINE  LCD_DBIT        0
DEFINE  LCD_RSREG       PORTA
DEFINE  LCD_RSBIT       6
DEFINE  LCD_EREG        PORTA
DEFINE  LCD_EBIT        7
LCDOUT $FE,1,  "  DIJITAL DiMMER  "
LCDOUT $FE,$C0,"   HOSGELDiNiZ    "
pause 200
FAN=100
ac=1
don=50
gecikme=0

OPTION_REG = %01000000        ' PORTB pulluplar etkin portb için +Vdd ye harici direnç bağlamanız gerekmez.
    INTCON = %10010000         ' Portb.0 kesmesi aktif
on interrupt goto kesme       ' Portb.0 da kesme olursa kesme alt programına git.

GECIKME=0
'/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/ ANAPROGRAM */*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*


basla

      IF AZALT=0 THEN
        GECIKME=GECIKME+86
        FAN=FAN-1
        IF FAN=255 THEN FAN=100
        if gecikme=6536 then gecikme=7736
        IF GECIKME>9800 THEN GECIKME=0
        gosub ekran
        GOSUB DELAY
     
       
      ENDIF
     
      IF ARTIR=0 THEN
        GECIKME=GECIKME-86
        FAN=FAN+1
        IF FAN=101 THEN FAN=0
        if gecikme=7736 then gecikme=6536
         IF GECIKME>9800 and gecikme<65535 THEN GECIKME=9800
         
        gosub ekran
        GOSUB DELAY
        endif
        IF bol=0 THEN
        GECIKME=100
        gosub ekran
        GOSUB DELAY
       
      ENDIF
                             
       
goto basla

DELAY:
      FOR W=0 TO 255
        PAUSEUS 1
        PAUSEUS 1
        PAUSEUS 1
        PAUSEUS 1
        PAUSEUS 1
        PAUSEUS 1
        PAUSEUS 1
        PAUSEUS 1
        PAUSEUS 1
        PAUSEUS 1
        PAUSEUS 1
        PAUSEUS 1
        PAUSEUS 1
      NEXT
      RETURN
ekran
LCDOUT $FE,1,  "  DIJITAL DiMMER  "
LCDOUT $FE,$C0,dec3 FAN,DEC4 GECIKME

return
'/*/*/*/*/*/*/*/*/*/*/*/*/*/*/ ANAPROGRAM SONU */*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/


'***************** KESME ALT PROGRAMI ***************

disable
kesme:
'      IF GECIKME<100 THEN
'        TRIAC=1:GOTO CIK
'      ENDIF
      toggle OPTION_REG.6
      TRIAC=0
     
      PAUSEUS gecikme
      TRIAC=1
 
CIK:  
      INTCON.1 = 0 ' Portb.0 kesmesini sıfırla
Resume ' Ana programa geri dön
enable
End


Fakat kesmedeki gecikmeler asıl yazmak istedeğim proramı engelleycek. Bu beklemelerden kurtulmak için timer1 kesmesi kullanmayı tercih ettim fakat bunda daha hassas bi konrol sağlayamadım. Sizce ne yapmalıyım.
İşte tmr1 kodlarım

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2016 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 02.10.2016                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ __config _BODEN_ON & _BOREN_ON & _CP_ON & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT
define OSC 4
CMCON=7
TRISA=%00000000
TRISB=%11100001
PORTA=%00000000
PORTB=%00000000

 
symbol Triac=PORTB.4
symbol up=portb.6
symbol down=portb.7
symbol set=portb.5
symbol GIE=INTCON.7


DEFINE  LCD_DREG        PORTA
DEFINE  LCD_DBIT        0
DEFINE  LCD_RSREG       PORTA
DEFINE  LCD_RSBIT       6
DEFINE  LCD_EREG        PORTA
DEFINE  LCD_EBIT        7
T1CON=0
dilim var worD
temp var byte
run  var bit
pwk var word
ON INTERRUPT GOTO KESME
pwk=0
dilim=0
CMCON=7

OPTION_REG=%01000000
INTCON=%11010000
LCDOUT $FE,$80,  "  DIJITAL DiMMER  "
LCDOUT $FE,$C0,"   HOSGELDiNiZ    "
pause 200

T1CON=$00000000
PIE1.0=1
BASLA:

  TMR1H=$FF
TMR1L=$FF
IF UP=0 THEN
  PWK=PWK+1
  IF PWK>320 THEN PWK=100
    LCDOUT $FE,$80,  "  DIJITAL DiMMER  "
LCDOUT $FE,$C0,dec3 pwk
  gosub delay
ENDIF
 
IF DOWN=0 THEN
  PWK=PWK-1
  IF PWK=0 THEN PWk=1
  LCDOUT $FE,$80,  "  DIJITAL DiMMER  "
LCDOUT $FE,$C0,dec3 pwk
  gosub delay
ENDIF

If Set=0 then
  toggle run
  if run=1 then
   INTCON=0
  else
   INTCON=%11010000   
   pause 500
  ENDIF
   while set=0:wend
   pause 100
endif   

GOTO BASLA

delay:
      for temp=0 to 255
        pauseus 1
        pauseus 1
        pauseus 1
        pauseus 1
        pauseus 1
         pauseus 1
        pauseus 1
        pauseus 1
        pauseus 1
        pauseus 1
         pauseus 1
        pauseus 1
        pauseus 1
        pauseus 1
        pauseus 1
      next                 
      return


       
DISABLE       
KESME:
 
if INTCON.1=1 then

T1CON=$00000001
   Triac=1
    dilim=0
    TOGGLE OPTION_REG.6
    INTCON.1=0
    goto cik
  endif

  dilim=dilim+1
  if dilim=pwK then Triac=0 
  PIR1.0=0
 
cik:
Resume
Enable

İsis ektedir

ete

Bu mantıkla sonuç alınması zor gözüküyor.
Bana kalırsa şöyle düşünmek lazım. Triac gecikmesi en az 0 (sıfır) ki bunu 100us olarak kabul edebiliriz, enfazlada 9000us olabilir. O halde butonlarla 10 ar değişmek üzere 100 ile 9000 aralığında değer ayarlamak ve buna karşılık gelen TMR1H ve TMR1L değerlerini hesaplayıp vermek en doğrusu olmalı. Böylece dilim olmadan sıfır noktası yakalndığı zaman TMR1 sayacı set edilmeli ve ön yüklemesi verilerek yeniden kesme oluşması beklenmelidir. Bu aşamdan sonra TMR1 sayacı kapatılmalı ve Triac=1 verilerek işleme devam edilmelidir.  Hesaplama nasıl olacak ona bakalım.
Diyelimki süre 1200 us olarak ayarlandı. SURE=65535-1200+8 şeklinde yapıyoruz. SURE=64343 çıkıyor. Bunu 256 ya bölüyoruz. Bu TMR1H değerimiz oluyor. Sonra TMR1H değerini 256 ile çarpıp 64343 den çıakrtıyoruz buda TMR1L değerimiz oluyor. İŞlemleri sırası ile yaparsak;
GECIKME=1200 olmuştu.
TEMP=65535-GECIKME+8
T1H=TEMP/256
T1L=TEMP-(TMR1H*256)
Hepsi bu kadar. İşlem sırası önemli. T1CON=0 ile başlanacak. Sıfır geçiş kesmesi yakalanınca;
TMR1H=T1H:TMR1L=T1L:T1CON=1:PIR1.0=0 verilip kesmeden çıkılacak.
Yeniden kesme oluştuğu zaman TMR1 kesmesi oluşmuş olacak ve PIR1.=1 olarak gelecek.
Kesme içinde PIR1.0=1 ise  T1CON=0 verilip TRIAC=1 verilerek kesmeden çıkılacak.
Umarım anlaşılmıştır. Atladığım bir şey yok ise bu sistem hassas çalışır gibi geliyor bana.
Minimum değeri 100us yaptım çünki sıfır geçiş kesmesinden sonra yeni bir TMR1 kesmesi yaratılması gerekir zaten 100 belkide 150 den küçük değerlerde direk Triac 1 yapılmalı.

Ete


cihanogluts

#2
Söylediklerinizi uyguladım ete hocam . isis te kontrol ettim gecikme vererek yapmış olduğum ile aynı sonucu verdi tıpa tıp aynısı. fakat gecikmeli vermiş olduğum kodlarla motoru sürdüğümde hız çok iyi bir şekilde artırılıp azaltılabiliyor. Ancak şuan verdiğim (sizin düzeltmelerinizi uyguladığım)kodlarla sürdüğümde belli bir noktaya kadar motor yavaş dönüyor bi noktadan sonra motor hızlanıyor. bilgisayar ortamında aynı sonucu veren kodlar nasıl olurda uygulamada farklı sonuçlar verebilir. kullandığım pic mi arızalı acaba. elimde yedek yok deneyemedim.en yakın zamanda onuda deneyeceğim
@ __config _BODEN_ON & _BOREN_ON & _CP_ON & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT 
define OSC 4
CMCON=7
TRISA=%00000000
TRISB=%11100001
PORTA=%00000000
PORTB=%00000000

 
symbol Triac=PORTB.4
symbol up=portb.6
symbol down=portb.7
symbol set=portb.5
symbol GIE=INTCON.7


DEFINE  LCD_DREG        PORTA
DEFINE  LCD_DBIT        0
DEFINE  LCD_RSREG       PORTA
DEFINE  LCD_RSBIT       6
DEFINE  LCD_EREG        PORTA
DEFINE  LCD_EBIT        7
T1CON=0
dilim var worD
temp var word
run  var bit
t1h var byte
t1l var byte
gecikme var word
ON INTERRUPT GOTO KESME
t1l=0
t1h=0
dilim=0
CMCON=7
temp=0
gecikme=9800
OPTION_REG=%00000000
INTCON=%11010000
LCDOUT $FE,$80,  "  DIJITAL DiMMER  "
LCDOUT $FE,$C0,"   HOSGELDiNiZ    "
pause 200

T1CON=$00000000
PIE1.0=1
BASLA:

 
IF UP=0 THEN
  gecikme=gecikme+100
  IF gecikme>9800 THEN gecikme=0
LCDOUT $FE,$80,  "  DIJITAL DiMMER  "
LCDOUT $FE,$C0,dec4 gecikme
  gosub hiz
  gosub delay
ENDIF
 
IF DOWN=0 THEN
  gecikme=gecikme-100
  IF gecikme=65535 THEN gecikme=9800
  LCDOUT $FE,$80,  "  DIJITAL DiMMER  "
LCDOUT $FE,$C0,dec4 gecikme
  gosub hiz
  gosub delay
ENDIF

If Set=0 then
  toggle run
  if run=1 then
   INTCON=0
  else
   INTCON=%11010000   
   pause 500
  ENDIF
   while set=0:wend
   pause 100
endif   

GOTO BASLA

hiz:
TEMP=65535-GECIKME+8
T1H=TEMP/256
T1L=TEMP-(TMR1H*256)
return


delay:
      for temp=0 to 255
        pauseus 1
        pauseus 1
        pauseus 1
        pauseus 1
        pauseus 1
         pauseus 1
        pauseus 1
        pauseus 1
        pauseus 1
        pauseus 1
         pauseus 1
        pauseus 1
        pauseus 1
        pauseus 1
        pauseus 1
      next                 
      return


       
DISABLE       
KESME:
 
if INTCON.1=1 then

TMR1H=T1H:TMR1L=T1L:T1CON=1
   Triac=0
    dilim=0
    TOGGLE OPTION_REG.6
    INTCON.1=0
    goto cik
  endif
 
if PIR1.0=1 then 
T1CON=0
TRIAC=1 
  PIR1.0=0
  endif
cik:
Resume
Enable

ete

#3
Mesajlara code eklerken code tag kullanman gerekiyor. Mesaj ekranında yukarıda bulunan # işaretli butona basıp ekrana koyduğu iki adet "code" yazısının arasına kodunu yazman gerekiyor.

Daha öncede belirtmiştim. Motor sargılarına uygulanan voltaj nedeni ile endüktif bir yüktür ve dimmer sisteminde faz kayması yaratır. Şöyle tarif etmek daha doğru olur. Sistem sıfır noktasına ulaştığı zaman yük üzerinde sıfır voltaj bulunur. Şebeke sıfırlanmıştır. Bu terim dirençli (rezistans) yükler için doğrudur. Ama endüktif yükler bobin üzerine enerji depolarlar ve sistem sıfır noktasına gelince bu enerjiyi geri şebekeye vermeye çalışırlar buda triacın kesime gitmemesine sebep olur. Ancak şebeke voltajı yeterli yükselmeden ve bobindeki enerji sönümlendikten sonra triac kesime gidebilir.  Sende yaşanan olay budur. Bunu gecikmeyi başka türlü vererek bertraf edemezsin.
Şimdi diyeceksin ki normal gecikme verdiğim zaman düzgün çalışıyor. Bence sana öyle geliyor. Flamanlı Lamba vs bağlarsan düzgün çalışır ama motor bağlarsan düzgün çalışmaz. Zaten daha iyi bir sistem arayışın bu yüzden olmalı.
TRAIL EDGE DIMMER yapman gerekiyor. Anlamı şu. Sıfır noktasından sonra Triac otomatik ateşlenecek ama gecimen kadar ateşlenmiş olarak bekleyip sonra bir şekilde kesime gidilecek ve bu iş sıfır noktasına kadar sürecek. Sıfır noktasından sonra aynı iş tekrarlanacak. Tabiiki bu sisteme TRIAC uymuyor maalesef. Çünki TRIAC'ı iki sıfır noktası arasında kesime götüremezsin. Kesilmesi için şebekeninde sıfır noktasına gelmesi gerekir. Peki çare nedir? Motorun Triac ile değil Mosfet ile sürülmesi gerekiyor. Mosfet de yalnızca DC ile sürülür. Ohalde mosfete uygulanan voltajı DC ye çevirecek ve öyle süreceksin. Karmaşık bir şema olacak ama interneti araştır uygulamalar bulursun sanırım.
Bu sistem gerek rezistif yükler ve gerekse motor gibi endüktif yüklerde çok güzel çalışıyor.

Son bir çare olarak şunuda dene. Ben genellikle Triac'ı ateşledikten sonra 100 us bekler sonra triacı kapatırım ki kesme oluştuğunda triac kesime gidebilsin. Sen Triacı ateşlenmiş bırakıyorsun buda bir nebze triacın ateşlenmiş kalmasına yardım ediyor olabilir. Kesme içinde TRIAC=1 dedikten sonra PAUSEUS 100 deyip ardından TRIAC=0 komutunu ver.
Sen Triac=0 versende o yine sıfır noktasına kadar iletimde kalacak sonra gate sinyali sıfır olduğu için kesime gidecektir.
Denemeye değer.

Ete

Powered by EzPortal