This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
Hi ,
Is there any issue with SFRA phase measurement. I have attached SFRA plant response I obtained for PSFB using Vienna rectifier TIDM 1000 code. I edited the code for PSFB requirement for plotting SFRA. I am sensing output voltage single sample only per ISR and not averaging.
Injection amplitude is 0.01
The dc gain of 40db is correct as per theoretical calculations.
However why phase keeps on decreasing after 1kHz ( I understand that after -180, it is decreasing further and therefore jumping to 179 as tan value is same). It can be seen that phase is decreasing at a faster rate even though magnitude is constant after 200 kHz. A double pole would reduce the phase to -180 degree and will keep the phase same thereafter. But here magnitude is remaining same with no decrease indication transfer function zero, but phase starts decreasing at a faster rate. Is the phase measurement correct in SFRA.
I added a digital low pass filter with cut off frequency 10 kHz in the voltage measurement and I am getting following plot.
The addition of know pole at 10 kHz is slowing down the decrease in phase.
Hence, my doubt about phase measurement.
ISR frequency is 50 kHz.
Plant response is being plotted for perturbation around steady state duty of 0.8.
Will averaging four samples of voltage ADC value in a ISR will improve the result.
Hi,
Would you please share the configuration of 'SFRA_F32_config()' function and how are you using the 'SFRA_F32_inject()' & 'SFRA_F32_collect()' functions? Improper inputs these functions can cause erroneous results. If possible, can you please add a picture of the control loop indicating the points where are you collecting the data from? This may be happening because of too high injection amplitude. You try running the same by reducing the injection amplitude to 0.001
Regards,
Shamik
Thanks for your reply.
I am using Vienna rectifier code TID1000 . Configured the same for PSFB. Switching frequency 50 kHz.
With 0.001 I got the following. I am using actual bus voltage value for SFRA measurement.
With 0.1 I got the following.
.
===========================================================
Code is shown below:
============================================================
VIENNA_readCurrVolADCSignals();
VIENNA_dutyPU_DC = 0.8f;
VIENNA_duty4PU = VIENNA_SFRA_INJECT(VIENNA_dutyPU_DC);
VIENNA_duty5PU = 1.0f - (VIENNA_duty4PU);
VIENNA_HAL_updatePSFB_PWM(VIENNA_HIGH_FREQ_PWM4_BASE,
VIENNA_HIGH_FREQ_PWM5_BASE,
VIENNA_HIGH_FREQ_PWM6_BASE, VIENNA_HIGH_FREQ_PWM7_BASE,
VIENNA_duty4PU,
VIENNA_duty5PU,
VIENNA_duty6PU,VIENNA_duty7PU);
VIENNA_guiVbusPM_Volts = VIENNA_vBusPMMeas_pu * VIENNA_V_MAX_SENSE_VOLTS;
IL1_Amps = VIENNA_iL1Meas_pu * VIENNA_I_MAX_SENSE_AMPS;
VIENNA_SFRA_COLLECT((float32_t *)&VIENNA_duty4PU,
(float32_t *)&VIENNA_guiVbusPM_Volts);
Regards,
Neeraja
Hi,
Thanks for trying the above.
Can you help me understand few more things? Are you using PSFB hardware and trying to run the SFRA code portion of TIDM 1000 design as reference? If you are doing so, it's better to refer 'pmp23126' solution. It is the PSFB reference design and uses SFRA functionalities also.
Regards,
Shamik
Thankyou. I will refer pmp23126.
For SFRA measurement is per unit value is required for both duty and output voltage.
I am using actual output voltage. Will that make any difference.
Hi Neeraja,
Both inputs to the function VIENNA_SFRA_COLLECT() must be less than 1 i.e, they have to be converted to pu values. Else it will not work as expected.
Regards,
Shamik
When I am forcing the output value as below,
VIENNA_dutyPU_DC = 0.8f;
VIENNA_duty4PU = VIENNA_SFRA_INJECT(VIENNA_dutyPU_DC);
var1.Ref =1;
VIENNA_SFRA_COLLECT((float32_t *)&VIENNA_duty4PU,
(float32_t *)&var1.Ref);
I am getting the following response.
======================================================================================
When I force as below , output as a factor of duty I am getting below response, which is correct.
var1.Ref = VIENNA_duty4PU;
VIENNA_SFRA_COLLECT((float32_t *)&VIENNA_duty4PU,
(float32_t *)&var1.Ref);
What could be the issue in the first method ?