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
Bookmarks