Dimmer


Closed Thread
Results 1 to 40 of 68

Thread: Dimmer

Hybrid View

  1. #1


    Did you find this post helpful? Yes | No

    Question With DT_Interrupts added

    Quote Originally Posted by mister_e View Post
    Can't wait to return home... use the following ACDetect routine instead.
    this should work.
    Code:
    disable
    ACDetect:
    if ACline==1 then 
        '
        '    Rising edge of AC signal
        '    ========================
    	if triacdelay then              ' A delay is set by user
                                            '  
    	    if FullBright==0 then       ' Full Brightness flag is not set
                pauseus maxdelay-triacdelay '    do the selected delay
                triac=1                     '    enable TRIAC	    	
                else                        '
        	        triac=1                 ' Full Brightness flag is set
                                            '    enable triac
                endif                       '
                                            '
            else                            '
        	    triac=0                     ' No Delay set by user... disable Triac
            endif                           '
        
        else                                
        '
        '    Falling edge of AC signal
        '    =========================
            if fullbright==0 then triac=0   ' Disable the Triac on falling edge of 
                                            ' Ac signal
        endif
    INTCON.0=0 ' Clear GPIF (interrupt on GP4 change)
    resume
    enable
    Yeah i know you can also use Pulsout and forget the Falling edge detection... as you wish. Both will work.
    Very interesting thread I must say. I am trying to do the same and have added DT_INTERRUPTS to manage the ac detect....But my lamp is not dimming at all, also when in the code 'triacdelay=0', my lamp does not go off........ Can someone spot the error please.
    Code:
    INCLUDE "DT_INTS-14.bas"     ; Base Interrupt System
    INCLUDE "ReEnterPBP.bas"     ; Include if using PBP interrupts
    Include "modedefs.bas"
    @ __Config _XT_OSC & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _BODEN & _CP & _CPD
    
    TriacDelay                  var Word
    maxdelay                    var word
    
    Triac	var	PortA.1 ' Output to TRIAC gate
    ACLine	var	PortA.2 ' Input for the FullWave rectify AC line
    Buz		var PortC.2
    
    TRISA = %001100
    TRISC = 0
    CMCON = 7
    ANSEL = 0
    OPTION_REG = %11000000  ' RAPU = off, PS WDT
    PORTA=0
    PORTC=0
    
    ASM
    INT_LIST  macro    ; IntSource,        Label,  Type, ResetFlag?
            INT_Handler    INT_INT,  _ACDetect,   PBP,  yes
        endm
        INT_CREATE               ; Creates the interrupt processor
    ENDASM
    
    @   INT_ENABLE   INT_INT     ; enable external (INT) interrupts
    
    Triac=0            ' disable Triac Gate
    triacdelay=0  ' Set delay to minimum
    
    while 1
    
    pause 3000
    high buz: pause 500 : low buz
    triacdelay=8000     : pause 10000 :high buz: pause 50 : low buz 
    triacdelay=5000     : pause 10000 :high buz: pause 50 : low buz 
    triacdelay=4500     : pause 10000 :high buz: pause 50 : low buz 
    triacdelay=4000     : pause 10000 :high buz: pause 50 : low buz
    triacdelay=3500     : pause 10000 :high buz: pause 50 : low buz
    triacdelay=0 : pause 7000
    
    wend
    
    ACDetect:
    	if triacdelay > 0 then
    			if triacdelay=8000 then
    				triac=1 ' Activate TRIAC
    			else
    				maxdelay=8000-triacdelay
    				pauseus maxdelay
    				triac=1
    				pauseus 50
    				triac=0
       	     	endif
        else
     		     triac=0
        endif
    @ INT_RETURN
    P.S. I am using full wave with few high value resistance connected to phase and zeners to drop the voltage further.

  2. #2
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by FromTheCockpit View Post
    P.S. I am using full wave with few high value resistance connected to phase and zeners to drop the voltage further.
    What size zeners are you using?

    The INT input is Schmidt trigger, so it has to get above 4.0V to trigger the interrupt.
    It may not make it, or cause a delay after zero-crossing that could affect the timing.

    Have you tried it without the zeners?
    DT

  3. #3


    Did you find this post helpful? Yes | No

    Question

    Quote Originally Posted by Darrel Taylor View Post
    What size zeners are you using?

    The INT input is Schmidt trigger, so it has to get above 4.0V to trigger the interrupt.
    It may not make it, or cause a delay after zero-crossing that could affect the timing.

    Have you tried it without the zeners?
    Hello Darrel, I made a slight mistake in the above post, it's not full wave rectified. The circuit goes like this - Phase->1.5Meg->12V zener->1K->4.7V zener->3.3Meg->PIC

    No I have not tried it without zeners yet. Will it be OK to remove the zeners from the above equation - the place where I am gets heavy voltage fluctuations - The variation could be from 170V - 280V AC (I am serious!)

  4. #4
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    According to the simulator, your resistors/zeners should give 4.4v, so that's ok. (but you shouldn't need the zeners)

    mister-e was using INT ON CHANGE, so it triggered on both edges.
    To get INT to do the same thing you have to toggle INTEDG on each interrupt.

    This modification of the handler works in the SIM.
    Code:
    INTEDG  VAR OPTION_REG.6
    ; ...
    
    ACDetect: 
        if INTEDG then
            if triacdelay > 0 then
                if triacdelay=8000 then
                    triac=1 ' Activate TRIAC
                else
                    maxdelay=8000-triacdelay
                    pauseus maxdelay
                    triac=1
                endif
            else
                triac=0
            endif
        else
            if triacdelay != 8000 then triac=0
        endif
    
        INTEDG = !INTEDG
    @ INT_RETURN
    In the scope image, the blue line shows the triac ON time.
    It's only on during the positive half of the cycle.
    Doesn't seem right, but that's the way mister-e had it.

    Name:  dimmer.JPG
