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