Generating 3-phase sine wave..


Closed Thread
Results 1 to 39 of 39

Hybrid View

  1. #1
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by sirvo View Post
    So, When I set timer1 to 64386 (1:1 prescaler @ 20MHz), it should interrupt at ~4.32KHz and create de 60Hz sine wave... but, it is generating a 26Hz... if I set timer1 to 65000, it decreases the 26Hz to 20Hz ... I didnt get iT! It should read the table faster, shoul'nt it?
    I'm guessing here, wild stab, since I don't see any other code here...
    It might be reading it faster, but it might be missing/skipping a Tmr1 interrupt due to how long it takes to accomplish your interrupt code.
    Try increasing the number by small amounts, see if it actually increases up to a point, and then drops off.

  2. #2
    Join Date
    Jan 2007
    Location
    Brazil
    Posts
    108


    Did you find this post helpful? Yes | No

    Default

    So, here we go..

    Didnt show var byte stuffs..

    Code:
    define  OSC 20
    
    DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
    DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
    DEFINE HSER_SPBRG 10  ' 115200 Baud @ 20MHz, -1,36%
    DEFINE HSER_CLROERR 1 ' Clear overflow automatically
    
    ' Set CCPx pins to outputs
    TRISC.2 = 0 ' CCP1 output
    TRISC.1 = 0 ' CCP2 output (could also be assigned to RB3)
    TRISB.5 = 0 ' CCP3 output
    
    ' Set CCP modules to PWM mode
    CCP1CON = %00001100 ' Mode select = PWM
    CCP2CON = %00001100 ' Mode select = PWM
    CCP3CON = %00001100 ' Mode select = PWM
    
    INTCON = %11000000
    LOAD = 64386' 4320Hz
    'LOAD = 0
    TMR1H = LOAD.HIGHBYTE
    TMR1L = LOAD.LOWBYTE
    T1CON = %00000001
    PIE1.0 = 1
    PR2 = 49
    PORTD.0 = 0
    ' Set TMR2 up for 1:1 prescale & turn it on
    T2CON = %00000100 ' TMR2 ON 1:1 prescale
    
    
    ASM
    INT_LIST macro ;IntSource, Label,    Type, ResetFlag?
        INT_Handler TMR1_INT, _Timer1,   PBP, yes 
    
        endm
        INT_CREATE ; Creates the interrupt processor
    ENDASM
    @    INT_ENABLE  TMR1_INT   ; Habilita interrupção do TMR1 
    
    
    
    MAIN: 
        IF FLAG = 1 THEN  
            flag = 0 
            CONTA = CONTA + 1
            CONTB = CONTB + 1
            CONTC = CONTC + 1
            if contA = 71 then contA = 0
            if contB = 71 then contB = 0
            if contC = 71 then contC = 0
                
            index  = conta
            GOSUB tabela
            va = v
            
            index  = contB
            GOSUB tabela
            vb = v
            
            index  = contC
            GOSUB tabela
            vc = v
            
            GOSUB SAIDA
        endif      
        GOTO MAIN
    
        
    TABELA:
        SELECT CASE DIST
        CASE 1: ' Fundamental
               LOOKUP INDEX, [100,109,118,126,135,143,151,158,165,171,177,183,187,191,195,197,199,200,200,199,198,196,193,189,185,180,175,168,162,154,147,139,130,122,113,104,96,87,78,70,61,53,46,38,32,25,20,15,11,7,4,2,1,0,0,1,3,5,9,13,17,23,29,35,42,49,57,65,74,82,91], V 
        CASE 2: ' 3 com 20%
               LOOKUP INDEX, [100,114,127,140,152,162,170,177,182,185,187,187,187,185,184,182,181,180,180,180,181,182,184,185,187,187,187,185,182,177,170,162,152,140,127,114,100,86,73,60,48,38,30,23,18,15,13,13,13,15,16,18,19,20,20,20,19,18,16,15,13,13,13,15,18,23,30,38,48,60,73,86], v
        CASE 3: ' 3 com 20% + 5 com 10%
               LOOKUP INDEX, [100,118,135,150,161,170,175,178,178,178,177,177,178,180,182,185,188,189,190,189,188,185,182,180,178,177,177,178,178,178,175,170,161,150,135,118,100,82,65,50,39,30,25,22,22,22,23,23,22,20,18,15,12,11,10,11,12,15,18,20,22,23,23,22,22,22,25,30,39,50,65,82], V
        CASE 4: ' 3 com 20% + 5 com 10% + 7 com 10%
               LOOKUP INDEX, [100,124,144,159,168,171,170,168,168,171,175,181,187,190,190,188,184,181,180,181,184,188,190,190,187,181,175,171,168,168,170,171,168,159,144,124,100,76,56,41,32,29,30,32,32,29,25,19,13,10,10,12,16,19,20,19,16,12,10,10,13,19,25,29,32,32,30,29,32,41,56,76], V
        CASE 5: ' 5 com 10% + 7 com 20%
               lookup index, [100,122,139,149,151,147,141,136,137,145,157,172,186,194,197,194,188,183,181,183,188,194,197,194,186,172,157,145,137,136,141,147,151,149,139,122,100,78,61,51,49,53,60,64,63,55,43,28,14,6,3,6,12,17,19,17,12,6,3,6,14,28,43,55,63,64,59,53,49,51,61,78], v
        CASE 6:
               return
        CASE 7:
               return 
        end select
    return
    
    SAIDA:
            CCP1CON.4 = VA.0
            CCP1CON.5 = VA.1
            CCPR1L = VA >> 2
            CCP2CON.4 = VB.0
            CCP2CON.5 = VB.1
            CCPR2L = VB >> 2
            CCP3CON.4 = VC.0
            CCP3CON.5 = VC.1            
            CCPR3L = VC >> 2
    RETURN
      
    Timer1:
        TMR1H = load.highbyte 
        TMR1L = load.lowbyte                
        FLAG = 1 
    @ INT_RETURN  
    
    END
    Sylvio,

  3. #3
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Default

    Do(does?) DT_INT's reset TMR1IF for you?

    Past that, get rid of everything else and just toggle a pin, only toggle a pin, and nothing but toggle a pin...and measure that and see what happens.

  4. #4
    Join Date
    Jan 2007
    Location
    Brazil
    Posts
    108


    Did you find this post helpful? Yes | No

    Default

    Yes, it DO (does) reset...

    I set portd.0 to toggle on timer1 interrupt and it's been working fine.. (4.2Khz)..(i didnt get rid of those stuffs)

    Then I set portd.0 to toggle inside the (if Flag = 1 then...) and it's been toggling in a frequency of 900Hz... It should be also 4Khz....

    Well, any idea?

    Thanks!
    Sylvio,

  5. #5
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by sirvo View Post
    Yes, it DO (does) reset...

    I set portd.0 to toggle on timer1 interrupt and it's been working fine.. (4.2Khz)..(i didnt get rid of those stuffs)

    Then I set portd.0 to toggle inside the (if Flag = 1 then...) and it's been toggling in a frequency of 900Hz... It should be also 4Khz....

    Well, any idea?

    Thanks!
    Are those GOSUBs and LOOKUPs still inside the Flag=1 If/Then block?

  6. #6
    Join Date
    Jan 2007
    Location
    Brazil
    Posts
    108


    Did you find this post helpful? Yes | No

    Default

    I've measured the frequency of the block (if flag = 1 then) with and without the GOSUB/LOOKUP table.. it remains still ~900Hz...

    I was thinking about the HPWM frequency generated by Timer2.. Its frequency is ~100Khz ..
    Should not it be the problem? Well, I changed it to 20Khz and still got 900Hz...



    Thanks...
    Sylvio,

  7. #7
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Default

    What does this do on PortD.0?
    Code:
    define  OSC 20
    DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
    DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
    DEFINE HSER_SPBRG 10  ' 115200 Baud @ 20MHz, -1,36%
    DEFINE HSER_CLROERR 1 ' Clear overflow automatically
    TRISC.2=0 : TRISC.1=0 : TRISB.5=0 : TRISD.0 = 0 : CCP1CON=12 : CCP2CON=12
    CCP3CON=12 : INTCON=$c0 : LOAD=64386 : TMR1H=LOAD.HIGHBYTE
    TMR1L=LOAD.LOWBYTE : T1CON=1 : PIE1.0 = 1 : PR2 = 49 : PORTD.0 = 0 : T2CON = 4
    ASM
    INT_LIST macro ;IntSource, Label,    Type, ResetFlag?
        INT_Handler TMR1_INT, _Timer1,   PBP, yes 
        endm
        INT_CREATE ; Creates the interrupt processor
    ENDASM
    @    INT_ENABLE  TMR1_INT   ; Habilita interrupção do TMR1 
    MAIN: GOTO MAIN
    Timer1: TMR1H = load.highbyte : TMR1L = load.lowbyte
         if portd.0 = 0 then
              portd.0 = 1
         else
              portd.0 = 0
         endif
    @ INT_RETURN  
    END
    My point is that it looks like your program 'flow' is jacked up and needs to be reworked.

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


    Did you find this post helpful? Yes | No

    Default

    Sylvio,

    This may sound silly, but are you sure it's a 20mhz crystal?

    A 4mhz crystal with that Timer1 reload value would give ~870 hz.
    <br>
    DT

  9. #9
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by Darrel Taylor View Post
    Sylvio,
    This may sound silly, but are you sure it's a 20mhz crystal?
    A 4mhz crystal with that Timer1 reload value would give ~870 hz.
    <br>
    For that matter, it might be running on the internal 4Mhz clock and ignoring the external completely.
    Pull the crystal out and see if it still runs at all...

  10. #10
    Join Date
    Jan 2007
    Location
    Brazil
    Posts
    108


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by skimask View Post
    What does this do on PortD.0?

    My point is that it looks like your program 'flow' is jacked up and needs to be reworked.
    I've done that. It shows 4330Hz...

    Quote Originally Posted by Darrel Taylor View Post
    Sylvio,

    This may sound silly, but are you sure it's a 20mhz crystal?

    A 4mhz crystal with that Timer1 reload value would give ~870 hz.
    <br>
    Yes, I am sure about it.. It is a 20Mhz Xtal.. Then ~900Hz is the frequency that the block (if flag = 1 ..) is running, but no the timer1 interrupt...

    Thanks !
    Sylvio,

  11. #11
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by sirvo View Post
    I've done that. It shows 4330Hz...

    Yes, I am sure about it.. It is a 20Mhz Xtal.. Then ~900Hz is the frequency that the block (if flag = 1 ..) is running, but no the timer1 interrupt...

    Thanks !
    That's why I said you're program probably needs to be reworked.
    It's spending too much time inside the 'flag if/then' updating the values, therefore it appears to not be interrupting fast enough, when it's actually trying to get everything done that you want it to do. There's just not enough instruction cycles left between interrupts to get that update accomplished.

    (let's see if anybody gets this reference)
    I guess you could call it a 1201 or a 1202 Program Alarm.

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


    Did you find this post helpful? Yes | No

    Default

    I don't know Sylvio,
    I'm running it here and I don't see the same problem.

    But then, I've got a 16F887. Apples and Oranges...

    Timer1 runs at 4khz, and the IF block executes once after each FLAG, so it runs at 4khz too.

    The whole "block" including the LOOKUP and SAIDA: takes about 70us, so it's not taking too long.

    Unless there's something in the part of the program that wasn't posted. I'm stumped.
    <br>
    DT

  13. #13
    Join Date
    Jan 2007
    Location
    Brazil
    Posts
    108


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by skimask View Post

    I guess you could call it a 1201 or a 1202 Program Alarm.
    Gosh.. hope it isn't be happening...


    Darrel, did you notice that Timer2 is also running to generate the PWM frequency?

    I will remake the wires and test if the crystal is really being used (not as internal osc..)

    Thanks a lot!
    Sylvio,

Similar Threads

  1. To Generate Sine Wave Using PCPWM of PIC18F4331 (Issue)
    By Cyborg in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 22nd March 2014, 13:39
  2. Sine wave
    By Darrenmac in forum mel PIC BASIC Pro
    Replies: 8
    Last Post: - 18th May 2009, 03:31
  3. 3 phase supply detector challenge
    By BobEdge in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 15th May 2009, 07:54
  4. 3 phase PWM with dsPIC30F2020
    By nemmard in forum mel PIC BASIC
    Replies: 1
    Last Post: - 21st January 2009, 14:19
  5. 3 phase sequencing
    By ardhuru in forum mel PIC BASIC Pro
    Replies: 14
    Last Post: - 26th May 2007, 07:35

Members who have read this thread : 1

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