Views: 3707
Size:  137.5 KB

    HTH,
    DT

  5. #5
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    Read the previous post first.
    Then if you want both halves of the cycle, try this ...
    Code:
    INTEDG  VAR OPTION_REG.6
    ; ...
    
    ACDetect:
        if triacdelay != 8000 then triac = 0 
        if triacdelay > 0 then
            if triacdelay=8000 then
                triac=1 ' Activate TRIAC
            else
                maxdelay=8000-triacdelay
                pauseus maxdelay
                triac=1
            endif
        else
            triac=0
        endif
    
        INTEDG = !INTEDG
    @ INT_RETURN
    Name:  dimmer_2.JPG
Views: 2267
Size:  74.2 KB
    DT

  6. #6


    Did you find this post helpful? Yes | No

    Default

    Hi, I tried the following first:
    Code:
    INTEDG  VAR OPTION_REG.6
    ; ...
    
    ACDetect:
        if triacdelay != 8000 then triac = 0 
        if triacdelay > 0 then
            if triacdelay=8000 then
                triac=1 ' Activate TRIAC
            else
                maxdelay=8000-triacdelay
                pauseus maxdelay
                triac=1
            endif
        else
            triac=0
        endif
    
        INTEDG = !INTEDG
    @ INT_RETURN
    RESULT: The bulb attached to the output did not responded to the change in triac delay value, it just kept glowing at the same intensity.

    Then I experimented a little and came up with the following:
    Code:
    while 1
    
    pause 3000
    high buz: pause 500 : low buz
    triacdelay=8000     : pause 15000 :high buz: pause 50 : low buz 
    triacdelay=7998     : pause 15000 :high buz: pause 50 : low buz 
    triacdelay=7950     : pause 15000 :high buz: pause 50 : low buz 
    triacdelay=7900     : pause 15000 :high buz: pause 50 : low buz
    triacdelay=7850     : pause 15000 :high buz: pause 500 : low buz
    triacdelay=0        : pause 12000
    
    wend
    
    
    ACDetect:
    ;    if triacdelay != 8000 then triac = 0 
        if triacdelay > 0 then
            if triacdelay=8000 then
                triac=1 ' Activate TRIAC
            else
                maxdelay=8000-triacdelay
                pauseus maxdelay
                    triac=1
                    pauseus 50
                    triac=0
            endif
        else
            triac=0
        endif
    
        INTEDG = !INTEDG
    @ INT_RETURN
    RESULT: The bulb responded to the changing value of triac delay, at value of 8000 it goes full bright which is normal BUT when at first lower value than 8000, it dims quiet a lot. I want it to dim a only a little at first step. I even tried 7998 after 8000 but no luck i.e. 2 uS delay.

  7. #7
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    You're right, I had the resistors wrong.
    Making the change brought it up to 4.6V.
    But, having the zeners in there adds about 40uS to the zero-cross signal.
    It takes 35uS without the zeners, and 75uS with them.

    Add in the interrupt latency for PBP type interrupts, time to do math in the handler, the minimum pauseus of 24us, and taking into account that a half cycle of 60hz is 8,333uS ... I'm sure the first step was quite a bit dimmer.

    But the biggest problem is delaying inside the interrupt handler.
    When 90% of the time is spent in the handler, the pause 10000 in the main loop takes almost a minute.

    So here's my next attempt.
    It uses Timer1 for the delays, so the main program can keep running in the foreground.
    The handlers have been changed to ASM type to minimize latencies.
    And the math is done in a separate subroutine that only runs once when you change the brightness, instead of having to do the math on every zero-cross.

    It should be pretty close to the MAX/MIN dimming, but you may need to adjust the MaxBright/MinBright constants a little.
    If you adjust them too far, it will start flashing.
    Code:
    INCLUDE "DT_INTS-14.bas"     ; Base Interrupt System
    INCLUDE "ReEnterPBP.bas"     ; Include if using PBP interrupts
    Include "modedefs.bas"
    @ __Config _XT_OSC & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _BODEN & _CP & _CPD
    
    MaxBright                   CON 8250    ; maximum brightness
    MinBright                   CON 200     ; minimum dimming 
    Brightness                  var word
    TriacDelay                  var Word
    AlwaysON                    var BIT
    AlwaysOFF                   var BIT
    OffPeriod                   var BIT     ; used by timer1 periods
     
    Triac	var	PortA.1 ' Output to TRIAC gate
    ACLine	var	PortA.2 ' Input for the FullWave rectify AC line
    Buz		var PortC.2
    
    INTEDG  VAR OPTION_REG.6
    TMR1ON  VAR T1CON.0
    TMR1IF  VAR PIR1.0
    Timer1  VAR WORD EXT
    @Timer1 = TMR1L
    
    TRISA = %001100
    TRISC = 0
    CMCON = 7
    ANSEL = 0
    PORTA=0
    PORTC=0
    
    ASM
    INT_LIST  macro    ; IntSource,        Label,  Type, ResetFlag?
            INT_Handler    INT_INT,    _ACDetect,   ASM,  yes
            INT_Handler   TMR1_INT,   _T1Handler,   ASM,  yes
        endm
        INT_CREATE               ; Creates the interrupt processor
    ENDASM
    
    @   INT_ENABLE   INT_INT     ; enable external (INT) interrupts
    @   INT_ENABLE  TMR1_INT     ; enable Timer1 interrupts
    
    Triac=0            ' disable Triac Gate
    brightness=0       ' Set delay to minimum
    gosub SetDelay
    
    while 1
        pause 3000
        high buz: pause 500 : low buz
        brightness=MaxBright   : gosub SetDelay : pause 10000 :high buz: pause 50 : low buz 
        brightness=MaxBright-2 : gosub SetDelay : pause 10000 :high buz: pause 50 : low buz 
        brightness=4500        : gosub SetDelay : pause 10000 :high buz: pause 50 : low buz 
        brightness=4000        : gosub SetDelay : pause 10000 :high buz: pause 50 : low buz
        brightness=3500        : gosub SetDelay : pause 10000 :high buz: pause 50 : low buz
        brightness=MinBright   : gosub SetDelay : pause 10000 :high buz: pause 50 : low buz
        brightness=0           : gosub SetDelay : pause 7000
    wend
    
    SetDelay:
        Brightness = Brightness min MaxBright                    ; limit maximum brightness
        AlwaysON  = !(Brightness != MaxBright)                   ; MaxBright is always ON
        AlwaysOFF = !(Brightness != 0)                           ; 0 is always OFF
        if !AlwaysOFF then Brightness = Brightness max MinBright ; limit minimum dimming
        triacdelay = -(MaxBright - Brightness)                   ; calc delay time
    RETURN
    
    ;------------------------------------------
    T1Handler:
        if OffPeriod then            ; triac delay finished
            OffPeriod = 0
            triac=1                  ; turn on triac
            Timer1 = -50             ; load timer for 50uS
        else
            triac = 0                ; turn off triac after 50uS
            TMR1ON = 0 
        endif
    @ INT_RETURN
    
    ;------------------------------------------
    ACDetect:
        if AlwaysON then
            triac=1 ' Activate TRIAC
        else
            if AlwaysOFF then
                triac = 0
            else
                Timer1 = triacdelay  ; load delay into timer
                TMR1IF = 0           ; clear the interrupt flag
                TMR1ON = 1           ; start the timer
                OffPeriod = 1        ; tell T1Handler this is the main delay
            endif
        endif
    
        INTEDG = !INTEDG             ; toggle INTEDG to get both edges
    @ INT_RETURN
    Hope that works better.
    DT

  8. #8


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by Darrel Taylor View Post
    According to the simulator, your resistors/zeners should give 4.4v, so that's ok. (but you shouldn't need the zeners)

    mister-e was using INT ON CHANGE, so it triggered on both edges.
    To get INT to do the same thing you have to toggle INTEDG on each interrupt.

    This modification of the handler works in the SIM.
    Code:
    INTEDG  VAR OPTION_REG.6
    ; ...
    
    ACDetect: 
        if INTEDG then
            if triacdelay > 0 then
                if triacdelay=8000 then
                    triac=1 ' Activate TRIAC
                else
                    maxdelay=8000-triacdelay
                    pauseus maxdelay
                    triac=1
                endif
            else
                triac=0
            endif
        else
            if triacdelay != 8000 then triac=0
        endif
    
        INTEDG = !INTEDG
    @ INT_RETURN
    In the scope image, the blue line shows the triac ON time.
    It's only on during the positive half of the cycle.
    Doesn't seem right, but that's the way mister-e had it.

    Attachment 4684

    HTH,
    Thanks Darrel, I just noticed that in your simulation there is no 1k between the two zeners, instead there is 3.3Meg. I will try the code and update here.

Similar Threads

  1. PICDIM Lamp Dimmer for the PIC12C508 - PICREF-4
    By charudatt in forum General
    Replies: 8
    Last Post: - 2nd September 2015, 07:14
  2. Dimmer switch
    By iugmoh in forum Off Topic
    Replies: 4
    Last Post: - 20th March 2009, 16:02
  3. Ideas on ir-code for dimmer
    By tirithen in forum mel PIC BASIC Pro
    Replies: 0
    Last Post: - 13th February 2009, 23:22
  4. 50hz sync for light dimmer
    By tirithen in forum General
    Replies: 2
    Last Post: - 6th September 2008, 19:29
  5. Dimmer Circuit
    By Pesticida in forum mel PIC BASIC Pro
    Replies: 9
    Last Post: - 25th January 2007, 14:37

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts