Changing the sines frequency?


Results 1 to 33 of 33

Threaded View

  1. #1

    Default Changing the sines frequency?

    Hi everyone,

    I'm again here with my three-phase sines.

    All works great, I can change the frequency (by varying the interrupt "timer" variable) and the amplitude of my sines (by varying the "amplitude" variable).

    But something is strange with the timer : the output sines frequency is not proportinal with the timer value. There is what I get from real experimentations :


    Of course, for the calculation of U/F variables, is far more complicated.

    So, how I can calculate the output frequency of my sines internally by the PIC?
    Or how I can change the sines frequency proportionally with an another method than varying "timer" variable?

    Thanks.

    Code :
    Code:
    ' PIC initialization
    DEFINE OSC 40      
    DEFINE LCD_DREG PORTC
    DEFINE LCD_EREG PORTD
    DEFINE LCD_RSREG PORTD
    DEFINE LCD_EBIT 0
    DEFINE LCD_RSBIT 1
    DEFINE LCD_COMMANDUS 4000
    DEFINE LCD_DATAUS 100
    DEFINE USE_LOWPRIORITY 1
    
    
    ' BAS includes
    INCLUDE "DT_INTS-18.bas"
    INCLUDE "ReEnterPBP-18.bas"
    INCLUDE "ReEnterPBP-18LP.bas"
    INCLUDE "Sine_table.bas"
    INCLUDE "Freq_table.bas"
    
    
    ' Port registers configuration
    TRISB=%11000000   ' PWM 0,1,2,3,4,5 outputs
    TRISC=%00110000   ' +/- buttons
    
    
    ' PCPWM registers configuration
    DTCON=%110        ' Deadtime (600ns)
    PTCON0=%0         ' 1:1 postscale, Fosc/4 1:1 prescale, free running mode
    PTCON1=%10000000  ' PWM time base is ON, counts up, 19.45kHz/4
    PWMCON0=%1000000  ' PWM 0,1,2,3,4,5 set in pair mode
    PWMCON1=%1        ' PWM timer sync configuration
    
    
    ' PWM calculation variables
    ustep var byte
    vstep var byte
    wstep var byte
    uduty var word
    vduty var word
    wduty var word
    timer var word
    amplitude var word
    carrier VAR word
    flag var bit
    
    
    ' Variables definition
    ustep=72          ' 360 degrees phase angle
    vstep=48          ' 240 degrees phase angle
    wstep=24          ' 120 degrees phase angle
    timer=64120       ' Timer adjust (64120=120Hz) 
    amplitude=65535   ' Sinewave amplitude adjust (65535=max amplitude)
    carrier=1023      ' Carrier frequency adjust (1023=13kHz)
    flag=%0           ' Menu flag
    
    
    ' PWM carrier frequency register configuration
    PTPERL=carrier.lowbyte  
    PTPERH=carrier.highbyte
    
      
    ' Interrupt processors 
    ASM
    INT_LIST macro
             INT_Handler TMR1_INT,_pwmint,PBP,yes
             endm
             INT_CREATE 
        
    INT_LIST_L macro
               INT_Handler TMR0_INT,_mainint,PBP,no
               endm
               INT_CREATE_L       
    ENDASM
    
        
    ' Timers configuration
    T1CON=%10000001
    T0CON=%10000111
    
    
    ' Interrupts enable
    @ INT_ENABLE TMR1_INT
    @ INT_ENABLE TMR0_INT
    
    
    ' PWM calculation and update interrupt (Timer 1) 
    pwmint:
    
    ' Timer 1 update
    TMR1L=timer.lowbyte
    TMR1H=timer.highbyte
    
    ' PWM U phase calculation
    uduty=sine[ustep]
    uduty=uduty<<4**amplitude+3
    
    ' PWM V phase calculation
    vduty=sine[vstep]
    vduty=vduty<<4**amplitude+3
    
    ' PWM W phase calculation
    wduty=sine[wstep]
    wduty=wduty<<4**amplitude+3
    
    ' PWM U, V and W update
    PDC0L=uduty.lowbyte
    PDC0H=uduty.highbyte
    PDC1L=vduty.lowbyte
    PDC1H=vduty.highbyte
    PDC2L=wduty.lowbyte
    PDC2H=wduty.highbyte
    
    ' Phase angle calculation
    ustep=ustep-1
    vstep=vstep-1
    wstep=wstep-1
    
    ' Phase angle reinitialization
    if ustep=0 then ustep=72
    if vstep=0 then vstep=72
    if wstep=0 then wstep=72
    
    @ INT_RETURN
    
    
    ' Main program loop interrupt (Timer 0)
    mainint:
    
    ' Debug display
    if flag=0 then
    LCDOUT $FE,$2,"Timer adjust :"
    LCDOUT $FE,$C0,DEC5 timer
    if PORTC.4=1 then timer=timer-1
    if PORTC.5=1 then timer=timer+1
    IF PORTC.4 AND PORTC.5=1 then flag=%1
    else
    LCDOUT $FE,$2,"Amp. adjust :"
    LCDOUT $FE,$C0,DEC5 amplitude
    if PORTC.4=1 then amplitude=amplitude-1
    if PORTC.5=1 then amplitude=amplitude+1
    endif
    
    @ INT_RETURN
    Last edited by pxidr84; - 2nd March 2011 at 14:40.

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